//
// Created by Zirui Tao on 1/12/2018.
//
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#define max std::max
#define min std::min
//布局
char block[101][101];
//格子周围雷数
int num[101][101];
//int max(int a,int b)
//{
// return a>b?a:b;
//}
//int min(int a,int b)
//{
// return a<b?a:b;
//}
int input(int raw,int colum)
{
/**输入扫雷布局*/
memset(block,'0',sizeof(block));
for(int i=0;i<raw;++i)
{
for(int j=0;j<colum;++j)
{
scanf("%c",&block[i][j]);
}
scanf("%*c");
}
printf("%c", block[0][0]);
return 0;
}
int mineNum(int raw,int colum)
{
for(int i=0;i<raw;i++)
{
for(int j=0;j<colum;j++)
{
num[i][j]=0;
if(block[i][j]=='*')
{
printf("*");
}
else
{
//上下,行,区间左端点的最大值(>=0),区间右端点的最小值(<=row-1)
for(int k=max(i-1,0);k<=min(i+1,raw-1);k++)
{
for(int t=max(j-1,0);t<=min(j+1,colum-1);t++)
{
if(block[k][t]=='*')
{
num[i][j]++;
}
}
}
printf("%d",num[i][j]);
}
}
printf("\n");
}
return 0;
}
int main()
{
int time=0;
int raw,col;
while(scanf("%d%d",&raw,&col)!=EOF)
{
//输入行列后又回车了,所以回车也算一个字符……
scanf("%*c");
printf("raw:%d, col:%d\n", raw, col);
if(raw==0&&col==0)
exit(0);
else
{
input(raw,col);
printf("Field#%d\n",++time);
mineNum(raw,col);
}
}
return 0;
}