#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
const int N = 2e3 + 5;
int add(int a, int b) {
return (a + b) % MOD;
}
int n, m;
string s[N];
int dp[N][N]; // dp[i][j] = số cách để quân hậu đi từ ô (1, 1) đến ô (i, j)
int pref_row[N][N], pref_col[N][N], pref_diag[N][N];
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s[i];
s[i] = ' ' + s[i];
}
// naive dp
// dp[1][1] = (s[1][1] == '.');
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= m; j++) {
// // same row
// for (int k = j - 1; k >= 1; k--) {
// if (s[i][k] == '#') break;
// dp[i][j] = add(dp[i][j], dp[i][k]);
// }
// // same col
// for (int k = i - 1; k >= 1; k--) {
// if (s[k][j] == '#') break;
// dp[i][j] = add(dp[i][j], dp[k][j]);
// }
// // same diag
// for (int k = 1; k < min(i, j); k++) {
// if (s[i - k][j - k] == '#') break;
// dp[i][j] = add(dp[i][j], dp[i - k][j - k]);
// }
// }
// }
// optimized-dp using prefix sum
dp[1][1] = (s[1][1] == '.');
pref_row[1][1] = pref_col[1][1] = pref_diag[1][1] = dp[1][1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s[i][j] == '#') continue;
// same row
dp[i][j] = add(dp[i][j], pref_row[i][j - 1]);
// same col
dp[i][j] = add(dp[i][j], pref_col[i - 1][j]);
// same diag
dp[i][j] = add(dp[i][j], pref_diag[i - 1][j - 1]);
// update prefix sum
pref_row[i][j] = add(pref_row[i][j - 1], dp[i][j]);
pref_col[i][j] = add(pref_col[i - 1][j], dp[i][j]);
pref_diag[i][j] = add(pref_diag[i - 1][j - 1], dp[i][j]);
}
}
cout << dp[n][m] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgCmNvbnN0IGludCBOID0gMmUzICsgNTsgCgppbnQgYWRkKGludCBhLCBpbnQgYikgewoJcmV0dXJuIChhICsgYikgJSBNT0Q7IAp9CgppbnQgbiwgbTsgIApzdHJpbmcgc1tOXTsgCmludCBkcFtOXVtOXTsgLy8gZHBbaV1bal0gPSBz4buRIGPDoWNoIMSR4buDIHF1w6JuIGjhuq11IMSRaSB04burIMO0ICgxLCAxKSDEkeG6v24gw7QgKGksIGopCmludCBwcmVmX3Jvd1tOXVtOXSwgcHJlZl9jb2xbTl1bTl0sIHByZWZfZGlhZ1tOXVtOXTsgIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuID4+IG07ICAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWNpbiA+PiBzW2ldOyAKCQlzW2ldID0gJyAnICsgc1tpXTsgCgl9CgoJLy8gbmFpdmUgZHAKCS8vIGRwWzFdWzFdID0gKHNbMV1bMV0gPT0gJy4nKTsgICAKCgkvLyBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCS8vIAlmb3IgKGludCBqID0gMTsgaiA8PSBtOyBqKyspIHsKCS8vIAkJLy8gc2FtZSByb3cKCS8vIAkJZm9yIChpbnQgayA9IGogLSAxOyBrID49IDE7IGstLSkgewoJLy8gCQkJaWYgKHNbaV1ba10gPT0gJyMnKSBicmVhazsgCgkvLyAJCQlkcFtpXVtqXSA9IGFkZChkcFtpXVtqXSwgZHBbaV1ba10pOyAKCS8vIAkJfQoJLy8gCQkvLyBzYW1lIGNvbAoJLy8gCQlmb3IgKGludCBrID0gaSAtIDE7IGsgPj0gMTsgay0tKSB7CgkvLyAJCQlpZiAoc1trXVtqXSA9PSAnIycpIGJyZWFrOyAKCS8vIAkJCWRwW2ldW2pdID0gYWRkKGRwW2ldW2pdLCBkcFtrXVtqXSk7ICAKCS8vIAkJfQoJLy8gCQkvLyBzYW1lIGRpYWcKCS8vIAkJZm9yIChpbnQgayA9IDE7IGsgPCBtaW4oaSwgaik7IGsrKykgewoJLy8gCQkJaWYgKHNbaSAtIGtdW2ogLSBrXSA9PSAnIycpIGJyZWFrOyAKCS8vIAkJCWRwW2ldW2pdID0gYWRkKGRwW2ldW2pdLCBkcFtpIC0ga11baiAtIGtdKTsgCgkvLyAJCX0KCS8vIAl9CgkvLyB9CgoJLy8gb3B0aW1pemVkLWRwIHVzaW5nIHByZWZpeCBzdW0KCWRwWzFdWzFdID0gKHNbMV1bMV0gPT0gJy4nKTsgIAoJcHJlZl9yb3dbMV1bMV0gPSBwcmVmX2NvbFsxXVsxXSA9IHByZWZfZGlhZ1sxXVsxXSA9IGRwWzFdWzFdOyAgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgaisrKSB7CgkJCWlmIChzW2ldW2pdID09ICcjJykgY29udGludWU7ICAKCQkJLy8gc2FtZSByb3cgCgkJCWRwW2ldW2pdID0gYWRkKGRwW2ldW2pdLCBwcmVmX3Jvd1tpXVtqIC0gMV0pOyAKCQkJLy8gc2FtZSBjb2wgCgkJCWRwW2ldW2pdID0gYWRkKGRwW2ldW2pdLCBwcmVmX2NvbFtpIC0gMV1bal0pOyAKCQkJLy8gc2FtZSBkaWFnIAoJCQlkcFtpXVtqXSA9IGFkZChkcFtpXVtqXSwgcHJlZl9kaWFnW2kgLSAxXVtqIC0gMV0pOyAKCgkJCS8vIHVwZGF0ZSBwcmVmaXggc3VtICAKCQkJcHJlZl9yb3dbaV1bal0gPSBhZGQocHJlZl9yb3dbaV1baiAtIDFdLCBkcFtpXVtqXSk7ICAKCQkJcHJlZl9jb2xbaV1bal0gPSBhZGQocHJlZl9jb2xbaSAtIDFdW2pdLCBkcFtpXVtqXSk7ICAgCgkJCXByZWZfZGlhZ1tpXVtqXSA9IGFkZChwcmVmX2RpYWdbaSAtIDFdW2ogLSAxXSwgZHBbaV1bal0pOyAKCQl9Cgl9Cgljb3V0IDw8IGRwW25dW21dIDw8ICdcbic7IAp9