import java.util.Scanner;

/**
 * int output(int x, int y, int z, int k, char ch[][k]) {
 *     int count = 0;
 *     //在当前值周围进行循环判断
 *     for (int i = x - 1; i <= x + 1; i++) {
 *         for (int j = y - 1; j <= y + 1; j++) {
 *             //若有*且不超出矩阵范围,地雷加1
 *             if (ch[i][j] == '*' && i >= 0 && i < z && j >= 0 && j < k)
 *                 count++;
 *         }
 *     }
 *     return count;  //返回地雷数
 * }
 * int main() {
 *     int n, m, count = 0;
 *     scanf("%d %d\n", &n, &m);
 *     char ch[n][m];
 *     //依次输入字符
 *     for (int i = 0; i < n; i++) {
 *         for (int j = 0; j < m; j++) {
 *             scanf("%c ", &ch[i][j]);
 *         }
 *     }
 *     //依次判断并输出字符
 *     for (int i = 0; i < n; i++) {
 *         for (int j = 0; j < m; j++) {
 *             if (ch[i][j] != '*') {  //字符不为*时,计算当前值应为多少
 *                 ch[i][j] = output(i, j, n, m, ch);  //字符替换地雷数值
 *                 printf("%d", ch[i][j]);  //输出当前值
 *             } else printf("%c", ch[i][j]);  //字符为*时,直接输出
 *         }
 *         printf("\n");
 *     }
 *     return 0;
 * }
 */

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        char[][] a = new char[n][m];
        for (int i = 0; i < a.length; i++) {
            String s = sc.next();
            a[i] = s.toCharArray();
        }
        // 打印出数组
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] == '*') {
                    System.out.print('*');
                    continue;
                }
                // 查看周围
                int count = 0; // 周围是否有雷
                // 本来是分别写的后来为了方便就写成了循环
                // 查看上面和左上/右上
//                if (i - 1 >= 0 ) {
//                    if (a[i - 1][j] == '*') {
//                        count ++;
//                    }
//                    // 左上
//                    if (j - 1 >= 0) {
//                        if (a[i - 1][j - 1] == '*') {
//                            count ++;
//                        }
//                    }
//                    // 右上
//                    if (j + 1 < a[i].length) {
//                        if (a[i - 1][j + 1] == '*') {
//                            count ++;
//                        }
//                    }
//                }
//                // 查看下面,左下,右下
//                if (i + 1 < a.length) {
//                    if (a[i + 1][j] == '*') {
//                        count++;
//                    }
//                    // 左下
//                    if (j - 1 >= 0) {
//                        if (a[i + 1][j - 1] == '*') {
//                            count++;
//                        }
//                    }
//                    // 右下
//                    if (j + 1 < a[i].length) {
//                        if (a[i + 1][j + 1] == '*') {
//                            count++;
//                        }
//                    }
//                }
//                // 查看左面
//                if (j - 1 >= 0) {
//                    if (a[i][j - 1] == '*') {
//                        count++;
//                    }
//                }
//                // 查看右面
//                if (j + 1 < a[i].length) {
//                    if (a[i][j + 1] == '*') {
//                        count++;
//                    }
//                }
                // 循环写法,但是后来是遇到超时问题(后来找了现有的题解,发现了一个c写法的,和我这个是一样的,可以运行)
                // 在本地ide中运行结果是没有问题的
                for (int x = i - 1; x <= i + 1; x++) {
                    if (x < 0 || x >= n) {
                        continue;
                    }
                    for (int y = j - 1; y <= j + 1; y++) {
                        if (y < 0 || y >= m) {
                            continue;
                        } else if (a[x][y] == '*') {
                            count++;
                        }
                    }
                }
                System.out.print(count);
            }
            System.out.println();
        }
    }
}