#include <bits/stdc++.h>
using namespace std;
inline long long labs(long long a) { return a < 0 ? (-a) : a; }
template <typename T>
inline T sqr(T x) {
  return x * x;
}
const int MAXN = 501;
const int MAXMASK = 16;
const int BLACK = 15;
const int MAXSZ = 10;
int mas[MAXN][MAXN];
bool dp[MAXMASK][MAXSZ][MAXN][MAXN];
int n, m;
int calc(int mask) {
  int p[2][2];
  p[0][0] = (mask >> 0) & 1;
  p[0][1] = (mask >> 1) & 1;
  p[1][0] = (mask >> 2) & 1;
  p[1][1] = (mask >> 3) & 1;
  for (int(i) = 0; (i) < (n - 1); (i)++) {
    for (int(j) = 0; (j) < (m - 1); (j)++) {
      dp[mask][1][i][j] =
          1 && p[0][0] == mas[i][j] && p[0][1] == mas[i][j + 1] &&
          p[1][0] == mas[i + 1][j] && p[1][1] == mas[i + 1][j + 1];
    }
  }
  int res = 0;
  for (int sz = 2; (1 << sz) <= min(n, m); sz++) {
    int pl = 1 << (sz - 1);
    for (int(i) = 0; (i) < (n + 1 - (1 << sz)); (i)++) {
      for (int(j) = 0; (j) < (m + 1 - (1 << sz)); (j)++) {
        dp[mask][sz][i][j] = 1 && dp[p[0][0] ? BLACK : mask][sz - 1][i][j] &&
                             dp[p[0][1] ? BLACK : mask][sz - 1][i][j + pl] &&
                             dp[p[1][0] ? BLACK : mask][sz - 1][i + pl][j] &&
                             dp[p[1][1] ? BLACK : mask][sz - 1][i + pl][j + pl];
        res += dp[mask][sz][i][j];
      }
    }
  }
  return res;
}
int main() {
  cin >> n >> m;
  memset((dp), 0, sizeof(dp));
  for (int(i) = 0; (i) < (n); (i)++) {
    for (int(j) = 0; (j) < (m); (j)++) {
      char c;
      cin >> c;
      mas[i][j] = (c == '*');
    }
  }
  int res = 0;
  for (int mask = BLACK; mask >= 0; mask--) {
    res += calc(mask);
  }
  cout << res << endl;
  return 0;
}
