#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;

struct rect { int height; int pos; };

int solve(int Size, int buffer[]) {
	stack<rect>S;
	int maxv = 0;
	buffer[Size] = 0;

	for (int i = 0; i <= Size; i++) {
		rect Rect;
		Rect.height = buffer[i];
		Rect.pos = i;
		if (S.empty()) {
			S.push(Rect);
		}
		else {
			if (S.top().height < Rect.height) {
				S.push(Rect);
			}
			else if (S.top().height>Rect.height) {
				int TARGET = i;
				while (!S.empty() && S.top().height >= Rect.height) {
					rect pre = S.top(); S.pop();
					int area = pre.height*(i - pre.pos);
					maxv = max(maxv, area);
					TARGET = pre.pos;
				}
				Rect.pos = TARGET;
				S.push(Rect);
			}
		}
	}
	return maxv;
}

#define MAX 2000

int H, W;
int buffer[MAX][MAX];
int T[MAX][MAX];

int hantei() {
	for (int j = 0; j < W; j++) {
		for (int i = 0; i < H; i++) {
			if (buffer[i][j] == 1) {
				T[i][j] = 0;
			}
			else {
				T[i][j] = (i>0) ? T[i - 1][j] + 1 : 1;
			}
		}
	}
	int maxv = 0;
	for (int i = 0; i < H; i++) {
		maxv = max(maxv, solve(W, T[i]));
	}
	return maxv;
}

int main() {
	while (true) {
		memset(buffer, 0, sizeof(buffer));
		memset(T, 0, sizeof(T));
		cin >> H >> W;
		if (H == 0 && W == 0) { break; }
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				char c;
				cin >> c;
				if (c == '.') { buffer[i][j] = 0; }
				else { buffer[i][j] = 1; }
			}
		}
		cout << hantei() << endl;
	}
}