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 <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define REP(i, n) for(int i = 0; i < (int)(n); ++i)
typedef long long ll;

int H, W;
char buf[410][410];
bool visited[410][410];

const int DI[4] = {1, 0, -1, 0};
const int DJ[4] = {0, 1, 0, -1};

pair<int,int> go(int r, int c) {
  pair<int,int> res(0, 0);
  if(!visited[r][c]) {
    visited[r][c] = true;
    if(buf[r][c] == '#') {
      res.first++;
    } else {
      res.second++;
    }
    REP(d, 4) {
      int nr = r + DI[d];
      int nc = c + DJ[d];
      if(nr >= 0 && nc >= 0 && nr < H && nc < W && buf[r][c] != buf[nr][nc]) {
        pair<int,int> cur = go(nr, nc);
        res.first += cur.first;
        res.second += cur.second;
      }
    }
  }
  return res;
}

int main(void) {
  scanf("%d%d", &H, &W);
  REP(i, H) {
    scanf("%s", buf[i]);
  }
  ll res = 0;
  REP(i, H) REP(j, W) {
    pair<int,int> cur = go(i, j);
    res += cur.first * ll(cur.second);
  }
  cout << res << endl;

  return 0;
}