#include <bits/stdc++.h>
using namespace std;

const int MAXN = 105;

short dp[MAXN][MAXN][MAXN][MAXN], f[MAXN][MAXN], g[MAXN][MAXN], n, m;
char str[MAXN];

inline void update(short &a, short b)
{ a = max(a, b); }

inline short min(int a, short b)
{ return min((short)a, b);}
int main()
{
	cin >> n >> m;
	short x, y;
	for (int i = 1; i <= n; i++) {
		cin >> str+1;
		for (int j = 1; j <= m; j++) {
			if (str[j] == 'E') x = i, y = j;
			else if (str[j] == 'o') f[i][j] = g[j][i] = 1;
		}
	}
	short lenx = max(x-1, n-x), leny = max(y-1, m-y);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			f[i][j] += f[i][j-1];
	for (int j = 1; j <= m; j++)
		for (int i = 1; i <= n; i++)
			g[j][i] += g[j][i-1];
	short ans = 0;
	for (short i = x; i >= 1; i--)
		for (short j = x; j <= n && j-i <= lenx; j++)
			for (short k = y; k >= 1; k--)
				for (short w = y; w <= m && w-k <= leny; w++) {
					short R = min(m+k-y, w), L = max(k-1, w-y);
					if (L < R) {
						if (i-1 >= 1 && j-i+1 <= x-1)
							update(dp[i-1][j][k][w], dp[i][j][k][w]+f[i-1][R]-f[i-1][L]);
						if (j+1 <= n && j-i+1 <= n-x)
							update(dp[i][j+1][k][w], dp[i][j][k][w]+f[j+1][R]-f[j+1][L]);
					}
					R = min(n+i-x, j), L = max(i-(short)1, j-x);
					if (L < R) {
						if (k-1 >= 1 && w-k+1 <= y-1)
							update(dp[i][j][k-1][w], dp[i][j][k][w]+g[k-1][R]-g[k-1][L]);
						if (w+1 <= m && w-k+1 <= m-y)
							update(dp[i][j][k][w+1], dp[i][j][k][w]+g[w+1][R]-g[w+1][L]);
					}
					ans = max(ans, dp[i][j][k][w]);
				}
	cout << ans << endl;
	return 0;
}
