import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto hwk = input.front.split.to!( long[] );
	auto sss = new dchar[][]( hwk[ 0 ], hwk[ 1 ] );
	foreach( ref ss; sss )
	{
		input.popFront;
		ss = input.front.to!( dchar[] );
	}
	return tuple( sss );
}

auto solve( dchar[][] sss )
{
	// 行ごとにイチゴの数を集計
	auto cs = sss.map!( ( ss ) => ss.count( '#' ) );
	
	// 最初にイチゴがある行を検索
	auto f = sss.length.signed - cs.find!( ( a, b ) => b < a )( 0 ).length.signed;
	
	// イチゴが一つだけになるように分割
	auto ansss = new long[][]( sss.length, sss[ 0 ].length );
	auto p = 0L;
	for( auto i = f; i < sss.length; i++ )
	{
		if( 0 < cs[ i ] )
		{
			p++;
			auto d = 0L;
			foreach( ref ans, s; lockstep( ansss[ i ], sss[ i ] ) )
			{
				if( s == '#' )
				{
					p += ( 0 < d );
					d++;
				}
				ans = p;
			}
		}
		else
		{
			ansss[ i ][] = ansss[ i - 1 ][];
		}
	}
	for( auto i = 0L; i < f; i++ )
	{
		ansss[ i ][] = ansss[ f ][];
	}
	return ansss.map!( ( anss ) => anss.to!( string[] ).join( " " ) ).join( "\n" );
}
