#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
#if defined(_MSC_VER) || defined(ONLINE_JUDGE)
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#endif
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define FOR(i, m, n) for(int i=(m); i<(n); ++i)
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define pb push_back
#define dump(x) cerr << #x << " = " << (x) << endl;
using LL=long long;        using VS=vector<string>;
using VI=vector<int>;      using VL=vector<LL>;
using VVI=vector<VI>;      using VVL=vector<VL>;
using PII=pair<int, int>;  using PLL=pair<LL, LL>;
const int inf = (int)1e9;  const double pi = acos(-1.0);
const LL MOD = 1000000007; const string Snum = "0123456789";
const int dx[] = { -1,0,1,0,-1,-1,1,1 }, dy[] = { 0,1,0,-1,-1,1,-1,1 };
template<class T>void Sort(T& a) { sort(a.begin(), a.end()); }
template<class T>void ReSort(T& a) { sort(a.rbegin(), a.rend()); }
template<class T>void Reverse(T& a) { reverse(a.begin(), a.end()); }
template<class T>void Unique(T& a) { a.erase(unique(a.begin(), a.end()), a.end()); }
template<class T>auto Max(const T& a) { return *max_element(a.begin(), a.end()); }
template<class T>auto Min(const T& a) { return *min_element(a.begin(), a.end()); }
template<class T, class U>int Count(const T& a, U c) { return count(a.begin(), a.end(), c); }
template<class T, class U>U Sum(const T& a, U init = 0) { return accumulate(a.begin(), a.end(), init); }
template<class T>T Age(T a, T b) { return (a + b - 1) / b; }
template<class T>T gcd(T n, T m) { return m == 0 ? n : gcd(m, n % m); }
template<class T>T lcm(T n, T m) { return n / gcd(n, m) * m; }

/* INPUT */
char InputCharFast() {
	char ret, c = getchar_unlocked();
	while (c != '\0' && c != '\n' && c != '\t' && c != ' ') { ret = c; c = getchar_unlocked(); }
	return ret;
}
string InputStringFast() {
	string ret; char c = getchar_unlocked();
	while (c != '\0' && c != '\n' && c != '\t' && c != ' ') { ret.push_back(c); c = getchar_unlocked(); }
	return ret;
}
string InputLineFast() {
	string ret; char c = getchar_unlocked();
	while (c != '\0' && c != '\n') { ret.push_back(c); c = getchar_unlocked(); }
	return ret;
}
int InputIntFast() {
	int ret = 0; bool neg = false; char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while ('0' <= c && c <= '9') { ret = ret * 10 + (c - '0'); c = getchar_unlocked(); }
	return neg ? -ret : ret;
}
LL InputLLFast() {
	LL ret = 0; bool neg = false; char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while ('0' <= c && c <= '9') { ret = ret * 10LL + (LL(c) - LL('0')); c = getchar_unlocked(); }
	return neg ? -ret : ret;
}
double InputDoubleFast() {
	double ret = 0, dp = 1; bool neg = false, adp = false;
	char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while (('0' <= c && c <= '9') || c == '.') {
		if (c == '.')adp = true;
		else if (adp) { dp *= 0.1; ret += (c - '0') * dp; }
		else { ret = ret * 10 + (c - '0'); }
		c = getchar_unlocked();
	}
	return neg ? -ret : ret;
}
struct InputChar {
	operator char() { return InputCharFast(); }
}inc;
struct InputString {
	operator string() { return InputStringFast(); }
	string l() { return InputLineFast(); }
	VS v(int n) { VS ret(n); rep(i, n)ret[i] = InputStringFast(); return ret; }
}ins;
struct InputInt {
	operator int() { return InputIntFast(); }
	VI v(int n) { VI ret(n); rep(i, n)ret[i] = InputIntFast(); return ret; }
	VVI vv(int n, int m) { VVI ret(n, VI(m)); rep(i, n)rep(j, m)ret[i][j] = InputIntFast(); return ret; }
}ini;
struct InputLL {
	operator LL() { return InputLLFast(); }
	VL v(int n) { VL ret(n); rep(i, n)ret[i] = InputLLFast(); return ret; }
	VVL vv(int n, int m) { VVL ret(n, VL(m)); rep(i, n)rep(j, m)ret[i][j] = InputLLFast(); return ret; }
}inl;
struct InputDouble {
	operator double() { return InputDoubleFast(); }
	vector<double> v(int n) { vector<double> ret(n); rep(i, n)ret[i] = InputDoubleFast(); return ret; }
}ind;

/* OUTPUT */
class ostreamfbuff : public std::basic_streambuf<char, std::char_traits<char>> {
protected:int overflow(int nCh = EOF) { putchar_unlocked(nCh); return 0; }
};
class ostreamf : public std::basic_iostream<char, std::char_traits<char>> {
public:ostreamf(void) : std::basic_iostream<char, std::char_traits<char>>(new ostreamfbuff()) {}
};
ostreamf coutf;
ostream& operator << (ostream& ostr, InputString i) { ostr << string(i); return ostr; }
struct boolswitch { string t, f; boolswitch(string tr, string fa) :t(tr), f(fa) {} }yes("yes", "no"), Yes("Yes", "No"), YES("YES", "NO"), Yay("Yay!", ":(");
struct divizer { string s; divizer(string s_) :s(s_) {} }spc(" "), nosp(""), comma(","), lin("\n");
struct outputter {
	bool flag = false; boolswitch bs; divizer di;
	outputter(bool f, boolswitch b, divizer d) :flag(f), bs(b), di(d) {}
	template<class T>outputter operator ,(T o) {
		if (flag)coutf << di.s; coutf << o;
		outputter t(true, bs, di); return t;
	}
	outputter operator ,(double o) {
		if (flag)coutf << di.s; printf("%.20f", o);
		outputter t(true, bs, di); return t;
	}
	outputter operator ,(bool o) {
		if (flag)coutf << di.s; coutf << (o ? bs.t : bs.f);
		outputter t(true, bs, di); return t;
	}
	template<class T> outputter operator ,(vector<T> o) {
		if (flag)coutf << di.s;
		for (int i = 0; i < (int)o.size(); ++i)coutf << o[i] << (i == (int)o.size() - 1 ? "" : di.s);
		outputter t(true, bs, di); return t;
	}
	template<class T, class U> outputter operator ,(pair<T, U> o) {
		if (flag)coutf << di.s; coutf << o.first << " " << o.second;
		outputter t(true, bs, di); return t;
	}
	outputter operator ,(outputter o) { coutf << '\n'; return o; }
	outputter operator ,(boolswitch b) { outputter t(flag, b, di); return t; }
	outputter operator ,(divizer d) { outputter t(flag, bs, d); return t; }
}out(false, Yes, spc);

/* ANSWER */
struct Answer {
	int mini = INT_MAX, maxi = INT_MIN, sumi = 0;
	LL minl = LLONG_MAX, maxl = LLONG_MIN, suml = 0LL;
	double mind = DBL_MAX, maxd = DBL_MIN, sumd = 0.;
	bool flag = false, flagt = true, lastb = false; int sumb = 0;
	int count = 0;
	void operator =(int n) { mini = min(mini, n); maxi = max(maxi, n); sumi += n; count++; }
	void operator =(LL n) { minl = min(minl, n); maxl = max(maxl, n); suml += n; count++; }
	void operator =(double n) { mind = min(mind, n); maxd = max(maxd, n); sumd += n; count++; }
	void operator =(bool n) { flag = flag | n; flagt = n ? flagt : false; lastb = n;  sumb += n; count++; }
}ans;

int main() {
	int h = ini, w = ini;
	VS s = ins.v(h);

	VVI u(h, VI(w)), d(h, VI(w)), l(h, VI(w)), r(h, VI(w));

	//up
	rep(i, w)u[h - 1][i] = s[h - 1][i] == '.';
	for (int i = h - 2; i >= 0; --i)
		rep(j, w)u[i][j] = (s[i][j] == '.') ? u[i + 1][j] + 1 : 0;

	//down
	rep(i, w)d[0][i] = s[0][i] == '.';
	FOR(i, 1, h)
		rep(j, w)d[i][j] = (s[i][j] == '.') ? d[i - 1][j] + 1 : 0;

	//left
	rep(i, h)l[i][0] = s[i][0] == '.';
	FOR(i, 1, w)
		rep(j, h)l[j][i] = (s[j][i] == '.') ? l[j][i - 1] + 1 : 0;

	//right
	rep(i, h)r[i][w - 1] = s[i][w - 1] == '.';
	for (int i = w - 2; i >= 0; --i)
		rep(j, h)r[j][i] = (s[j][i] == '.') ? r[j][i + 1] + 1 : 0;

	rep(i, h)rep(j, w)
		ans = u[i][j] + d[i][j] + l[i][j] + r[i][j] - 3;

	out, ans.maxi, out;
}

Measured memory_bytes: 67200