```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(reader, &n, &m)
grid := make([][]byte, n)
for i := 0; i < n; i++ {
var s string
fmt.Fscan(reader, &s)
grid[i] = []byte(s)
}
up := make([][]int, n)
down := make([][]int, n)
left := make([][]int, n)
right := make([][]int, n)
for i := 0; i < n; i++ {
up[i] = make([]int, m)
down[i] = make([]int, m)
left[i] = make([]int, m)
right[i] = make([]int, m)
}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == '#' {
up[i][j] = 0
} else if i == 0 {
up[i][j] = 1
} else {
up[i][j] = up[i-1][j] + 1
}
}
}
for i := n - 1; i >= 0; i-- {
for j := 0; j < m; j++ {
if grid[i][j] == '#' {
down[i][j] = 0
} else if i == n-1 {
down[i][j] = 1
} else {
down[i][j] = down[i+1][j] + 1
}
}
}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == '#' {
left[i][j] = 0
} else if j == 0 {
left[i][j] = 1
} else {
left[i][j] = left[i][j-1] + 1
}
}
}
for i := 0; i < n; i++ {
for j := m - 1; j >= 0; j-- {
if grid[i][j] == '#' {
right[i][j] = 0
} else if j == m-1 {
right[i][j] = 1
} else {
right[i][j] = right[i][j+1] + 1
}
}
}
var ans int64 = 0
for i := 1; i < n-1; i++ {
if left[i][m-1] >= m {
ans++
}
}
for j := 1; j < m-1; j++ {
if up[n-1][j] >= n {
ans++
}
}
for i := 1; i < n-1; i++ {
for j := 1; j < m-1; j++ {
if grid[i][j] == '.' {
if up[i][j] >= i+1 && left[i][j] >= j+1 {
ans++
}
if up[i][j] >= i+1 && right[i][j] >= m-j {
ans++
}
if down[i][j] >= n-i && left[i][j] >= j+1 {
ans++
}
if down[i][j] >= n-i && right[i][j] >= m-j {
ans++
}
}
}
}
for j := 1; j < m-1; j++ {
i := 1
for i < n-1 {
if grid[i][j] == '#' {
i++
continue
}
start := i
for i < n-1 && grid[i][j] == '.' {
i++
}
end := i - 1
var sum int64 = 0
var sumsq int64 = 0
for r := start; r <= end; r++ {
a := 0
if left[r][j] >= j+1 {
a++
}
if right[r][j] >= m-j {
a++
}
sum += int64(a)
sumsq += int64(a * a)
}
ans += (sum*sum - sumsq) / 2
}
}
for i := 1; i < n-1; i++ {
j := 1
for j < m-1 {
if grid[i][j] == '#' {
j++
continue
}
start := j
for j < m-1 && grid[i][j] == '.' {
j++
}
end := j - 1
var sum int64 = 0
var sumsq int64 = 0
for c := start; c <= end; c++ {
b := 0
if up[i][c] >= i+1 {
b++
}
if down[i][c] >= n-i {
b++
}
sum += int64(b)
sumsq += int64(b * b)
}
ans += (sum*sum - sumsq) / 2
}
}
fmt.Println(ans)
}
```