#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
 
#define ll long long int
#define fast ios_base::sync_with_stdio(false)
#define fast_input cin.tie(NULL)
#define fast_output cout.tie(NULL)
#define vi vector<long long int> 
#define vp vector<pair<long long int ,long long int>>
#define pb push_back
#define mp make_pair
#define pp pop_back
#define iter vector<int>::iterator
#define pa pair<long long int ,long long int> 
#define f(a,b) for(int a=0;a<b;a++)
#define fe(d,e) for(auto d:e)
#define mod 1000000007
#define F first
#define S second
#define sett set<long long int>
#define um unordered_map<ll,ll>
#define ordered_set tree<pa, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
// ll mul(ll a,ll b)
// {
// 	return (a%mod*b%mod)%mod;
// }
// ll add(ll a,ll b)
// {
// 	ll res=a+b;
// 	if(res>=mod)
// 	{
//       res-=mod;
// 	}
// 	return res;
// }
// ll sub(ll a,ll b)
// {
// 	ll res=a-b;
// 	if(res<0)
// 	 res+=mod;
// 	return res;
// }
ll powmod(ll a, ll b)
{
    ll res = 1;
    while (b) {
        if (b&1) {
            res =res*a;
        }
        b >>= 1;
        a=a*a;
    }
 
    return res;
}
 
// ll modinv(ll a)
// {
//     return powmod(a, mod - 2);
// }
//  unordered_map<ll,ll>facti;
//  ll fact(ll n)
//  {
// 	if(n==0)return 1;
// 	if(n<=1)return 1;
// 	if(facti[n]!=0)return facti[n];
// 	return facti[n]=mul(n,fact(n-1));
//  }
//   ll ncr(ll n,ll r)
//   {
//         ll h=fact(n);
// 	ll v=fact(r);
// 	ll j=fact(n-r);
// 	v=mul(v,j);
// 	v=powmod(v,mod-2);
// 	return mul(h,v);
//  }
// int fastread(){
//     int x=0;
//     int c = getchar_unlocked();
//     while(c<48)
//         c = getchar_unlocked();
//     while(c>=48){
//         x = x*10 + (c - 48);
//         c = getchar_unlocked();
//     }
//     return x;
// }
// priority_queue<pa,vector<pa>,greater<pa>>q; used fo min heap


// dsu


// ll par[1000001];
// ll siz[1000001];
// ll find(ll i)
// {
//     if(par[i]!=i)
//     {
//         return par[i]=find(par[i]);
//     }
//     return i;
// }
// void dounion(ll i,ll j)
// {
//     ll p1=find(i);
//     ll p2=find(j);
//     if(siz[p1]>=siz[p2])
//     {
//         par[p2]=p1;
//     }
//     else
//     {
//         par[p1]=p2;
//     }
//     if(siz[p1]==siz[p2])
//     {
//         siz[p2]++;//siz is rank of a parent
//     }
// }



///ends here////
//  vector<vector<int>>pref(200,vector<int>(200001));
void solve()
{
   ll n,m;
   cin>>n>>m;
   ll dp[n+1][m+1];   
   vector<string>v(n);
   f(i,n)
   {
       cin>>v[i];
   }
   f(i,n+1)
   {
       dp[i][0]=0;
   }
   f(i,m+1)
   {
       dp[0][i]=0;
   }
   dp[1][1]=1;
   for(int i=1;i<=n;i++)
   {
       for(int j=1;j<=m;j++)
       {
          if(i==1&&j==1)
           continue;
          if(v[i-1][j-1]=='#')
          {
              dp[i][j]=0;
          }
          else
          {
              dp[i][j]=dp[i-1][j]+dp[i][j-1];
              dp[i][j]%=mod;
          }  
       }
   }
   cout<<dp[n][m];
}
int main() {
	fast;
	fast_input;
	fast_output;
	// ll t;
	// cin>>t;
	// f(i,t)
	// {
    //   cout<<"Case #"<<i+1<<":"<<" ";
	     solve();
	// }
	return 0;
}

Measured memory_bytes: 9088