#include<stdio.h>
#include<utility>
#include<list>
#include<algorithm>
#include<functional>
using namespace std;
typedef pair<int,int> CellType;
class Delete:public binary_function<CellType,CellType,bool>
{
public:
	bool operator ()(CellType lhv, CellType rhv)const
	{
	return 
		(lhv.first > rhv.first && lhv.second >= rhv.second) || 
		(lhv.first >= rhv.first && lhv.second > rhv.second) ;
	}
};

int main()
{
	int h,w,i,j,k;
	const int N = 500;
	char m[N][N];

	static list<CellType> memo[N+1][N+1];
	list<CellType>::iterator ite;
	while(scanf("%d%d",&h,&w), w)
	{
		for(i = 0; i < h; ++i)
			scanf("%s",m[i]);
		int c, maxS = 0;
		for(c = i = 0;i < h; ++i)
		{
			memo[i][0].clear();
			if(m[i][0] == '.')
				memo[i][0].push_back( make_pair(++c,1) ), maxS = max(maxS,c);
			else
				c=0;
		}
		for(c = j = 0; j < w; ++j)
		{
			memo[0][j].clear();
			if(m[0][j] == '.')
				memo[0][j].push_back( make_pair(1, ++c) ), maxS = max(maxS,c);
			else
				c = 0;
		}

		for(i = 1; i < h; ++i)
		{
			for(j = 1; j < w; ++j)
			{
				memo[i][j].clear();
				if(m[i][j] != '.') continue;

				bool isLeftMarked = memo[i][j-1].empty(),
					isTopMarked = memo[i-1][j].empty();
				int iLimit,jLimit;
				for(iLimit = 1, k = i-1; k>=0; --k,++iLimit)
				{
					if(m[k][j] != '.')
						break;
				}
				for(jLimit = 1, k = j-1; k>=0; --k,++jLimit)
				{
					if(m[i][k] != '.')
						break;
				}

				if(isLeftMarked && isTopMarked)
					memo[i][j].push_back( make_pair(1,1) );
				else if( isLeftMarked )
				{
					memo[i][j].push_back(make_pair(c,1));
					maxS = max(maxS, c);
				}
				else if( isTopMarked )
				{
					memo[i][j].push_back(make_pair(1,c));
					maxS = max(maxS, c);
				}
				else
				{
					for(ite = memo[i-1][j].begin(); ite != memo[i-1][j].end(); ++ite)
						memo[i][j].push_back(
							make_pair( min(ite->first+1,iLimit), min(ite->second,jLimit))
						);
					for(ite = memo[i][j-1].begin(); ite != memo[i][j-1].end(); ++ite)
						memo[i][j].push_back(
							make_pair( min(ite->first,iLimit), min(ite->second+1,jLimit))
						);
					memo[i][j].sort();
					memo[i][j].unique();
					for(ite = memo[i][j].begin(); ite != memo[i][j].end(); )
					{
						if(find_if(
							memo[i][j].begin(), memo[i][j].end(), bind2nd(Delete(), *ite))
							!=memo[i][j].end()
							)
							ite = memo[i][j].erase(ite);
						else
						{
							maxS = max(maxS, ite->first * ite->second);
							++ite;
						}
					}
				}
			}
		}
		printf("%d\n",maxS);
	}
	return 0;
}