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<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
const ll mod = (ll)(1e+9) + 7;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef long double ld;
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
typedef pair<ld, ld> LDP;
int mp[300][300];
int h, w;
ll calc() {
	ll res = 0;
	int cnt[600][301] = {};
	rep(s, h+w) {
		rep(x, h) {
			int y = s - x;
			int num = 0;
			if (0 <= y && y < w&&mp[x][y])num = 1;
			cnt[s][x + 1] = cnt[s][x] + num;
			//cout << cnt[s][x + 1] << endl;
		}
	}
	rep(s, h + w) {
		rep(x1, h) {
			int y1 = s - x1;
			if (y1 < 0 || y1 >= w || !mp[x1][y1])continue;
			Rep(x2, x1 + 1, h) {
				int y2 = s - x2;
				if (y2 < 0 || y2 >= w || !mp[x2][y2])continue;
				int dif = (x2 - x1) * 2;
				int nes = s - dif;
				if (nes >= 0) {
					int sta = max(0, x2 - dif + 1);
					int las = x1;
					res += 2 * (cnt[nes][las] - cnt[nes][sta]);
					if (0 <= x2 - dif && mp[x2 - dif][y2])res++;
					if (0 <= y1 - dif && mp[x1][y1 - dif])res++;
				}
				nes = s + dif;
				if (nes < h+w) {
					int sta = x2 + 1;
					int las = min(x1 + dif, h);
					res += 2 * (cnt[nes][las] - cnt[nes][sta]);
					if (h > x1 + dif && mp[x1 + dif][y1])res++;
					if (w > y2 + dif && mp[x2][y2 + dif])res++;
				}
			}
		}
	}
	return res;
}
int main() {
	cin >> h >> w;
	rep(i, h) {
		rep(j, w) {
			char t; cin >> t;
			if (t == '#')mp[i][j] = 1;
			else mp[i][j] = 0;
		}
	}
	ll out = calc();
	int cop[300][300];
	rep(i, w) {
		rep(j, h) {
			cop[i][j] = mp[j][w - 1 - i];
		}
	}
	swap(h, w);
	rep(i, h) {
		rep(j, w) {
			mp[i][j] = cop[i][j];
			//cout << mp[i][j];
		}
		//cout << endl;
	}
	//cout << out << endl;
	out += calc();
	//cout << out << endl;
	cout << out / 2 << endl;
	return 0;
}