#include <iostream>
#include <complex>
#include <sstream>
#include <string>
#include <algorithm>
#include <deque>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
#include <set>
#include <limits>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, j) for(int i = 0; i < (int)(j); ++i)
#define FOR(i, j, k) for(int i = (int)(j); i < (int)(k); ++i)
#define SORT(v) sort((v).begin(), (v).end())
#define REVERSE(v) reverse((v).begin(), (v).end())
typedef pair<int, int> P;
#define h first
#define p second

int H, W;
vector<string> field;
vector< vector<int> > cnt;

void init(){
  cnt = vector< vector<int> >(H, vector<int>(W, 0));
  REP(i, W) cnt[0][i] = (field[0][i] == '.' ? 1 : 0);
  FOR(y, 1, H) REP(x, W) cnt[y][x] = (field[y][x] == '*' ? 0 : cnt[y - 1][x] + 1);
}

int solve(vector<int> cnt){
  cnt.push_back(0);
  vector<P> v;
  int res = 0;
  //for(int n : cnt) cout <<n <<", "; cout <<endl;
  REP(i, cnt.size()){
    if(v.empty() || v.back().h < cnt[i]) v.push_back(P(cnt[i], i));
    else if(v.back().h > cnt[i]){
      int next_p = i;
      while(!v.empty() && v.back().h >= cnt[i]){
        P now = v.back(); v.pop_back();
        //cout <<"!  h = " <<now.h <<", w = " <<(i - now.p) <<endl;
        res = max(res, now.h * (i - now.p));
        next_p = now.p;
      }
      v.push_back(P(cnt[i], next_p));
    }
  }
  return res;
}

int main() {
  while(cin >>H >>W && H && W){
    field = vector<string>(H);
    REP(i, H) cin >>field[i];
    init();
    int res = 0;
    REP(i, H) res = max(res, solve(cnt[i]));
    cout <<res <<endl;
  }
  return 0;
}