Problem: 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

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define forx(i, a, b) for (int i = (a); i < (b); i++)
#define rep(i, n) for (int i = 0; i < (n); i++)

ll ans = 0, black = 0, white = 0;
int starti = 0, startj = 0;
char c[410][410]={'x'};

void dfs(int i,int j,char k){
    if(c[i][j]!=k||c[i][j]=='x')
        return;

    char l = '#';
    if(k=='#'){
        l = '.';
        black++;
    }
    else
        white++;

    c[i][j] = 'x';

    dfs(i - 1, j, l);
    dfs(i + 1, j, l);
    dfs(i, j + 1, l);
    dfs(i, j - 1, l);

    if(starti==i&&startj==j){
        ans += white * black;
        white = 0;
        black = 0;
    }
}



int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    int h, w;
    cin >> h >> w;

    
    rep(i, h) rep(j, w) cin >> c[i+1][j+1];

    forx(i,1,h+1)forx(j,1,w+1){
        starti = i;
        startj = j;
        dfs(i, j,c[i][j]);
    }
    cout << ans << endl;

    return 0;
}