unittest
{
	assert( [ "?tc????", "coder" ].parse.expand.solve == "atcoder" );
	assert( [ "??p??d??", "abc" ].parse.expand.solve == "UNRESTORABLE" );
}



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

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

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto s = input.front.strip.to!( char[] );
	input.popFront;
	auto t = input.front.strip;
	return tuple( s, t );
}

auto solve( char[] s, string t )
{
	
	// S内のTにマッチする個所を置換（複数個所マッチする場合を考慮して後ろから検索する）
	auto mc = 0L;
	auto mq = 0L;
	foreach_reverse( i, c; s )
	{
		while( true )
		{
			if( c == t[ $ - 1 - mc ] )		// 完全一致
			{
				mc++;
				mq = -1;		// ?でずらせなくなるのでロックをかける
				break;
			}
			else if( c == '?' )		// ?で仮一致
			{
				mc++;
				if( 0 <= mq ) mq++;
				break;
			}
			else if( mq <= 0 )		// 一致しなくなった（?でずらす余地もない）
			{
				mc = 0;
				mq = 0;
				break;
			}
			
			// 途中でマッチしなくなったら?でマッチしている位置をずらしてみる
			mc--;
			mq--;
		}
		
		// マッチ個所確定
		if( mc == t.length )
		{
			// 置換実行
			s[ i .. i + t.length ] = t;
			
			// 残りの?を置換
			s = s.replace( "?", "a" );
			return s.to!( string );
		}
	}
	
	return "UNRESTORABLE";
}
