Problem: There are some coins in the xy-plane. The positions of the coins are represented by a grid of characters with H rows and W columns. If the character at the i-th row and j-th column, s_{ij}, is `#`, there is one coin at point (i,j); if that character is `.`, there is no coin at point (i,j). There are no other coins in the xy-plane.

There is no coin at point (x,y) where 1\leq i\leq H,1\leq j\leq W does not hold. There is also no coin at point (x,y) where x or y (or both) is not an integer. Additionally, two or more coins never exist at the same point.

Find the number of triples of different coins that satisfy the following condition:

* Choosing any two of the three coins would result in the same Manhattan distance between the points where they exist.



Here, the Manhattan distance between points (x,y) and (x',y') is |x-x'|+|y-y'|. Two triples are considered the same if the only difference between them is the order of the coins.

Constraints

* 1 \leq H,W \leq 300
* s_{ij} is `#` or `.`.

Input

Input is given from Standard Input in the following format:


H W
s_{11}...s_{1W}
:
s_{H1}...s_{HW}


Output

Print the number of triples that satisfy the condition.

Examples

Input

5 4
#.##
.##.
#...
..##
...#


Output

3


Input

5 4
.##
.##.
...
..##
...#


Output

3


Input

13 27
......#.........#.......#..
...#.....###..
..............#####...##...
...#######......#...#######
...#.....#.....###...#...#.
...#######....#.#.#.#.###.#
..............#.#.#...#.#..
.#.#.#...###..
...........#...#...#######
..#######..#...#...#.....#
..#.....#..#...#...#.###.#
..#######..#...#...#.#.#.#
..........##...#...#.#####


Output

870

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
template<class T> using V = vector<T>;
template<class T, class U> using P = pair<T, U>;
using vll = V<ll>;
using vvll = V<vll>;
#define rep(i, k, n) for (ll i=k; i<(ll)n; ++i)
#define REP(i, n) rep(i, 0, n)

const ll MOD = (ll)1e9 + 7;
const ll HIGHINF = (ll)1e18;

ll h, w, res;
vvll a(666, vll(666)), hs(666, vll(666)), vs(666, vll(666));
V<string> s(333);

int main() {
  cin >> h >> w;
  REP(i, h) {
    cin >> s.at(i);
    REP(j, w) if (s.at(i).at(j)=='#') a.at(i+j+1).at(i-j+300) = 1;
  }
  rep(i,1,600) rep(j,1,600) {
    hs.at(i).at(j) += a.at(i).at(j) + hs.at(i).at(j-1);
    vs.at(i).at(j) += a.at(i).at(j) + vs.at(i-1).at(j);
  }
  rep(i,1,600) rep(j,1,600) rep(k,j+1,600) {
    int d = k-j;
    if (a.at(i).at(j) && a.at(i).at(k)) {
      if (i-d>=0) {
        res += hs.at(i-d).at(k) - hs.at(i-d).at(j-1);
        res -= a.at(i-d).at(j) + a.at(i-d).at(k);
      }
      if (i+d<=600) {
        res += hs.at(i+d).at(k) - hs.at(i+d).at(j-1);
        res -= a.at(i+d).at(j) + a.at(i+d).at(k);
      }
    }
    if (a.at(j).at(i) && a.at(k).at(i)) {
      if (i-d>=0) res += vs.at(k).at(i-d) - vs.at(j-1).at(i-d);
      if (i+d<=600) res += vs.at(k).at(i+d) - vs.at(j-1).at(i+d);
    }
  }
	cout << res << endl;
}