import java.util.*;
import java.lang.*;
import java.io.*;
public class Main{
    static FastScanner sc = new FastScanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
    public static void main (String[] args) throws Exception {
        int n=sc.nextInt();
        int m=sc.nextInt();


        char grid[][] = new char[n][m];

        for(int i=0;i<n;i++){
            char str[]=sc.nextLine().toCharArray();
            for(int j=0;j<m;j++){
                grid[i][j]=str[j];
            }
        }

        long dp[][] =new long[n][m];
        long mod=(long)Math.pow(10,9)+7;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='#'){
                    dp[i][j]=0;
                }
                else{
                    if(i==0 && j==0) dp[i][j]=1;
                    else if(i==0){
                        dp[i][j]=dp[i][j-1];
                    }
                    else if(j==0){
                        dp[i][j]=dp[i-1][j];
                    }
                }
            }
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                
                if(grid[i][j]!='#'){
                    if(grid[i-1][j]!='#') dp[i][j]=(dp[i][j]+dp[i-1][j])%mod;

                    if(grid[i][j-1]!='#') dp[i][j]=(dp[i][j]+dp[i][j-1])%mod;

                }

            }
        }
        // for(int i=0;i<n;i++){
        //     out.println(Arrays.toString(dp[i]));

        // }

        out.println(dp[n-1][m-1]);


        out.close();


    }    
    
}
class FastScanner
{

    final private int BUFFER_SIZE = 1 << 17;
    private DataInputStream din;
    private byte[] buffer;
    private int bufferPointer, bytesRead;

    public FastScanner(InputStream in)
    {
        din = new DataInputStream(in);
        buffer = new byte[BUFFER_SIZE];
        bufferPointer = bytesRead = 0;
    }
    public String nextLine() throws Exception
    {
        StringBuffer sb = new StringBuffer("");
        byte c = read();
        while (c <= ' ') c = read();
        do
        {
            sb.append((char)c);
            c = read();
        }
        while(c > ' ');
        return sb.toString();
    }

    public char nextChar() throws Exception
    {
        byte c = read();
        while(c <= ' ') c = read();
        return (char)c;
    }

    public int nextInt() throws Exception
    {
        int ret = 0;
        byte c = read();
        while (c <= ' ') c = read();
        boolean neg = c == '-';
        if (neg) c = read();
        do
        {
            ret = ret * 10 + c - '0';
            c = read();
        }
        while (c > ' ');
        if (neg) return -ret;
        return ret;
    }

    public long nextLong() throws Exception
    {
        long ret = 0;
        byte c = read();
        while (c <= ' ') c = read();
        boolean neg = c == '-';
        if (neg) c = read();
        do
        {
            ret = ret * 10 + c - '0';
            c = read();
        }
        while (c > ' ');
        if (neg) return -ret;
        return ret;
    } 

    private void fillBuffer() throws Exception
    {
        bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
        if (bytesRead == -1) buffer[0] = -1;
    }

    private byte read() throws Exception
    {
        if (bufferPointer == bytesRead) fillBuffer();
        return buffer[bufferPointer++];
    }
    public double nextDouble() throws Exception
    {
        double ret = 0, div = 1;
        byte c = read();
        while (c <= ' ')
            c = read();
        boolean neg = (c == '-');
        if (neg)
            c = read();

        do
        {
            ret = ret * 10 + c - '0';
        }
        while ((c = read()) >= '0' && c <= '9');

        if (c == '.')
        {
            while ((c = read()) >= '0' && c <= '9')
            {
                ret += (c - '0') / (div *= 10);
            }
        }

        if (neg)
            return -ret;
        return ret;
    }

    
}




Measured memory_bytes: 52164