#include <bits/stdc++.h>
#include <time.h>
#include <assert.h>


using namespace std;


#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
 
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// s.order_of_key(x);           // gives order of x in the set


#define For(i,x,n)  for(long long i=x;i<n;i++)
#define MOD 1000000007
#define PI 3.141592653589793
#define INF 999999999999999999
#define N 1000005
#define ll long long
#define ld long double
#define pb insert
#define mp make_pair
#define fi first
#define se second
#define sp " "
#define cont continue
#define brk break

#define deb1(x)                cout<<#x<<": "<<x<<endl
#define deb2(x, y)             cout<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define deb3(x, y, z)          cout<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define deb4(a, b, c, d)       cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define deb5(a, b, c, d, e)    cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define deb6(a, b, c, d, e, f) cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl
#define nCr(n, r)              fact[n]/(fact[n-r]*fact[r])

using namespace std;



void setprime(ll n=15000002);
ll choose(ll n,ll k);
void showArray(ll a[], ll n);
ll gcd(ll a, ll b);
ld len(ld x1, ld y1, ld x2, ld y2);
ld gcd_ld(ld x, ld y);
ll power(ll x, ll n);
ll power1(ll x,ll n);

ll cnt = 0;
set<ll> st;
ll n,m;


int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cout<<fixed;
    cout<<setprecision(3);
    srand(time(NULL));

    
    ll n,m;
    cin>>n>>m;
    ll a[n][m];
    string s;
    For(i,0,n){
        cin>>s;
        For(j,0,m)
        {
            if(s[j]=='#')
                a[i][j]=1;
            else
                a[i][j]=0;
        }
    }
    ll horleft[n][m],horright[n][m];
    ll vertop[n][m],verbot[n][m];
    ll cnt = 0;
    For(i,0,n){
        cnt = 0;
        For(j,0,m){
            if(a[i][j]==0){
                cnt++;
                horleft[i][j] = cnt;
            }
            else{
                cnt = 0;
                horleft[i][j] = 0;
            }
        }
    }
    cnt = 0;
    For(i,0,n){
        cnt = 0;
        for(ll j=m-1 ; j>=0 ; j--){
            if(a[i][j] == 0){
                cnt++;
                horright[i][j] = cnt;
                // if(i==2 and j==7)
                // deb4(i,j,horright[i][j],cnt);
            }
            else{
                cnt = 0;
                horright[i][j] = 0;
            }
        }
    }
    cnt = 0;
    For(j,0,m){
        cnt = 0;
        For(i,0,n){
            if(a[i][j]==0){
                cnt++;
                vertop[i][j]=cnt;
            }
            else{
                cnt = 0;
                vertop[i][j]=0;
            }
        }
    }
    cnt = 0;
    For(j,0,m){
        cnt = 0;
        for(ll i=n-1 ; i>=0 ; i--){
            if(a[i][j] == 0){
                cnt++;
                verbot[i][j] = cnt;
            }
            else{
                cnt = 0;
                verbot[i][j] = cnt;
            }
        }
    }
    ll ans = 0;
    For(i,0,n){
        For(j,0,m){
            if(a[i][j]==0){
                ll tmp = 0;
                tmp = (verbot[i][j]+vertop[i][j]+horright[i][j]+horleft[i][j]-3);
                if(tmp > ans){
                    ans = tmp;
                    // deb2(i,j);
                    // deb4(verbot[i][j],vertop[i][j],horleft[i][j],horright[i][j]);
                }
            }
        }
    }
    cout<<ans;
    
    //cout<<"\nTime used = "<<static_cast<double>(clock())/(CLOCKS_PER_SEC)<<"s"<<endl;  // - for checking time used for a test case
    return 0;
}

//s1.substr(1,3) - return 3 characters starting from position 1 as substring of string sz1. eg sz1="shreynumh" sz1.substr(2,5)="reyan"
//num = atoi(s.c_str()); //convert string s to integer num
//n.erase(i,std::string::npos); //erase i th position in string n , decreasing string size
//s.find(b)!= std::string::npos - finds string b in string a - true if found
//cout<<"Time used = "<<static_cast<double>(clock())/(CLOCKS_PER_SEC)<<"s"<<endl;  // - for checking time used for a test case


void setprime(ll isprime[],ll n,ll cc=0)
{
    isprime[1]=1;
    map<ll,ll> hm;
    ll i;
    for(i=2 ; i*i<=15000002 ; i++)
        if(isprime[i]==0){
            for(ll j=2*i ; j<=15000001 ; j+= i)
                if(isprime[j]==0)
                    isprime[j]=i;
            isprime[i]=i;
            hm[i] = cc;
            cc++;
        }
    for( ; i<15000002 ; i++)
        if(isprime[i]==0)
            isprime[i]=i,hm[i]=cc,cc++;
}

ll choose(ll n,ll k)
{
    if(k==0)  return 1;
    return (n* choose(n-1,k-1))/k;
}

void showArray(ll a[], ll n){
    For(i,0,n){
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

ll gcd(ll a, ll b)
{
    if(b==0)
        return a;
    return gcd(b,a%b);
}

ld len(ld x1, ld y1, ld x2, ld y2){
    return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}

ld gcd_ld(ld x, ld y) {
    ld eps=0.0001;
    while (fabs(x) > eps && fabs(y) > eps) {
        if (x > y)
                x -= floor(x / y) * y;
        else
                y -= floor(y / x) * x;
    }
    return x + y;
}

ll power(ll x,ll n)
{
    if(n==0)
        return 1;
    else if(n%2 == 0)        //n is even
        return (power((x*x)%MOD,n/2))%MOD;
    else                             //n is bal
        return (x*power((x*x)%MOD,(n-1)/2))%MOD;
}

ll power1(ll x,ll n)
{
    ll num = 1;
    For(i,0,n){
        num = (num*x)%MOD;
    }
    return num;
}                

Measured memory_bytes: 156544