Suppose that you are in a campus and have to go for classes day by day. As you may see, when you hurry to a classroom, you surprisingly find that many seats there are already occupied. Today you and your friends went for class, and found out that some of the seats were occupied.

The classroom contains n rows of seats and there are m seats in each row. Then the classroom can be represented as an n × m matrix. The character '.' represents an empty seat, while '*' means that the seat is occupied. You need to find k consecutive empty seats in the same row or column and arrange those seats for you and your friends. Your task is to find the number of ways to arrange the seats. Two ways are considered different if sets of places that students occupy differs.

Input

The first line contains three positive integers n,m,k (1 ≤ n, m, k ≤ 2 000), where n,m represent the sizes of the classroom and k is the number of consecutive seats you need to find.

Each of the next n lines contains m characters '.' or '*'. They form a matrix representing the classroom, '.' denotes an empty seat, and '*' denotes an occupied seat.

Output

A single number, denoting the number of ways to find k empty seats in the same row or column.

Examples

Input

2 3 2
**.
...


Output

3


Input

1 2 2
..


Output

1


Input

3 3 4
.*.
*.*
.*.


Output

0

Note

In the first sample, there are three ways to arrange those seats. You can take the following seats for your arrangement. 

  * (1,3), (2,3) 
  * (2,2), (2,3) 
  * (2,1), (2,2) 

import java.io.*;
import java.util.*;



public class Round460 
{
	
	
	static IOut in=new IOut(System.in);
	public static void main(String[] args) throws Exception
	{
		solveC();
	}
	static LinkedList<Integer>[] list;
	static String st;
	static int vert;
	static int[][] dp;
	private static void solveD() throws Exception 
	{
		// TODO Auto-generated method stub
		int n=in.nextInt();
		vert=n;
		int m=in.nextInt();
		st=in.next();
		list=new LinkedList[n+1];
		dp=new int[n+1][26];
		int[] indegree=new int[n+1];
		for(int i=1;i<=n;i++)
		{
			list[i]=new LinkedList<Integer>();
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<26;j++)
			{
				dp[i][j]=-1;
			}
		}
		HashSet<Index> set=new HashSet<Index>();
		for(int i=0;i<m;i++)
		{
			int u=in.nextInt();
			int v=in.nextInt();
			Index ind=new Index();
			ind.remainingItems=u;
			ind.remainingWeights=v;
			if(u!=v && !set.contains(ind))
			{
				list[u].add(v);
				indegree[v]++;
				
				set.add(ind);
			}
		}
		//System.out.println(Arrays.toString(indegree));
		Queue<Integer> q=new LinkedList<Integer>();
		for(int i=1;i<=n;i++)
		{
			if(indegree[i]==0)
			{
				q.add(i);
			}
		}
		//System.out.println(q.size());
		int cnt=0;
		int[] ord=new int[n];
		
		while(!q.isEmpty())
		{
			int curr=q.poll();
			//System.out.println(curr);
			ord[cnt]=curr;
			cnt++;
			for(int end:list[curr])
			{
				if(--indegree[end]==0)
					q.add(end);
			}
		}
		//System.out.println(cnt);
		if(cnt!=n)
		{
			System.out.println(-1);
		}
		else
		{
			int ans = 0;
			for(int i = 0;i < 26;i++)
			{
				int[] dp = new int[n+1];
				for(int j = 0;j < n;j++)
				{
					int cur = ord[j];
					if(st.charAt(cur-1) == 'a'+i)
					{
						dp[cur]++;
					}
					ans = Math.max(ans, dp[cur]);
					for(int e : list[cur])
					{
						dp[e] = Math.max(dp[e], dp[cur]);
					}
				}
			}

			System.out.println(ans);
		}
	}
	
	private static int getMax(int u, int j)
	{
		if(dp[u][j]>=0)return dp[u][j];
		dp[u][j]=0;
		for(int v:list[u])
		{
			dp[u][j]=Math.max(dp[u][j], getMax(v, j));
		}
		if(st.charAt(u-1)-'a'==j)dp[u][j]++;
		return dp[u][j];
	}

	private static void solveC() throws Exception 
	{
		// TODO Auto-generated method stub
		int n=in.nextInt();
		int m=in.nextInt();
		int k=in.nextInt();
		char[][] arr=new char[n][m];
		for(int i=0;i<n;i++)
		{
			arr[i]=in.next().toCharArray();
		}
		
		int ans=0;
		for(int i=0;i<n;i++)
		{
			int cnt=0;
			ArrayList<Integer> list=new ArrayList<Integer>();
			for(int j=0;j<m;j++)
			{
				if(arr[i][j]=='.')cnt++;
				else 
				{
					list.add(cnt);
					cnt=0;
				}
			}
			list.add(cnt);
			for(int l:list)
			{
				//System.out.println("l:"+l);
				if(l>=k)ans+=l-k+1;
			}
		}
		//System.out.println(ans);
		for(int i=0;i<m;i++)
		{
			int cnt=0;
			ArrayList<Integer> list=new ArrayList<Integer>();
			for(int j=0;j<n;j++)
			{
				if(arr[j][i]=='.')cnt++;
				else 
				{
					list.add(cnt);
					cnt=0;
				}
			}
			list.add(cnt);
			for(int l:list)
			{
				if(l>=k)ans+=l-k+1;
			}
		}
		if(k==1)ans/=2;
		System.out.println(ans);
	}

}
class IOut
{
    static byte[] buf = new byte[2048];
    static int index, total;
    static InputStream in;
    static StringBuilder sb = new StringBuilder();
    
 
    IOut(InputStream is)
    {
        in = is;
    }
 
    int scan() throws Exception
    {
        if(index>=total){
            index = 0;
            total = in.read(buf);
            if(total<=0)
                return -1;
        }
        return buf[index++];
    }
 
    String next() throws Exception
    {
        int c;
        for(c=scan(); c<=32; c=scan());
        StringBuilder sb = new StringBuilder();
        for(; c>32; c=scan())
            sb.append((char)c);
        return sb.toString();
    }
 
    int nextInt() throws Exception
    {
        int c, val = 0;
        for(c=scan(); c<=32; c=scan());
        boolean neg = c=='-';
        if(c=='-' || c=='+')
            c = scan();
        for(; c>='0' && c<='9'; c=scan())
            val = (val<<3) + (val<<1) + (c&15);
        return neg?-val:val;
    }
    
    long nextLong() throws Exception
    {
        int c;long val = 0;
        for(c=scan(); c<=32; c=scan());
        boolean neg = c=='-';
        if(c=='-' || c=='+')
            c = scan();
        for(; c>='0' && c<='9'; c=scan())
            val = (val<<3) + (val<<1) + (c&15);
        return neg?-val:val;
    }
    
    void print(long a)
    {
        sb.append(a);
    }
    
    void println(long a)
    {
        sb.append(a).append("\n");
    }
    
    void print(double a)
    {
        sb.append(a);
    }
    
    void println(double a)
    {
        sb.append(a).append("\n");
    }
    
    void print(String a)
    {
        sb.append(a);
    }
    void println(String a)
    {
        sb.append(a).append("\n");
    }
    
    void print(char a)
    {
        sb.append(a);
    }
    
    void println(char a)
    {
        sb.append(a).append("\n");
    }
    void println()
    {
        sb.append("\n");
    }
    void flush()
    {
        System.out.print(sb);
    }
}
class Index
{
	int remainingWeights;
	int remainingItems;
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(this==obj)return true;
		if(obj==null || getClass() !=obj.getClass())return false;
		
		Index index=(Index)obj;
		
		if(remainingWeights!=index.remainingWeights)return false;
		return remainingItems==index.remainingItems;
	}
	
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		int result=remainingWeights;
		result=31*result+remainingItems;
		return result;
	}
}
