// ebaefektiivne lahendus variantide läbivaatusega

#include <iostream>
using namespace std;

const int maxr = 10;
const int maxs = 10;

int r, s; // kaardi mõõdud
char a[maxr][maxs]; // kaart
int n = 0; // leitud variantide arv

// otsib võimalusi liikuda edasi kaardi ruudult i,j
void otsi(int i, int j) {
	if (i == r - 1 && j == s - 1) {
		// kui oleme lõpuruudul, loendame lahendusvariandi
		++n;
		return;
	}
	// ruut pole enam vaba
	a[i][j] = 'X';
	// vaatleme kõiki naabreid, mis on olemas ja vabad
	if (i > 0 && a[i - 1][j] == '.') {
		otsi(i - 1, j);
	}
	if (i < r - 1 && a[i + 1][j] == '.') {
		otsi(i + 1, j);
	}
	if (j > 0 && a[i][j - 1] == '.') {
		otsi(i, j - 1);
	}
	if (j < s - 1 && a[i][j + 1] == '.') {
		otsi(i, j + 1);
	}
	// tagrudus: vabastame ruudu
	a[i][j] = '.';
}

int main() {
	cin >> r >> s;
	for (int i = 0; i < r; ++i) {
		for (int j = 0; j < s; ++j) {
			cin >> a[i][j];
		}
	}
	if (a[0][0] == '.' && a[r - 1][s - 1] == '.') {
		// kui algus- ja lõpuruut on vabad, otsime teid
		otsi(0, 0);
	}
	cout << n % 10007 << endl;
	return 0;
}
