#define _CRT_SECURE_NO_WARNINGS 1
#define NUM 1000
#include<stdio.h>
//思路:
//遍历 每个 不是雷 的位置的周围的位置
int main()
{
	int n = 0;
	int m = 0;
	while (~scanf("%d %d", &n, &m))
	{
		getchar();//吸收换行符
		char arr[NUM][NUM] = { 0 };
		//向数组中输入元素
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				scanf("%c", &arr[i][j]);
			}
			getchar();//吸收换行符
		}

		//开始遍历数组
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				//如果某个位置上就是 雷 直接输出
				if (arr[i][j] == '*')
				{
					printf("*");
				}
				//不是 雷再进行 遍历 ,查找
				//定位到每一个位置
				else 
				{
					int cnt = 0;//计数器   统计 某个位置周围雷的数目
					for (int a = i - 1; a <= i + 1; a++)//行的范围
					{
						for (int b = j - 1; b <= j + 1; b++)//列的范围
						{ 
							if (arr[a][b] == '*')
							{
								cnt++;
							}
						}
					}
					//统计完了 就输出
					printf("%d", cnt);
				}
			}
			printf("\n");//每一行 结束 之后就换行
		}
	}





	return 0;
}
//总结:
//充分的使用 getchar ()来 吸收换行符,有点 费劲捏!