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

template <typename T> void setmax(T& a, T b) { if (b > a) a = b; }

using i64 = int64_t;

const int MOD = 1e9 + 7;

const int MAXN = 1010;
const int MAXM = 1010;
int N, M;
char G[MAXN][MAXM];

const int MAXV = MAXN * MAXM;
int V;
int par[MAXV];
int ways[MAXV];
void reset() {
	for (int v = 0; v < V; v++) {
		par[v] = -1;
		ways[v] = 1;
	}
}
int getPar(int a) {
	return par[a] < 0 ? a : (par[a] = getPar(par[a]));
}
void merge(int a, int b) {
	a = getPar(a), b = getPar(b);
	if (a == b) return;
	if (a > b) swap(a, b);
	ways[a] = i64(ways[a]) * ways[b] % MOD;
	par[b] = a;
}

int vert(int i, int j) {
	return i * M + j;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		cin >> G[i];
	}

	V = N * M;
	reset();

	for (int i = N-1; i >= 0; i--) {
		for (int j = 0; j < M; j++) {
			if (i+1 < N && G[i][j] == '.' && G[i+1][j] == '.') {
				merge(vert(i, j), vert(i+1, j));
			}
			if (j+1 < M && G[i][j] == '.' && G[i][j+1] == '.') {
				merge(vert(i, j), vert(i, j+1));
			}
		}

		for (int j = 0; j < M; j++) {
			if (G[i][j] == '.' && getPar(vert(i, j)) == vert(i, j)) {
				ways[vert(i, j)]++;
			}
		}
	}

	int ans = 1;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (G[i][j] == '.' && getPar(vert(i, j)) == vert(i, j)) {
				ans = i64(ans) * ways[vert(i, j)] % MOD;
			}
		}
	}
	cout << ans << '\n';

	return 0;
}
