#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace __gnu_pbds;
using namespace std;
#define line '\n'
#define khaled ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
long long derangement( int n) { if ( n == 0 ) return 1 ; if ( n == 1 ) return 0 ; if ( n == 2 ) return 1 ; return ( n - 1 ) * ( derangement( n - 1 ) + derangement( n - 2 ) ) ; }
bool line_checking( long long a1,long long b1,long long a2,long long b2,long long a3,long long b3) { return ( a3- a1) * ( b2- b1) == ( a2- a1) * ( b3- b1) ; }
bool valid( long long i,long long j,long long n,long long m) { return i>= 0 && i< n&& j>= 0 && j< m; }
long long safe_mul_mod( long long a,long long b,const long long & mod) { long long res= 0 ,y= a% mod; while ( b> 0 ) { if ( b& 1 ) { res= ( ( res% mod) + ( y% mod) ) % mod; } y= ( ( y% mod) * ( 2ll% mod) ) % mod; b>>= 1 ; } return ( res% mod) ; }
long long mul( long long x,long long y,const long long & mod) { return ( ( x% mod) * ( y% mod) ) % mod; }
long long add( long long x,long long y,const long long & mod) { return ( ( ( x% mod) + ( y% mod) ) % mod+ mod) % mod; }
long long fast_power( long long base,long long power,const long long & m= INT64_MAX) { if ( power == 1 || power == 0 ) return base * power + ( ! power) ; long long res = ( fast_power( base, power / 2 , m) % m) % m; if ( power & 1 ) return mul( base,mul( res,res,m) ,m) ; else return mul( res,res,m) ; }
long long mod_inverse_fermat( long long B,const long long & mod= 1e9 + 7 ) { return fast_power( B,mod- 2 ,mod) ; } //mod is prime
vector< int > mod_inverse_for_range( int n,int p) { vector< int > inv( n+ 1 ,1 ) ; for ( int i= 2 ; i< n+ 1 ; i++ ) { inv[ i] = ( p - ( p / i) * inv[ p % i] % p ) % p; } return inv; } //mod is prime
vector< long long > factorial( long long n,const long long & mod) { vector< long long > v( n+ 1 ,1 ) ; for ( int i= 2 ; i<= n; i++ ) v[ i] = mul( i,v[ i- 1 ] ,mod) ; return v; }
long long NCR_MOD( long long n, long long r,vector< long long > & fact,const long long & mod) { return mul( mul( fact[ n] , mod_inverse_fermat( fact[ n - r] , mod) , mod) , mod_inverse_fermat( fact[ r] , mod) , mod) ; }
long long phi( long long n) { long long result = n; for ( int i = 2 ; i * i <= n; i++ ) { if ( n % i == 0 ) { while ( n % i == 0 ) n / = i; result - = result / i; } } if ( n > 1 ) result - = result / n; return result; }
long double NCR_LINEAR_TIME( long long n,long long r) { if ( r> n) return 0 ; if ( r== 0 || r== n) { return 1 ; } if ( r== 1 || r== n- 1 ) return n; return NCR_LINEAR_TIME( n- 1 ,r- 1 ) * ( long double ) n/ r; }
bool power_of_two( int n) { n= abs ( n) ; return n && ! ( n & ( n - 1 ) ) ; }
int dx[ ] { 1 ,- 1 ,0 ,0 ,1 ,1 ,- 1 ,- 1 } ; //0->4 normal,4->8 diagonal
int dy[ ] { 0 ,0 ,1 ,- 1 ,1 ,- 1 ,1 ,- 1 } ;
const long double pi= 3.14159265350979323846 ;
const long double Eps= 1e-10 ;
#define int __int128
template < class integer>
inline integer to_int( const string& s, size_t * idx = 0 , int base = 10 ) {
size_t n = s.size ( ) , i = idx ? * idx : 0 ; bool sign = false ; integer x = 0 ;
if ( s[ i] == '-' )
++ i, sign = true ;
function< int ( char ) > char_to_digit = [ & ] ( char c) {
static const int d[ ] = { 'a' - 10 ,'0' } ;
return tolower ( c) - d[ isdigit ( c) ] ; } ;
while ( i < n)
x * = base, x + = char_to_digit( s[ i++ ] ) ;
if ( idx)
* idx = i;
return sign ? - x : x; }
template < class integer>
inline string to_string( integer x, int base = 10 ) {
bool sign = false ; string s;
if ( x < 0 )
x = - x, sign = true ;
function< char ( int ) > digit_to_char = [ ] ( int d) {
static const char c[ ] = { 'a' - 10 ,'0' } ;
return c[ d < 10 ] + d; } ;
do
s + = digit_to_char( x% base) , x / = base;
while ( x > 0 ) ;
if ( sign)
s + = '-' ;
reverse( s.begin ( ) ,s.end ( ) ) ;
return s; }
template < class integer>
inline istream& read( istream& is, integer& x) {
string s; is >> s, x = to_int< integer> ( s) ; return is; }
template < class integer>
inline ostream& write( ostream& os, integer x) { return os << to_string( x) ; }
using lll = signed __int128;
using ulll = unsigned __int128;
inline istream& operator>> ( istream& is, lll & x) { return read( is,x) ; }
inline istream& operator>> ( istream& is, ulll & x) { return read( is,x) ; }
inline ostream& operator<< ( ostream& os, lll x) { return write( os,x) ; }
inline ostream& operator<< ( ostream& os, ulll x) { return write( os,x) ; }
template < typename T>
using ordered_set= tree< T,null_type,less< T> ,rb_tree_tag,tree_order_statistics_node_update> ;
const int N= 1e5 + 1 ;
const int mod= 1e9 + 7 ;
int inf= 1 ;
/*--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------*/
int c( int n,int k) {
int res= 0 ;
while ( n) {
if ( n% 10 == k) res++ ;
n/ = 10 ;
}
return res;
}
int dp[ 101 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] [ 3 ] ;
vector< vector< int >> dlog;
int solve( int index,vector< int > & v,int zero,int one,int two,int three,int four,int five,int six,int seven,int eight,int nine) {
if ( zero> 2 || one> 2 || two> 2 || three> 2 || four> 2 || five> 2 || six> 2 || seven> 2 || eight> 2 || nine> 2 ) return - inf;
if ( index== v.size ( ) ) {
return 0 ;
}
int & ret= dp[ index] [ zero] [ one] [ two] [ three] [ four] [ five] [ six] [ seven] [ eight] [ nine] ;
if ( ~ret) return ret;
int res1= solve( index+ 1 ,v,zero+ dlog[ index] [ 0 ] ,one+ dlog[ index] [ 1 ] ,two+ dlog[ index] [ 2 ] ,three+ dlog[ index] [ 3 ] ,four+ dlog[ index] [ 4 ] ,five+ dlog[ index] [ 5 ] ,six+ dlog[ index] [ 6 ] ,
seven+ dlog[ index] [ 7 ] ,eight+ dlog[ index] [ 8 ] ,nine+ dlog[ index] [ 9 ] ) + v[ index] ;
int res2= solve( index+ 1 ,v,zero,one,two,three,four,five,six,seven,eight,nine) ;
return ret = max( res1,res2) ;
}
signed main( ) {
khaled
int t;
cin >> t;
int l= 30 ;
while ( l-- )
inf= inf* 10 ;
while ( t-- ) {
int n;
cin >> n;
for ( int i= 0 ; i< n; i++ ) memset ( dp[ i] ,- 1 ,sizeof ( dp[ i] ) ) ;
dlog.clear ( ) ;
vector< int > v( n) ;
dlog.resize ( n,vector< int > ( 10 ) ) ;
for ( auto & val: v) cin >> val;
for ( int j= 0 ; j< n; j++ ) {
for ( auto & i: { 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 } )
dlog[ j] [ i] = c( v[ j] ,i) ;
}
cout << solve( 0 ,v,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ) << line;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPiAvLyBDb21tb24gZmlsZQojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4gLy8gSW5jbHVkaW5nIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZQp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsaW5lICdcbicKI2RlZmluZSBraGFsZWQgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwpsb25nIGxvbmcgZGVyYW5nZW1lbnQoaW50IG4pe2lmKG4gPT0gMClyZXR1cm4gMTtpZihuID09IDEpcmV0dXJuIDA7aWYobiA9PSAyKXJldHVybiAxO3JldHVybiAobiAtIDEpKihkZXJhbmdlbWVudChuIC0gMSkgKyBkZXJhbmdlbWVudChuIC0gMikpO30KYm9vbCBsaW5lX2NoZWNraW5nKGxvbmcgbG9uZyBhMSxsb25nIGxvbmcgYjEsbG9uZyBsb25nIGEyLGxvbmcgbG9uZyBiMixsb25nIGxvbmcgYTMsbG9uZyBsb25nIGIzKXtyZXR1cm4gKGEzLWExKSooYjItYjEpPT0oYTItYTEpKihiMy1iMSk7fQpib29sIHZhbGlkKGxvbmcgbG9uZyBpLGxvbmcgbG9uZyBqLGxvbmcgbG9uZyBuLGxvbmcgbG9uZyBtKXtyZXR1cm4gaT49MCYmaTxuJiZqPj0wJiZqPG07fQpsb25nIGxvbmcgc2FmZV9tdWxfbW9kKGxvbmcgbG9uZyBhLGxvbmcgbG9uZyBiLGNvbnN0IGxvbmcgbG9uZyAmbW9kKXtsb25nIGxvbmcgcmVzPTAseT1hJW1vZDt3aGlsZShiPjApe2lmKGImMSl7cmVzPSgocmVzJW1vZCkrKHklbW9kKSklbW9kO315PSgoeSVtb2QpKigybGwlbW9kKSklbW9kO2I+Pj0xO31yZXR1cm4gKHJlcyVtb2QpO30KbG9uZyBsb25nIG11bChsb25nIGxvbmcgeCxsb25nIGxvbmcgeSxjb25zdCBsb25nIGxvbmcmbW9kKXtyZXR1cm4gKCh4JW1vZCkqKHklbW9kKSklbW9kO30KbG9uZyBsb25nIGFkZChsb25nIGxvbmcgeCxsb25nIGxvbmcgeSxjb25zdCBsb25nIGxvbmcmbW9kKXtyZXR1cm4gKCgoeCVtb2QpKyh5JW1vZCkpJW1vZCttb2QpJW1vZDt9CmxvbmcgbG9uZyBmYXN0X3Bvd2VyKGxvbmcgbG9uZyBiYXNlLGxvbmcgbG9uZyBwb3dlcixjb25zdCBsb25nIGxvbmcgJm09SU5UNjRfTUFYKXtpZiAocG93ZXIgPT0gMSB8fCBwb3dlciA9PSAwKXJldHVybiBiYXNlICogcG93ZXIgKyAoIXBvd2VyKTtsb25nIGxvbmcgcmVzID0gKGZhc3RfcG93ZXIoYmFzZSwgcG93ZXIgLyAyLCBtKSAlIG0pICUgbTtpZiAocG93ZXIgJiAxKXJldHVybiBtdWwoYmFzZSxtdWwocmVzLHJlcyxtKSxtKTtlbHNlIHJldHVybiBtdWwocmVzLHJlcyxtKTt9CmxvbmcgbG9uZyBtb2RfaW52ZXJzZV9mZXJtYXQobG9uZyBsb25nIEIsY29uc3QgbG9uZyBsb25nJm1vZD0xZTkrNyl7IHJldHVybiBmYXN0X3Bvd2VyKEIsbW9kLTIsbW9kKTt9Ly9tb2QgaXMgcHJpbWUKdmVjdG9yPGludD5tb2RfaW52ZXJzZV9mb3JfcmFuZ2UoaW50IG4saW50IHApe3ZlY3RvcjxpbnQ+aW52KG4rMSwxKTtmb3IoaW50IGk9MjtpPG4rMTtpKyspIHtpbnZbaV0gPSAoIHAgLSAocCAvIGkpICogaW52W3AgJSBpXSAlIHAgKSAlIHA7fXJldHVybiBpbnY7fS8vbW9kIGlzIHByaW1lCnZlY3Rvcjxsb25nIGxvbmc+ZmFjdG9yaWFsKGxvbmcgbG9uZyBuLGNvbnN0IGxvbmcgbG9uZyYgbW9kKXt2ZWN0b3I8bG9uZyBsb25nPnYobisxLDEpO2ZvcihpbnQgaT0yO2k8PW47aSsrKXZbaV09bXVsKGksdltpLTFdLG1vZCk7cmV0dXJuIHY7fQpsb25nIGxvbmcgTkNSX01PRChsb25nIGxvbmcgbiwgbG9uZyBsb25nIHIsdmVjdG9yPGxvbmcgbG9uZz4mZmFjdCxjb25zdCBsb25nIGxvbmcmbW9kKXtyZXR1cm4gbXVsKG11bChmYWN0W25dLCBtb2RfaW52ZXJzZV9mZXJtYXQoZmFjdFtuIC0gcl0sIG1vZCksIG1vZCksIG1vZF9pbnZlcnNlX2Zlcm1hdChmYWN0W3JdLCBtb2QpLCBtb2QpO30KbG9uZyBsb25nIHBoaShsb25nIGxvbmcgbikge2xvbmcgbG9uZyByZXN1bHQgPSBuO2ZvciAoaW50IGkgPSAyOyBpICogaSA8PSBuOyBpKyspIHtpZiAobiAlIGkgPT0gMCkge3doaWxlIChuICUgaSA9PSAwKW4gLz0gaTtyZXN1bHQgLT0gcmVzdWx0IC8gaTt9fWlmIChuID4gMSlyZXN1bHQgLT0gcmVzdWx0IC8gbjtyZXR1cm4gcmVzdWx0O30KbG9uZyBkb3VibGUgTkNSX0xJTkVBUl9USU1FKGxvbmcgbG9uZyBuLGxvbmcgbG9uZyByKXtpZihyPm4pcmV0dXJuIDA7aWYocj09MHx8cj09bil7cmV0dXJuIDE7fWlmKHI9PTF8fHI9PW4tMSlyZXR1cm4gbjtyZXR1cm4gTkNSX0xJTkVBUl9USU1FKG4tMSxyLTEpKihsb25nIGRvdWJsZSluL3I7fQpib29sIHBvd2VyX29mX3R3byhpbnQgbikgeyBuPWFicyhuKTsgIHJldHVybiBuICYmICEobiAmIChuIC0gMSkpO30KaW50IGR4W117MSwtMSwwLDAsMSwxLC0xLC0xfTsvLzAtPjQgbm9ybWFsLDQtPjggZGlhZ29uYWwKaW50IGR5W117MCwwLDEsLTEsMSwtMSwxLC0xfTsKY29uc3QgbG9uZyBkb3VibGUgcGk9My4xNDE1OTI2NTM1MDk3OTMyMzg0NjsKY29uc3QgbG9uZyBkb3VibGUgRXBzPTFlLTEwOwojZGVmaW5lIGludCBfX2ludDEyOAp0ZW1wbGF0ZTxjbGFzcyBpbnRlZ2VyPgppbmxpbmUgaW50ZWdlciB0b19pbnQoY29uc3Qgc3RyaW5nJiBzLCBzaXplX3QqIGlkeCA9IDAsIGludCBiYXNlID0gMTApIHsKICAgIHNpemVfdCBuID0gcy5zaXplKCksIGkgPSBpZHggPyAqaWR4IDogMDsgYm9vbCBzaWduID0gZmFsc2U7IGludGVnZXIgeCA9IDA7CiAgICBpZiAoc1tpXSA9PSAnLScpCiAgICAgICAgKytpLCBzaWduID0gdHJ1ZTsKICAgIGZ1bmN0aW9uPGludChjaGFyKT4gY2hhcl90b19kaWdpdCA9IFsmXShjaGFyIGMpIHsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRbXSA9IHsnYSctMTAsJzAnfTsKICAgICAgICByZXR1cm4gdG9sb3dlcihjKS1kW2lzZGlnaXQoYyldOyB9OwogICAgd2hpbGUgKGkgPCBuKQogICAgICAgIHggKj0gYmFzZSwgeCArPSBjaGFyX3RvX2RpZ2l0KHNbaSsrXSk7CiAgICBpZiAoaWR4KQogICAgICAgICppZHggPSBpOwogICAgcmV0dXJuIHNpZ24gPyAteCA6IHg7IH0KCnRlbXBsYXRlPGNsYXNzIGludGVnZXI+CmlubGluZSBzdHJpbmcgdG9fc3RyaW5nKGludGVnZXIgeCwgaW50IGJhc2UgPSAxMCkgewogICAgYm9vbCBzaWduID0gZmFsc2U7IHN0cmluZyBzOwogICAgaWYgKHggPCAwKQogICAgICAgIHggPSAteCwgc2lnbiA9IHRydWU7CiAgICBmdW5jdGlvbjxjaGFyKGludCk+IGRpZ2l0X3RvX2NoYXIgPSBbXShpbnQgZCkgewogICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNbXSA9IHsnYSctMTAsJzAnfTsKICAgICAgICByZXR1cm4gY1tkIDwgMTBdK2Q7IH07CiAgICBkbwogICAgICAgIHMgKz0gZGlnaXRfdG9fY2hhcih4JWJhc2UpLCB4IC89IGJhc2U7CiAgICB3aGlsZSAoeCA+IDApOwogICAgaWYgKHNpZ24pCiAgICAgICAgcyArPSAnLSc7CiAgICByZXZlcnNlKHMuYmVnaW4oKSxzLmVuZCgpKTsKICAgIHJldHVybiBzOyB9Cgp0ZW1wbGF0ZTxjbGFzcyBpbnRlZ2VyPgppbmxpbmUgaXN0cmVhbSYgcmVhZChpc3RyZWFtJiBpcywgaW50ZWdlciYgeCkgewogICAgc3RyaW5nIHM7IGlzID4+IHMsIHggPSB0b19pbnQ8aW50ZWdlcj4ocyk7IHJldHVybiBpczsgfQoKdGVtcGxhdGU8Y2xhc3MgaW50ZWdlcj4KaW5saW5lIG9zdHJlYW0mIHdyaXRlKG9zdHJlYW0mIG9zLCBpbnRlZ2VyIHgpIHsgcmV0dXJuIG9zIDw8IHRvX3N0cmluZyh4KTsgfQoKdXNpbmcgIGxsbCA9ICAgc2lnbmVkIF9faW50MTI4Owp1c2luZyB1bGxsID0gdW5zaWduZWQgX19pbnQxMjg7CgppbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiBpcywgIGxsbCAmeCkgeyByZXR1cm4gIHJlYWQoaXMseCk7IH0KaW5saW5lIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYgaXMsIHVsbGwgJngpIHsgcmV0dXJuICByZWFkKGlzLHgpOyB9CmlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCAgbGxsICB4KSB7IHJldHVybiB3cml0ZShvcyx4KTsgfQppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgdWxsbCAgeCkgeyByZXR1cm4gd3JpdGUob3MseCk7IH0KdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgb3JkZXJlZF9zZXQ9dHJlZTxULG51bGxfdHlwZSxsZXNzPFQ+LHJiX3RyZWVfdGFnLHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CmNvbnN0IGludCBOPTFlNSsxOwpjb25zdCBpbnQgbW9kPTFlOSs3OwppbnQgaW5mPTE7Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KaW50IGMoaW50IG4saW50IGspewogICAgaW50IHJlcz0wOwogICAgd2hpbGUobil7CiAgICAgICAgaWYobiUxMD09aylyZXMrKzsKICAgICAgICBuLz0xMDsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KaW50IGRwWzEwMV1bM11bM11bM11bM11bM11bM11bM11bM11bM11bM107CnZlY3Rvcjx2ZWN0b3I8aW50Pj5kbG9nOwppbnQgc29sdmUoaW50IGluZGV4LHZlY3RvcjxpbnQ+JnYsaW50IHplcm8saW50IG9uZSxpbnQgdHdvLGludCB0aHJlZSxpbnQgZm91cixpbnQgZml2ZSxpbnQgc2l4LGludCBzZXZlbixpbnQgZWlnaHQsaW50IG5pbmUpewogICAgaWYoemVybz4yfHxvbmU+Mnx8dHdvPjJ8fHRocmVlPjJ8fGZvdXI+Mnx8Zml2ZT4yfHxzaXg+Mnx8c2V2ZW4+Mnx8ZWlnaHQ+Mnx8bmluZT4yKXJldHVybiAtaW5mOwogICAgaWYoaW5kZXg9PXYuc2l6ZSgpKXsKICAgICAgIHJldHVybiAwOwogICAgfQogICAgaW50ICZyZXQ9ZHBbaW5kZXhdW3plcm9dW29uZV1bdHdvXVt0aHJlZV1bZm91cl1bZml2ZV1bc2l4XVtzZXZlbl1bZWlnaHRdW25pbmVdOwogICAgaWYofnJldClyZXR1cm4gcmV0OwogICAgaW50IHJlczE9c29sdmUoaW5kZXgrMSx2LHplcm8rZGxvZ1tpbmRleF1bMF0sb25lK2Rsb2dbaW5kZXhdWzFdLHR3bytkbG9nW2luZGV4XVsyXSx0aHJlZStkbG9nW2luZGV4XVszXSxmb3VyK2Rsb2dbaW5kZXhdWzRdLGZpdmUrZGxvZ1tpbmRleF1bNV0sc2l4K2Rsb2dbaW5kZXhdWzZdLAogICAgICAgICAgICAgICAgICAgc2V2ZW4rZGxvZ1tpbmRleF1bN10sZWlnaHQrZGxvZ1tpbmRleF1bOF0sbmluZStkbG9nW2luZGV4XVs5XSkrdltpbmRleF07CiAgICBpbnQgcmVzMj1zb2x2ZShpbmRleCsxLHYsemVybyxvbmUsdHdvLHRocmVlLGZvdXIsZml2ZSxzaXgsc2V2ZW4sZWlnaHQsbmluZSk7CiAgICByZXR1cm4gcmV0ID0gIG1heChyZXMxLHJlczIpOwp9CnNpZ25lZCBtYWluKCkgewogICAga2hhbGVkCiAgICBpbnQgdDsKICAgIGNpbj4+dDsKICAgIGludCBsPTMwOwogICAgd2hpbGUobC0tKQogICAgICAgIGluZj1pbmYqMTA7CiAgICB3aGlsZSh0LS0pewogICAgICAgIGludCBuOwogICAgICAgIGNpbj4+bjsKICAgICAgICBmb3IoaW50IGk9MDtpPG47aSsrKW1lbXNldChkcFtpXSwtMSxzaXplb2YoZHBbaV0pKTsKICAgICAgICBkbG9nLmNsZWFyKCk7CiAgICAgICAgdmVjdG9yPGludD52KG4pOwogICAgICAgIGRsb2cucmVzaXplKG4sdmVjdG9yPGludD4oMTApKTsKICAgICAgICBmb3IoYXV0byAmdmFsOnYpY2luPj52YWw7CiAgICAgICAgZm9yKGludCBqPTA7ajxuO2orKyl7CiAgICAgICAgICAgIGZvcihhdXRvICZpOnswLDEsMiwzLDQsNSw2LDcsOCw5fSkKICAgICAgICAgICAgICAgIGRsb2dbal1baV09Yyh2W2pdLGkpOwogICAgICAgIH0KICAgICAgICBjb3V0PDxzb2x2ZSgwLHYsMCwwLDAsMCwwLDAsMCwwLDAsMCk8PGxpbmU7CiAgICB9Cn0=