#include <bits/stdc++.h>
#pragma GCC optimize("O2")
const int MAXN = 1e3 + 5;
using namespace std;
char all[3][3] = {'#', '#', '#', '#', '.', '#', '#', '#', '#'};
int n, m;
char arr[MAXN][MAXN];
bool dispo(int i, int j) {
  for (int e = i; e < min(i + 3, n); e++)
    for (int f = j; f < min(j + 3, m); f++)
      if (arr[e][f] != all[e - i][f - j] && arr[e][f] == '.') return 0;
  return 1;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> arr[i][j];
  char ans[MAXN][MAXN];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) ans[i][j] = '.';
  for (int i = 0; i < n - 2; i++)
    for (int j = 0; j < m - 2; j++)
      if (dispo(i, j))
        for (int e = i; e < min(i + 3, n); e++)
          for (int f = j; f < min(j + 3, m); f++)
            if (all[e - i][f - j] == '#') ans[e][f] = all[e - i][f - j];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (ans[i][j] != arr[i][j]) {
        cout << "NO";
        return 0;
      }
  cout << "YES";
  return 0;
}
