#include <iostream>

using namespace std;
const int dir[8][2] = {{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}}; // cst指不变常量 这步是一个大伏笔啊!

int main (){
    int n , m;
    cin >> n >> m;
    char A[1010][1010]; // 对于这个矩阵 依旧多空出来 10个位置保险
    for(int i = 1; i <= n ;i++){ // 这里从1开始de原因是 要对*旁边八个地方进行加一 但是*可能在第一行或者第一列啊
        for(int j = 1 ; j <= m; j++){
            cin >> A[i][j];
        }
    }
    for(int i = 1; i <=n; i++){
        for(int j = 1; j <= m; j++){
            if(A[i][j] == '*') {
                cout << A[i][j];
                continue;//不加这个的话 岂不是*的地方也要参与运算了? 不符合题意啊
            }
            int cnt = 0 ;
            for(int p = 0; p < 8; p++){
                if(A[i+dir[p][0]][j+ dir[p][1]] ==  '*') cnt++;//细节了老弟 这波用dir省了多少事!
            }
            A[i][j] = cnt +'0';
            cout << A[i][j] ;
        }
        cout << endl;
    }
    return 0;
}