unittest
{
	assert( [ "1", "1000000000" ].parse.expand.solve == 999999993 );
	assert( [ "2", "5 8" ].parse.expand.solve == 124 );
	assert( [ "5", "52 67 72 25 79" ].parse.expand.solve == 269312 );
}



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 ) )
{
	input.popFront;
	auto cs = input.front.split.to!( long[] );
	return tuple( cs );
}

auto solve( long[] cs )
{
	// コストが小さい順に操作するのが最適
	cs.sort();
	
	// S ^ T = X として、Xの全パターンの操作コストを合計
	auto ans = 0L;
	auto cp = 2.powMod( cs.length.signed - 1 );		// 全パターンからi番目が0のパターンを除いた数
	auto rp = 2.powMod( cs.length.signed - 2 );		// 全パターンからi番目とj番目が0のパターンを除いた数
	foreach( i, c; cs )
	{
		// i番目を1に固定したときの操作コストを計算
		auto rn = cs.length.signed - 1 - i;
		auto rb = ( rn <= 0 ) ? 0 : rp.mulMod( rn );
		auto cb = cp;
		auto ct = cb.addMod( rb ).mulMod( c );
		ans = ans.addMod( ct );
	}
	
	// Xから元のSとTは2^^桁数パターン作れる
	ans = ans.mulMod( 2.powMod( cs.length ) );
	
	return ans;
}

// 足し算
auto addMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return ( x + y ) % MOD;
}

// 掛け算
auto mulMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y % MOD;
}

// 割り算
auto divMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y.powMod!MOD( MOD - 2 ) % MOD;
}

// べき乗
auto powMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	auto a = 1L;
	for( ; 0 < y; y >>= 1 )
	{
		if( y & 1 ) a = a * x % MOD;
		x = x ^^ 2 % MOD;
	}
	return a;
}
