There is a grid with H rows and W columns, where each square is painted black or white.

You are given H strings S_1, S_2, ..., S_H, each of length W. If the square at the i-th row from the top and the j-th column from the left is painted black, the j-th character in the string S_i is `#`; if that square is painted white, the j-th character in the string S_i is `.`.

Find the number of pairs of a black square c_1 and a white square c_2 that satisfy the following condition:

* There is a path from the square c_1 to the square c_2 where we repeatedly move to a vertically or horizontally adjacent square through an alternating sequence of black and white squares: black, white, black, white...

Constraints

* 1 \leq H, W \leq 400
* |S_i| = W (1 \leq i \leq H)
* For each i (1 \leq i \leq H), the string S_i consists of characters `#` and `.`.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

Print the answer.

Examples

Input

3 3
.#.
..#
#..


Output

10


Input

3 3
.#.
..#
..


Output

10


Input

2 4
....
....


Output

0


Input

4 3


...


Output

6
import java.util.*;

class Main{
	public static void main(String[] $){
		Scanner s=new Scanner(System.in);
		
		int h=s.nextInt(),w=s.nextInt();
		char[][]f=new char[h][w];
		for(int i=0;i<h;++i)
			f[i]=s.next().toCharArray();
		
		UF uf=new UF(h*w);
		
		long[]white=new long[h*w];
		long[]black=new long[h*w];
		
		for(int i=0;i<h;++i) {
			for(int j=0;j<w;++j) {
				for(int d=0;d<4;++d){
					int y=i+dy[d];
					int x=j+dx[d];
					if(0<=y&&y<h&&0<=x&&x<w&&f[i][j]!=f[y][x])
						uf.connect(i*w+j,y*w+x);
				}
			}
		}
		
		for(int i=0;i<h;++i) {
			for(int j=0;j<w;++j) {
				(f[i][j]=='.'?white:black)[uf.root(i*w+j)]++;
			}
		}
		
		long r=0;
		for(int i=0;i<h*w;++i) {
			if(uf.root(i)==i) {
				r+=white[i]*black[i];
			}
		}
		System.out.println(r);
	}
	static int[] dx= {0,1,0,-1};
	static int[] dy= {1,0,-1,0};
}


class UF{
	public int[] uni;
	public UF(int size){
		Arrays.fill(uni=new int[size],-1);
	}
	public int root(int t){
		return uni[t]<0?t:(uni[t]=root(uni[t]));
	}
	public boolean connect(int p,int c){
		p=root(p);
		c=root(c);
		if(p==c)
			return false;
		if(uni[p]>uni[c]){
			int buf=c;
			c=p;
			p=buf;
		}
		uni[p]+=uni[c];
		uni[c]=p;
		return true;
	}
	public boolean isConnected(int a,int b){
		return root(a)==root(b);
	}
	public int groupSize(int t){
		return -uni[root(t)];
	}
}
