#include <bits/stdc++.h>
using namespace std;
char myMap[1000 * 1000 + 11];
char fin[1000 + 11][1000 + 11];
int res[1000 + 11][1000 + 11];
char grid[1000 + 11][1000 + 11];
int row, clm, idx;
bool flg;
int dx[] = {-1, -1, +1, +1, -2, +2, +0, +0};
int dy[] = {-1, +1, -1, +1, +0, +0, -2, +2};
queue<pair<int, int> > Q;
bool valid(int r, int c) { return min(r, c) > 0 && r <= row && c <= clm; }
bool unq(int r, int c) {
  if (grid[r][c] != 'b') return false;
  return !(grid[r + 1][c] == 'w' && grid[r - 1][c] == 'w' &&
           grid[r][c + 1] == 'w' && grid[r][c - 1] == 'w');
}
void proc(int r, int c) {
  if (res[r][c]) return;
  int i, nr, nc;
  idx++;
  if (grid[r + 1][c] == 'w' && grid[r - 1][c] == 'w' && !res[r + 1][c] &&
      !res[r - 1][c]) {
    res[r + 1][c] = res[r - 1][c] = res[r][c] = idx;
    for (i = 0; i < 4; i++) {
      nr = r + dx[i];
      nc = c + dy[i];
      if (!valid(nr, nc)) continue;
      if (grid[nr][nc] == 'b' && !res[nr][nc]) Q.push(make_pair(nr, nc));
    }
    if (valid(r + 2, c) && grid[r + 2][c] != '.' && !res[r + 2][c])
      Q.push(make_pair(r + 2, c));
    if (valid(r - 2, c) && grid[r - 2][c] != '.' && !res[r - 2][c])
      Q.push(make_pair(r - 2, c));
  } else if (grid[r][c + 1] == 'w' && grid[r][c - 1] == 'w' && !res[r][c + 1] &&
             !res[r][c - 1]) {
    res[r][c + 1] = res[r][c - 1] = res[r][c] = idx;
    for (i = 0; i < 4; i++) {
      nr = r + dx[i];
      nc = c + dy[i];
      if (!valid(nr, nc)) continue;
      if (grid[nr][nc] == 'b' && !res[nr][nc]) Q.push(make_pair(nr, nc));
    }
    if (valid(r, c + 2) && grid[r][c + 2] != '.' && !res[r][c + 2])
      Q.push(make_pair(r, c + 2));
    if (valid(r, c - 2) && grid[r][c - 2] != '.' && !res[r][c - 2])
      Q.push(make_pair(r, c - 2));
  } else {
    puts("NO");
    exit(0);
  }
}
set<char> S;
int dx1[] = {-1, -1, -1, +1, +1, +1, +0, +0};
int dy1[] = {-1, +0, +1, -1, +0, +1, -2, +2};
int dx2[] = {-1, +0, +1, -1, +0, +1, -2, +2};
int dy2[] = {-1, -1, -1, +1, +1, +1, +0, +0};
bool var(int r, int c) { return (res[r][c] == res[r - 1][c]); }
bool oka(int r, int c, char cur) {
  int nr, nc, i;
  S.clear();
  if (var(r, c)) {
    for (i = 0; i < 8; i++) {
      nr = r + dx2[i];
      nc = c + dy2[i];
      if (valid(nr, nc)) S.insert(fin[nr][nc]);
    }
  } else {
    for (i = 0; i < 8; i++) {
      nr = r + dx1[i];
      nc = c + dy1[i];
      if (valid(nr, nc)) S.insert(fin[nr][nc]);
    }
  }
  return (S.find(cur) == S.end());
}
void go(int r, int c, char cur) {
  if (var(r, c))
    fin[r][c] = fin[r - 1][c] = fin[r + 1][c] = cur;
  else
    fin[r][c] = fin[r][c - 1] = fin[r][c + 1] = cur;
}
int main() {
  int i, j, k;
  pair<int, int> u;
  scanf("%d %d", &row, &clm);
  for (i = 1; i <= row; i++) scanf("%s", grid[i] + 1);
  for (i = 1; i <= row; i++)
    for (j = 1; j <= clm; j++)
      if (unq(i, j)) Q.push(make_pair(i, j));
  int cnt = 0;
  while (!Q.empty()) {
    u = Q.front();
    Q.pop();
    proc(u.first, u.second);
  }
  for (i = 1; i <= row; i++)
    for (j = 1; j <= clm; j++) {
      if (grid[i][j] == '.') fin[i][j] = '.';
      if (fin[i][j]) continue;
      if (grid[i][j] != 'b') continue;
      while (1) {
        char ch = 'a' + rand() % 4;
        if (oka(i, j, ch)) {
          myMap[res[i][j]] = ch;
          go(i, j, ch);
          break;
        }
      }
    }
  for (i = 1; i <= row; i++)
    for (j = 1; j <= clm; j++)
      if (grid[i][j] != '.' && !fin[i][j]) {
        puts("NO");
        exit(0);
      }
  puts("YES");
  for (i = 1; i <= row; i++) {
    for (j = 1; j <= clm; j++) {
      if (grid[i][j] == '.')
        printf(".");
      else
        printf("%c", myMap[res[i][j]]);
    }
    puts("");
  }
  return 0;
}
