#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define flash                         \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL)
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define repc(i, a, b, c) for (ll i = a; (c > 0 ? i < b : i > b) and c != 0; i += c)
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define endl '\n'
#define all(name) (name.begin(), name.end())
#define fact(n) rep(i, 1, n + 1) ft.pb((ft[i - 1] * i) % mod);
#define mod_in(a) power(a, mod - 2)
#define ncr(n, r) ((ft[n] * mod_in((ft[r] * ft[(n) - (r)]) % mod)) % mod)
#define deb(x) cout << #x << " " << x << endl;
#define answ(x, y) cout << "Case #" << x << ": " << y << endl;
vector<bool> is_prime(1000, 1);
ll gcd(ll a, ll b)
{
    if (a == 0)
        return b;

    return gcd(b % a, a);
}
void sieve()
{
    is_prime[0] = is_prime[1] = 0;
    for (int i = 2; i * i <= 1000; i++)
        if (is_prime[i])
            repc(j, i * i, 1000, i) is_prime[j] = 0;
}
// pair<ll, ll> d[mod];
// ll h[mod];
// vector<ll> edge[mod];

// void dfs(ll u, ll pair = -1)
// {
//     for (auto i : edge[u])
//     {
//         if (i == pair)
//             continue;
//         h[i] = h[u] + 1;
//         dfs(i, u);
//         d[u].first += d[i].first + 1;
//     }
// }

bool cmp(pair<ll, ll> c, pair<ll, ll> b)
{
    return c.second - c.first > b.second - b.first;
}
// ll power(ll x, ll y)
// {
//     ll res = 1;
//     x %= mod;
//     while (y > 0)
//     {
//         if (y & 1)
//             res = (res * x) % mod;
//         y = y >> 1;
//         x = (x * x) % mod;
//     }
//     return res % mod;
// }

// void bfs(int st,vector<ll> d){
//     queue<int> q;
//     d[st]=0;
//     q.push(st);
//     while(!q.empty()){
//         int v=q.front();
//         q.pop();
//         for(auto it:edge[v]){
//             if(d[it]==mod){
//                 d[it]=d[v]+1;
//                 q.push(it);
//             }
//         }
//     }
// }
//using namespace std;
// const ll man=1e5 +5;
// vector<ll> edge[man];
// vector<ll> dp(man);
// bool visited[man];
// ll coming[man];
// ll dfs(ll a){
//     if(edge[a].size()==0){
//         cout<<"a is "<<a<<endl;
//         return dp[a]=1;
//     }
//     visited[a]=1;
//     for(ll i=0;i<edge[a].size();i++){
//         cout<<"edge[a][i] is "<<edge[a][i]<<endl;
//         if(visited[edge[a][i]]==0){

//             dp[a]=max(dfs(edge[a][i])+1,dp[a]);
//         }
//     }
// }
// void dfs(ll a){
//     visited[a]=true;
//     for(auto b:edge[a]){
//         dp[b]=max(dp[b],dp[a]+1);
//         --coming[b];
//         if(coming[b]==0){
//             dfs(b);
//         }
//     }
// }
int main()
{
    long long int i, j, k, o, n, m;
    cin >> n >> m;
    //ll a[n+1][m+1];
    ll dp[n + 1][m + 1];
    for (i = 1; i <= n; i++)
    {
        string s;
        cin >> s;
        for (j = 1; j <= s.length(); j++)
        {
            if (s[j-1] == '.')
            {
                dp[i][j] = 0;
            }
            else
            {
                //a[i][j] = -1;
                dp[i][j]=-1;
            }
        }
    }
    ll mod =1e9+7;
    
    dp[0][0] = 0;
    for(i=0;i<=n;i++){
        dp[i][0]=-1;
    }
    for(i=0;i<=m;i++){
        dp[0][i]=-1;
    }
    for (i = 1; i <=n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            //cout<<"i is "<<i<<" j is "<<j<<endl;
            //cout<<"pre is "<<dp[i][j-1]<<" up is "<<dp[i-1][j];
            if(i==1 && j==1){
                dp[i][j]=1;
            }
            else if (dp[i][j] != -1)
            {
                if(dp[i-1][j]==-1){
                    if(dp[i][j-1]==-1){
                        dp[i][j]=-1;
                    }
                    else{
                        dp[i][j]=dp[i][j-1]%mod;
                    }
                }
                else{
                    if(dp[i][j-1]==-1){
                        dp[i][j]=dp[i-1][j]%mod;
                    }
                    else{
                        dp[i][j]=dp[i-1][j]%mod+dp[i][j-1]%mod;
                    }
                }

                // if((a[i-1][j]==-1 || j==m) && (a[i][j-1]==-1 || i==n)){
                //     if(j!=m || i!=n){
                //         dp[i][j]=-1;
                //     }
                // }
                // else if (a[i-1][j] == -1 || j==m)
                // {
                //     dp[i][j]=max(dp[i][j-1]+1,dp[i-1][j]);
                // }
                // else if(a[i][j-1]==-1 || i==n){
                //     dp[i][j]=max(dp[i][j-1],(dp[i-1][j]+1));
                // }
                // else{
                //     dp[i][j]=min(dp[i][j-1]*2,dp[i-1][j]*2);
                // }
                // if(a[i][j-1]==-1 || j==0){
                //     if(a[i-1][j]==-1 || i==0){
                //         dp[i][j]=-1;
                //     }
                //     else{
                //         dp[i][j]=dp[i-1][j];
                //     }
                // }
                // else{

                // }
            }
            //cout<<"dp is "<<dp[i][j]<<endl;
        }
    }
    // for(i=0;i<=n;i++){
    //     for(j=0;j<=m;j++){
    //         cout<<"i is "<<i<<" j is "<<j<<"dp is "<<dp[i][j]<<endl;
    //     }
    // }
    if(dp[n][m]==-1){
        dp[n][m]=0;
    }
    cout<<dp[n][m]%mod<<endl;
}

Measured memory_bytes: 8064