#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Nmax = 2e2 + 5;
char arr[Nmax][Nmax];
int h[Nmax];
int l[Nmax], r[Nmax];
stack<int> stk;
void left(int n) {
while (!stk.empty()) stk.pop();
for (int i = 1; i <= n; ++i) {
while (!stk.empty() && h[i] <= h[stk.top()]) stk.pop();
if (stk.empty()) l[i] = 0;
else {
l[i] = stk.top();
}
stk.push(i);
}
}
void right(int n) {
while (!stk.empty()) stk.pop();
for (int i = n; i >= 1; --i) {
while (!stk.empty() && h[i] <= h[stk.top()]) stk.pop();
if (stk.empty()) r[i] = n + 1;
else {
r[i] = stk.top();
}
stk.push(i);
}
}
signed main() {
freopen("bmatrix.in", "r", stdin);
freopen("bmatrix.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
}
}
int ans = 0;
for (int k = 1; k < n; ++k) {
int max1 = 0;
int max2 = 0;
for (int i = 1; i <= k; ++i) {
for (int j = 1; j <= m; ++j) {
if (arr[i][j] == '1') {
h[j] = 0;
}
else {
h[j]++;
}
}
left(m); right(m);
for (int j = 1; j <= m; ++j) {
max1 = max(max1, (h[j] * (r[j] - l[j] - 1)));
}
}
for (int j = 1; j <= m; ++j) {
h[j] = 0;
}
for (int i = k + 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (arr[i][j] == '1') {
h[j] = 0;
}
else {
h[j]++;
}
}
left(m); right(m);
for (int j = 1; j <= m; ++j) {
max2 = max(max2, (h[j] * (r[j] - l[j] - 1)));
}
}
for (int j = 1; j <= m; ++j) {
h[j] = 0;
}
ans = max(ans, max1 + max2);
}
cout << ans << endl;
}