#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

#define swap(a, b)    do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while(0)
#define repd(i, a, b) for(typeof(b) i = a; i < (b); ++i)
#define rep(i, n)     repd(i, 0, n)
#define dump(x)       cerr << #x << " = " << (x) << endl
#define debug(x)      cerr << "L" << __LINE__ << ": " << #x << " = " << (x) << endl
#define YesNo(x)      cout << ((x) ? "Yes" : "No") << endl
#define YESNO(x)      cout << ((x) ? "YES" : "NO") << endl
#define absi(x)       ( ((x) >= 0) ? (x) : (-(x)) )

class modint {
private:
	std::int64_t number;
	static const std::int64_t modulo;
public:
	static vector<modint> fac;
	static vector<modint> fac_inv;
	modint() : number(0) {}
	modint(const std::uint64_t new_number) { set(new_number); }
	modint(const modint& m) : number(m.number) {}

	void set(const std::int64_t new_number) { number = new_number % modulo; if(number < 0) number += modulo; }
	std::int64_t get() const { return number; }

	modint operator++(int) { modint ret = *this; ++(*this); return ret; } // Postfix Increment
	modint operator--(int) { modint ret = *this; --(*this); return ret; } // Postfix Decrement
	modint& operator++() { *this += 1; return *this; } // Prefix Increment
	modint& operator--() { *this -= 1; return *this; } // Prefix Decrement

	bool operator!() const noexcept { return !static_cast<bool>(*this); } // Logical Not
	modint operator+() const { return *this; }                                 // Unary Plus
	modint operator-() const { modint ret(*this);ret.set(-number);return ret;} // Unary Negation
	explicit operator std::int64_t() const noexcept{ return number; }      // Cast
	explicit operator bool()         const noexcept{ return number != 0; } // Cast

	modint& operator=(const std::int64_t i) { set(i); return *this; }

	modint operator*=(const modint& m) { set(number * m.number); return *this; }
	modint operator/=(const modint& m) { *this *= modint::inv(m); return *this; }
	modint operator%=(const modint& m) { set(number % m.number); return *this; }
	modint operator+=(const modint& m) { set(number + m.number); return *this; }
	modint operator-=(const modint& m) { set(number - m.number); return *this; }
	modint operator*=(const std::int64_t& i) { set(number * i); return *this; }
	modint operator/=(const std::int64_t& i) { *this /= modint(i); return *this; }
	modint operator%=(const std::int64_t& i) { set(number % i); return *this; }
	modint operator+=(const std::int64_t& i) { set(number + i); return *this; }
	modint operator-=(const std::int64_t& i) { set(number - i); return *this; }

	static modint pow(const modint& m1, const modint& m2) {
		std::int64_t base     = m1.get();
		std::int64_t exponent = m2.get();
		std::int64_t ret = 1;

		//if(exponent == 0)      return modint(1);
		//else if(exponent == 1) return modint(base);
		//else if(base == 0)     return modint(0);
		//else if(base == 1)     return modint(1);

		while(exponent > 0) {
			if(exponent & 1) ret = (ret * base) % modulo;
			base = (base * base) % modulo;
			exponent >>= 1;
		}

		return modint(ret);
	}

	/* Inverse Element */
	static modint inv(const modint& m) {
		std::int64_t a = m.get();
		std::int64_t b = modulo;
		std::int64_t u = 1;
		std::int64_t v = 0;

		std::int64_t aa = a;

		while(b != 0) {
			std::int64_t t = a / b;
			a -= t * b;
			swap(a, b);
			u -= t * v;
			swap(u, v);
		}

		modint ret(u);
		return ret;
	}

	static modint nCr(const modint& n, const modint& r);
	static void init_nCr();
};

const std::int64_t modint::modulo = 1000000007;
vector<modint> modint::fac;
vector<modint> modint::fac_inv;
/* Arithmetic */
const modint operator*(const modint& m1, const modint& m2) { return modint(m1) *= m2; }
const modint operator/(const modint& m1, const modint& m2) { return modint(m1) /= m2; }
const modint operator%(const modint& m1, const modint& m2) { return modint(m1) %= m2; }
const modint operator+(const modint& m1, const modint& m2) { return modint(m1) += m2; }
const modint operator-(const modint& m1, const modint& m2) { return modint(m1) -= m2; }
const modint operator*(const modint& m, const std::int64_t& i) { return modint(m) *= i; }
const modint operator/(const modint& m, const std::int64_t& i) { return modint(m) /= i; }
const modint operator%(const modint& m, const std::int64_t& i) { return modint(m) %= i; }
const modint operator+(const modint& m, const std::int64_t& i) { return modint(m) += i; }
const modint operator-(const modint& m, const std::int64_t& i) { return modint(m) -= i; }
const modint operator*(const std::int64_t& i, const modint& m) { return modint(i) *= m; }
const modint operator/(const std::int64_t& i, const modint& m) { return modint(i) /= m; }
const modint operator%(const std::int64_t& i, const modint& m) { return modint(i) %= m; }
const modint operator+(const std::int64_t& i, const modint& m) { return modint(i) += m; }
const modint operator-(const std::int64_t& i, const modint& m) { return modint(i) -= m; }
/* Shift (iostream) */
std::ostream& operator<<(std::ostream& os, const modint m) { os << m.get(); return os; }
std::istream& operator>>(std::istream& is, modint& m) { std::int64_t i; is >> i; m.set(i); return is; }
/* Compare */
bool operator<(const modint& m1, const modint& m2) { return m1.get() < m2.get(); }
bool operator>(const modint& m1, const modint& m2) { return m2 < m1; }
bool operator<=(const modint& m1, const modint& m2) { return !(m1 > m2); }
bool operator>=(const modint& m1, const modint& m2) { return !(m1 < m2); }
bool operator==(const modint& m1, const modint& m2) { return !(m1 < m2) && !(m1 > m2); }
bool operator!=(const modint& m1, const modint& m2) { return !(m1 == m2); }
/* Power (evil implementation) */
modint operator^(const modint& m1, const modint& m2) { return modint::pow(m1, m2); };

ll h, w;
vector<vector<char>> grid;
vector<vector<modint>> result;
vector<vector<bool>> is_searched;

modint dfs(ll i, ll j) {
	if(is_searched[i][j]) return result[i][j];
	is_searched[i][j] = true;
	if(grid[i][j] == '#') return result[i][j] = 0;
	return result[i][j] = dfs(i+1, j) + dfs(i, j+1);
}

int main(int argc, const char* argv[]) {
	cin >> h >> w;
	grid        = vector<vector<char>>  (h + 1, vector<char>  (w + 1, '#'));
	result      = vector<vector<modint>>(h + 1, vector<modint>(w + 1, modint(0)));
	is_searched = vector<vector<bool>>  (h + 1, vector<bool>  (w + 1, false));
	rep(i, h) {
		string s;
		cin >> s;
		rep(j, w) {
			grid[i][j] = s[j];
		}
	}

	is_searched[h-1][w-1] = true;
	     result[h-1][w-1] = 1;

	cout << dfs(0, 0) << endl;

	return 0;
}
























Measured memory_bytes: 9472