#include <bits/stdc++.h>
using namespace std;
int R, C;
char B[504][504];
int PS[504][504];
bool trace;
bool all_black(int sr, int sc, int er, int ec) {
  return PS[er][ec] - PS[er][sc - 1] - PS[sr - 1][ec] + PS[sr - 1][sc - 1] ==
         (er - sr + 1) * (ec - sc + 1);
}
char pattern[2][2];
char memo[9][504][504];
char go(int level, int sr, int sc) {
  if (level == 0) {
    for (int i = 0, _n = (2); i < _n; ++i)
      for (int j = 0, _n = (2); j < _n; ++j)
        if (B[sr + i][sc + j] != pattern[i][j]) return false;
    return true;
  }
  char& res = memo[level][sr][sc];
  if (res < 0) {
    res = 1;
    int N2 = 1 << level;
    for (int i = 0, _n = (2); i < _n; ++i)
      for (int j = 0, _n = (2); j < _n; ++j) {
        if (pattern[i][j] == '*') {
          if (!all_black(sr + i * N2, sc + j * N2, sr + i * N2 + N2 - 1,
                         sc + j * N2 + N2 - 1)) {
            res = 0;
          }
          if (trace) {
            cerr << "* level:" << level << " sr:" << sr << " sc:" << sc
                 << " i:" << i << " j:" << j
                 << " res:" << (res ? "true" : "false") << endl;
          }
        } else {
          res = res && go(level - 1, sr + i * N2, sc + j * N2);
          if (trace)
            cerr << "* level:" << level << " sr:" << sr << " sc:" << sc
                 << " i:" << i << " j:" << j
                 << " res:" << (res ? "true" : "false") << endl;
        }
      }
  }
  return res;
}
int main(int argc, char* argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> R >> C;
  for (int r = (1), _b = (R); r <= _b; ++r) cin >> (B[r] + 1);
  for (int r = (1), _b = (R); r <= _b; ++r) {
    for (int c = (1), _b = (C); c <= _b; ++c) {
      PS[r][c] = PS[r][c - 1] + PS[r - 1][c] - PS[r - 1][c - 1];
      if (B[r][c] == '*') ++PS[r][c];
    }
  }
  int res = 0;
  for (int mask = 0, _n = (1 << 4); mask < _n; ++mask) {
    pattern[0][0] = (mask & (1 << 0)) ? '*' : '.';
    pattern[0][1] = (mask & (1 << 1)) ? '*' : '.';
    pattern[1][0] = (mask & (1 << 2)) ? '*' : '.';
    pattern[1][1] = (mask & (1 << 3)) ? '*' : '.';
    memset(memo, -1, sizeof(memo));
    for (int level = (1), _b = (8); level <= _b; ++level) {
      int N = 1 << (level + 1);
      for (int sr = (1), _b = (R - N + 1); sr <= _b; ++sr)
        for (int sc = (1), _b = (C - N + 1); sc <= _b; ++sc) {
          if (trace) {
            for (int i = 0, _n = (2); i < _n; ++i) {
              for (int j = 0, _n = (2); j < _n; ++j) cerr << pattern[i][j];
              cerr << endl;
            }
          }
          if (go(level, sr, sc)) {
            ++res;
          }
        }
    }
  }
  cout << res << '\n';
  return 0;
}
