#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll mod = 10e9+7;

#define rep(i,n)   for(int i=(int)0; i<(int)n; i++)
#define REP(i,m,n) for(int i=(int)m; i<(int)n; i++)
#define all(var)     (var).begin(), (var).end()
#define prt(var)     cout << var << endl
#define prtd(n, var)  cout << setprecision(n) << var << endl
#define prtseq(var) cout << var << " "
#define prt2(var1, var2) cout << var1 << " " << var2 << endl
#define debug(var) cout << "---> " << var << endl


//----------------------------------------------------------------
class Grid{

  // [.] --> path, [#] --> wall
  // Grid is *RECTANGULAR*

public:
  vector<string> square;
  vector<vector<bool>> check;

  vector<vector<int>> u, d, l, r;
  Grid(int height, int width){
    initCheck(height, width);
    addSquare(height);
    initValue(height, width);
  }
  ~Grid(){}

  void initCheck(int h, int w){
    check.resize(h);
    rep(i,h){
      rep(j,w){
        check[i].push_back(false);
      }
    }
  }
  void initValue(int h, int w){
    u.resize(h);
    d.resize(h);
    r.resize(h);
    l.resize(h);
    rep(i,h){
      rep(j,w){
        u[i].push_back(1);
        d[i].push_back(1);
        r[i].push_back(1);
        l[i].push_back(1);
      }
    }
  }
  void addSquare(int h){
    rep(i,h){
      string s;
      cin >> s;
      square.push_back(s);
    }
  }

  bool isWall(int h, int w){
    if(square[h][w]=='#'){return true;}
    return false;
  }
  bool up(int h, int w){
    if(h==0){return false;}
    if(square[h-1][w]=='#'){return false;}
    if(check[h-1][w]==true){return false;}
    return true;
  }
  bool down(int h, int w){
    if(h==square.size()-1){return false;}
    if(square[h+1][w]=='#'){return false;}
    if(check[h+1][w]==true){return false;}
    return true;
  }
  bool left(int h, int w){
    if(w==0){return false;}
    if(square[h][w-1]=='#'){return false;}
    if(check[h][w-1]==true){return false;}
    return true;
  }
  bool right(int h, int w){
    if(w==square[h].size()-1){return false;}
    if(square[h][w+1]=='#'){return false;}
    if(check[h][w+1]==true){return false;}
    return true;
  }

  void dfs(int h, int w){
    check[h][w] = true;

    if(up(h,w)){dfs(h-1,w);}
    if(down(h,w)){dfs(h+1,w);}
    if(left(h,w)){dfs(h,w-1);}
    if(right(h,w)){dfs(h,w+1);}
  }

};

//--------

int main(void) {
  int h, w;
  cin >> h >> w;

  Grid g(h, w);

  rep(i,h){
    rep(j,w){
      if(g.up(i,j)){
        g.u[i][j]+=g.u[i-1][j];
      }
    }
  }
  rep(i,h){
    rep(j,w){
      if(g.down(h-i-1,j)){
        g.d[h-i-1][j]+=g.d[h-i][j];
      }
    }
  }
  rep(i,h){
    rep(j,w){
      if(g.left(i,j)){
        g.l[i][j]+=g.l[i][j-1];
      }
    }
  }
  rep(i,h){
    rep(j,w){
      if(g.right(i,w-j-1)){
        g.r[i][w-j-1]+=g.r[i][w-j];
      }
    }
  }

  int ans=0;
  rep(i,h){
    rep(j,w){
      if(g.square[i][j]=='#'){continue;}
      int tmp = g.u[i][j] + g.d[i][j] + g.l[i][j] + g.r[i][j] - 3;
      if(ans<tmp){
        ans = tmp;
      }
    }
  }
/*
  prt("up check");
  rep(i,h){
    rep(j,w){
      prtseq(g.u[i][j]);
    }
    cout << endl;
  }
  prt("down check");
  rep(i,h){
    rep(j,w){
      prtseq(g.d[i][j]);
    }
    cout << endl;
  }
  prt("left check");
  rep(i,h){
    rep(j,w){
      prtseq(g.l[i][j]);
    }
    cout << endl;
  }
  prt("right check");
  rep(i,h){
    rep(j,w){
      prtseq(g.r[i][j]);
    }
    cout << endl;
  }
*/
  prt(ans);

}


Measured memory_bytes: 69376