#include <bits/stdc++.h>
using namespace std;
int n, m;
char matr[1010][1010];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
bool Field(int x, int y) {
  if (x < 1 || x > n) return false;
  if (y < 1 || y > m) return false;
  return true;
}
int color[1010][1010];
int ans[1010][1010];
int f[10];
int H;
void Solve() {
  int i, j, o;
  int x2, y2;
  for (j = 1; j <= m; j++) {
    for (i = 1; i <= n; i++) {
      if (color[j][i]) continue;
      if (matr[j][i] == '.') {
        for (o = 0; o <= 3; o++) {
          x2 = i + dx[o];
          y2 = j + dy[o];
          if (!Field(x2, y2)) continue;
          if (color[y2][x2]) continue;
          if (matr[y2][x2] != '.') continue;
          color[j][i] = 1;
          color[y2][x2] = 1;
          memset(f, 0, sizeof(f));
          ;
          ans[j][i] = H;
          ans[y2][x2] = H;
          H++;
          color[j][i] = 1;
          color[y2][x2] = 1;
          break;
        }
      }
    }
  }
}
int C;
int dfs(int x, int y) {
  int o;
  int x2, y2;
  int res;
  res = 1;
  color[y][x] = C;
  for (o = 0; o <= 3; o++) {
    x2 = x + dx[o];
    y2 = y + dy[o];
    if (!Field(x2, y2)) continue;
    if (color[y2][x2] == C) continue;
    if (ans[y2][x2] != ans[y][x]) continue;
    if (matr[y2][x2] != '.') continue;
    res += dfs(x2, y2);
  }
  return res;
}
void Solve2() {
  int i, j, o;
  int x2, y2;
  memset(color, 0, sizeof(color));
  ;
  int flag;
  for (j = 1; j <= m; j++) {
    for (i = 1; i <= n; i++) {
      if (matr[j][i] == '.' && ans[j][i] == -1) {
        flag = 0;
        for (o = 0; o <= 3; o++) {
          x2 = i + dx[o];
          y2 = j + dy[o];
          if (!Field(x2, y2)) continue;
          if (ans[y2][x2] == -1) continue;
          C++;
          if (dfs(x2, y2) < 5) {
            ans[j][i] = ans[y2][x2];
            flag = 1;
            break;
          }
        }
        if (!flag) {
          printf("-1\n");
          exit(0);
        }
      }
    }
  }
}
vector<pair<int, int> > t;
void dfs2(int x, int y) {
  int o;
  int x2, y2;
  color[y][x] = C;
  t.push_back(make_pair(x, y));
  for (o = 0; o <= 3; o++) {
    x2 = x + dx[o];
    y2 = y + dy[o];
    if (!Field(x2, y2)) continue;
    if (color[y2][x2] == C) continue;
    if (matr[y2][x2] != '.') continue;
    if (ans[y2][x2] >= 0 && ans[y2][x2] <= 9) {
      f[ans[y2][x2]] = 1;
    }
    if (ans[y2][x2] != ans[y][x]) continue;
    dfs2(x2, y2);
  }
}
void Solve3() {
  int i, j, o;
  int k;
  for (j = 1; j <= m; j++) {
    for (i = 1; i <= n; i++) {
      if (ans[j][i] >= 10) {
        memset(f, 0, sizeof(f));
        ;
        C++;
        t.clear();
        dfs2(i, j);
        k = 0;
        for (o = 0; o <= 9; o++) {
          if (!f[o]) {
            k = o;
            break;
          }
        }
        for (o = 0; o <= (int)t.size() - 1; o++) {
          ans[t[o].second][t[o].first] = k;
        }
      }
    }
  }
}
int main() {
  int i, j;
  scanf("%d %d", &m, &n);
  for (j = 1; j <= m; j++) {
    scanf("%s", matr[j] + 1);
  }
  memset(ans, -1, sizeof(ans));
  Solve();
  Solve2();
  Solve3();
  for (j = 1; j <= m; j++) {
    for (i = 1; i <= n; i++) {
      if (matr[j][i] == '.') {
        printf("%d", ans[j][i]);
      } else {
        printf("%c", matr[j][i]);
      }
    }
    printf("\n");
  }
  return 0;
}
