Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHANCg0KDQoNCnJlcXVpcmUoJ2xpc2Fucy5waHAnKTsvL2xpc2Fucy5..
Decoded Output download
?>b'<?php
require(\'lisans.php\');//lisans.php dosyasini ekle
$lisans[\'site\']=getenv(\'HTTP_HOST\');//site domainini al
if (substr($lisans[\'site\'], 0, 4) == "www.")//domain basindaki www. varmi yokmu kontrol et
$lisans[\'site\']=substr($lisans[\'site\'],4);//www. sil ve sadece domain.com olarak adresi al
$bas = "MYA-";//Lisans kodu bana istediiniz yaz eklenebilir
$son = "-2018";//Lisans kodu sonuna istediiniz yaz eklenebilir
$m = "md5";//md5 sifreleme
$s = "sha1";//sha1 sifreleme
$lisans[\'hash\']=wordwrap(strtoupper($s ($s ($s ($s ($m ($s ($s ($m ($lisans[\'site\'].date(\'Ymd\')))))))))),5,\'-\',true);//lisans kodunu olustur ve 5 karakterde bir - koy
$liskod = $lisans[\'hash\'];
$cevir=strrev($liskod);//lisans kodunu tersine cevir
$bcs = "$bas$cevir$son";
if($bcs!==$lisanskodu)//lisans kodunu kontrol et fark varsa sunucuya baglan - 24 saatte bir lisans kodu degisir
{
$lisans_cevap=file_get_contents(\'http://insta.adanabilisim.net/lisans/kontrol.php?site=\'.$lisans[\'site\']);//lisans sunucusundan lisans kontrolu yap
if($lisans_cevap!=\'LISANSLI\')//sunucudan gelen cevap LISANSLI degilse
die(\'Bu siteye ait lisans bulunamadi!!! Lutfen lisans almak icin sorunsuzscript.com adresini ziyaret ediniz\');//lisans gecersiz mesaji verilir islem durur
$lyaz = fopen(\'lisans.php\',"w+");//lisans.php dosyasini ac yeni lisans kodunu yaz bu dosya yazlabilir olmaldr
@fwrite($lyaz,\'<?php
/**
Sorunsuz Script Php Lisans Sistemi
Bu dosyaya herhangi bir lisans kodu yazmaniz gerekmez
Almis oldugunuz urune ait lisans sistemde aktif oldugunda
Lisans kodunuz otomatik olarak girilecektir.
Yeni lisans almak icin www.sorunsuzscript.com adresini ziyaret edebilirsiniz
*/
$lisanskodu="\'.$bcs.\'";
?>\');
fclose($lyaz);
}
require_once \'sys/config.php\';
require_once \'vendor/autoload.php\';
$router = new AltoRouter();
$smmapi = new SMMApi();
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
$router->map(\'POST\', \'/api\', function(){
global $vt,$title,$router,$siteayar,$uye,$smmapi;
require_once \'api.php\';
exit();
},\'api.vieww\');
## Kullanc GET lemleri ##
$router->map(\'GET\', \'/\', function(){
global $vt,$title,$router,$siteayar,$uye,$siparisler,$haberler;
if (@$_SESSION["login"]) {
$title.= \'Anasayfa\';
include \'views/\'.SITE_TEMA.\'/main.view.php\';
}else{
yonlendir($router->generate(\'login.view\'));
}
exit();
},\'main.view\');
$router->map(\'GET\', \'/sozlesmeler\', function(){
global $vt,$title,$router,$siteayar,$uye,$siparisler,$haberler;
$title.= \'Szlemelerimiz\';
include \'views/\'.SITE_TEMA.\'/sozlesme.view.php\';
exit();
},\'sozlesmeler.view\');
$router->map(\'GET\', \'/cikis-yap\', function(){
global $router;
unset($_SESSION["login"]);
unset($_SESSION["username"]);
session_destroy();
setcookie("username", $_SESSION["username"], time() - 60*60*24*7);
yonlendir($router->generate(\'login.view\'));
exit();
},\'logout.view\');
$router->map(\'GET\', \'/kayit-ol\', function(){
global $vt,$title,$router,$siteayar;
if (@!$_SESSION["login"]) {
$title.= \'Kayt Ol\';
include \'views/\'.SITE_TEMA.\'/register.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'register.view\');
$router->map(\'GET\', \'/giris-yap\', function(){
global $vt,$title,$router,$siteayar;
if (@!$_SESSION["login"]) {
$title.= \'Giri Yap\';
include \'views/\'.SITE_TEMA.\'/login.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'login.view\');
$router->map(\'GET\', \'/parolami-unuttum\', function(){
global $vt,$title,$router,$siteayar;
if (@!$_SESSION["login"]) {
$title.= \'Parolam Unuttum\';
include \'views/\'.SITE_TEMA.\'/password_forget.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'password_forget.view\');
$router->map(\'GET\', \'/parolami-guncelle\', function(){
global $vt,$title,$router,$siteayar;
if (@!$_SESSION["login"]) {
$title.= \'Parolam Unuttum\';
include \'views/\'.SITE_TEMA.\'/password_forget2.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'sifre_guncelle.view\');
$router->map(\'GET\', \'/bakiye-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye,$bankalar;
if (@$_SESSION["login"]) {
$title.= \'Bakiye Ekle\';
include \'views/\'.SITE_TEMA.\'/add_balance.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'add_balance.view\');
$router->map(\'GET\', \'/yeni-destek-talebi\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Yeni Destek Talebi Olutur\';
include \'views/\'.SITE_TEMA.\'/new_ticket.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'new_ticket.view\');
$router->map(\'GET\', \'/destek-talebi/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title .= \'Destek Talebini Grntle\';
$talep = $vt->prepare("SELECT * FROM destek_talepler WHERE id=? ");
$talep -> execute(array($slug));
$talep = $talep -> fetch(PDO::FETCH_OBJ);
if ($talep->talep_sahibi!=$uye->username) {
yonlendir($router->generate(\'all_tickets.view\'));
}else{
$talepcevaplar = $vt->prepare("SELECT * FROM destek_talep_cevap WHERE talep_id=?");
$talepcevaplar -> execute(array($talep->id));
$talepcevaplar = $talepcevaplar->fetchAll(PDO::FETCH_OBJ);
}
include \'views/\'.SITE_TEMA.\'/read_ticket.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'read_ticket.view\');
$router->map(\'GET\', \'/destek-taleplerim\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Destek Taleplerim\';
$taleplerim = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? ORDER BY id DESC");
$taleplerim-> execute(array($uye->username));
$taleplerim = $taleplerim->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'all_tickets.view\');
$router->map(\'GET\', \'/destek-taleplerim/bekleyenler\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Destek Taleplerim\';
$taleplerim = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
$taleplerim-> execute(array($uye->username,\'Ak\'));
$taleplerim = $taleplerim->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'bekleyen_tickets.view\');
$router->map(\'GET\', \'/destek-taleplerim/yanitlanmis\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Destek Taleplerim\';
$taleplerim = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
$taleplerim-> execute(array($uye->username,\'Yantland\'));
$taleplerim = $taleplerim->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'yanitlandi_tickets.view\');
$router->map(\'GET\', \'/destek-taleplerim/kapali\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Destek Taleplerim\';
$taleplerim = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
$taleplerim-> execute(array($uye->username,\'Kapal\'));
$taleplerim = $taleplerim->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'kapali_tickets.view\');
$router->map(\'GET\', \'/yeni-siparis\', function(){
global $vt,$title,$router,$siteayar,$uye,$kategoriler,$kategorilerfiyat;
if (@$_SESSION["login"]) {
$title.= \'Yeni Sipari\';
include \'views/\'.SITE_TEMA.\'/new_order.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'new_order.view\');
$router->map(\'GET\', \'/siparislerim\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["login"]) {
$title.= \'Siparilerim\';
$slug = 1;
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM siparisler WHERE siparis_sahibi=\'$uye->username\' ")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); if($toplamsayfa==0){$toplamsayfa=1;} // Toplam Ka Sayfa Var
if($slug>$toplamsayfa){yonlendir($router->generate(\'my_orders.view\',[\'slug\'=>1]));}
/* Sayfalama */
$siparisler = $vt->prepare("SELECT * FROM siparisler WHERE siparis_sahibi=? ORDER BY id DESC LIMIT $nereden,$kactane");
$siparisler-> execute(array($uye->username));
$siparisler = $siparisler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/my_orders.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'my_orders.view\');
$router->map(\'GET\', \'/siparislerim/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["login"]) {
$title.= \'Siparilerim\';
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM siparisler WHERE siparis_sahibi=\'$uye->username\' ")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); if($toplamsayfa==0){$toplamsayfa=1;} // Toplam Ka Sayfa Var
if($slug>$toplamsayfa){yonlendir($router->generate(\'my_orders.view\',[\'slug\'=>1]));}
/* Sayfalama */
$siparisler = $vt->prepare("SELECT * FROM siparisler WHERE siparis_sahibi=? ORDER BY id DESC LIMIT $nereden,$kactane");
$siparisler-> execute(array($uye->username));
$siparisler = $siparisler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/my_orders.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'my_orderss.view\');
$router->map(\'GET\', \'/paketler\', function(){
global $vt,$title,$router,$siteayar,$uye,$urunler,$kategorilerfiyat;
$title.= \'Fiyat Listesi\';
include \'views/\'.SITE_TEMA.\'/price_list.view.php\';
exit();
},\'price_list.view\');
$router->map(\'GET\', \'/profil\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Profilim\';
include \'views/\'.SITE_TEMA.\'/my_setting.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'my_setting.view\');
$router->map(\'GET\', \'/odemelerim\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bodemeler,$bonlineodemeler;
if (@$_SESSION["login"]) {
$title.= \'demelerim\';
include \'views/\'.SITE_TEMA.\'/odemeler.view.php\';
}else{
yonlendir($router->generate(\'main.view\'));
}
exit();
},\'odemeler.view\');
$router->map(\'GET\', \'/mobil-onay\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["login"]) {
$title.= \'Anasayfa\';
include \'views/\'.SITE_TEMA.\'/mobile.view.php\';
}else{
yonlendir($router->generate(\'login.view\'));
}
exit();
},\'mobile.view\');
$router->map(\'POST\', \'/buypayer-odeme\', function(){
global $vt,$title,$router,$siteayar,$uye;
$tutar = str_replace(\'.\', \',\', $_POST["tutar"]);
$yontem = $_POST["yontem"];
$rand = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
$tarih = date("Y.m.d");
$ip = GetIP();
if ( $tutar >= 1 ) {
header(\'Content-Type: text/html; charset=utf-8\');
$postUrl=\'https://www.buypayer.com/receive2.asp\';
// itt alannda tahsil edilecek tutarda kuru olmas durumunda virgl kullannz "85,55" gibi
$xmlString=\'xml=<send>
<mgzid>\'.$siteayar->buypayer_magaza.\'</mgzid>
<itt>\'.$tutar.\'</itt>
<sipid>\'.$rand.\'</sipid>
<adsoyad>\'.$uye->adsoyad.\'</adsoyad>
<telefon>\'.$uye->telefon.\'</telefon>
<eposta>\'.$uye->email.\'</eposta>
<adres>Belirtilmemi</adres>
<urunadi>\'.$tutar.\' TL bakiye yklemesi</urunadi>
<gvk>\'.$siteayar->buypayer_guvenlik.\'</gvk>
<uyemail>\'.$siteayar->buypayer_mail.\'</uyemail>
</send>\';
$Veriler = $xmlString;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Veriler);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
curl_close($ch);
if($response){
$ekle = $vt->prepare("INSERT INTO buypayer_odemeler SET odeme_ip=?, odeme_ekstra=?, odeme_sahibi=?, odendimi=?, odeme_tutari=?, odeme_durum=?, odeme_tarih=?");
$ekle-> execute(array($ip,$rand,$uye->username,\'0\',$tutar,\'Beklemede\',$tarih));
$output = [\'t\'=>\'Baarl\',\'m\'=>\'Ltfen bekleyin deme sayfasna ynlendiriliyorsunuz\',\'s\'=>\'success\',\'r\'=>$response];
echo json_encode($output);
}else{
$output = [\'t\'=>\'Hata\',\'m\'=>\'deme ilemi balatlrken hata olutu ltfen daha sonra tekrar deneyin\',\'s\'=>\'error\'];
echo json_encode($output);
}
}else{
$output = [\'t\'=>\'Hata\',\'m\'=>\'Minimum deme miktar 1 TL\'dir\',\'s\'=>\'error\'];
echo json_encode($output);
}
},\'buypayer.post\');
$router->map(\'POST\', \'/paytr-odeme\', function(){
global $vt,$title,$router,$siteayar,$uye;
$tutar = $_POST["tutar"];
$yontem = $_POST["yontem"];
if ( $tutar >= 1 ) {
$tarih = date(\'Y-m-d H:i:s\');
$ip = GetIP();
$merchant_id = $siteayar->merchant_id; ## API Entegrasyon Bilgileri
$merchant_key = $siteayar->merchant_key; ## API Entegrasyon Bilgileri
$merchant_salt = $siteayar->merchant_salt; ## API Entegrasyon Bilgileri
$email = $uye->mail; ## Mterinizin sitenizde kaytl veya form vastasyla aldnz eposta adresi
$payment_amount = ($tutar+$tutar*10/100)*100; ## Tahsil edilecek tutar.
$merchant_oid = rand(10000,99999999); ## Sipari numaras
$user_name = $uye->adsoyad; ## Mterinizin sitenizde kaytl veya form araclyla aldnz ad ve soyad bilgisi
$user_address = "stanbul"; ## Mterinizin sitenizde kaytl veya form araclyla aldnz adres bilgisi
$user_phone = $uye->telefon; ## Mterinizin sitenizde kaytl veya form araclyla aldnz telefon bilgisi
$merchant_ok_url = "http://".$siteayar->site_url."online-odeme-basarili"; ## Baarl deme sonras mterinizin ynlendirilecei sayfa
$merchant_fail_url = "http://".$siteayar->site_url."online-odeme-basarisiz"; ## deme srecinde beklenmedik bir hata olumas durumunda mterinizin ynlendirilecei sayfa
$user_basket = base64_encode(json_encode(array(
array($tutar." TL Bakiye", $tutar, 1)
))); ## Mterinin sepet/sipari ierii
$user_ip = $ip;
$timeout_limit = "30"; ## lem zaman am sresi - dakika cinsinden
$debug_on = 1; ## Hata mesajlarnn ekrana baslmas iin entegrasyon ve test srecinde 1 olarak brakn. Daha sonra 0 yapabilirsiniz.
$test_mode = 0; ## Maaza canl modda iken test ilem yapmak iin 1 olarak gnderilebilir.
$no_installment = 0; // Taksit yaplmasn istemiyorsanz, sadece tek ekim sunacaksanz 1 yapn
$max_installment = 0; ## Sayfada grntlenecek taksit adedini snrlamak istiyorsanz uygun ekilde deitirin.
$currency = "TL";
####### Bu ksmda herhangi bir deiiklik yapmanza gerek yoktur. #######
if( $yontem != "eft" ){
$hash_str = $merchant_id .$user_ip .$merchant_oid .$email .$payment_amount .$user_basket.$no_installment.$max_installment.$currency.$test_mode;
$paytr_token=base64_encode(hash_hmac(\'sha256\',$hash_str.$merchant_salt,$merchant_key,true));
$post_vals=array(
\'merchant_id\'=>$merchant_id,
\'user_ip\'=>$user_ip,
\'merchant_oid\'=>$merchant_oid,
\'email\'=>$email,
\'payment_amount\'=>$payment_amount,
\'paytr_token\'=>$paytr_token,
\'user_basket\'=>$user_basket,
\'debug_on\'=>$debug_on,
\'no_installment\'=>$no_installment,
\'max_installment\'=>$max_installment,
\'user_name\'=>$user_name,
\'user_address\'=>$user_address,
\'user_phone\'=>$user_phone,
\'merchant_ok_url\'=>$merchant_ok_url,
\'merchant_fail_url\'=>$merchant_fail_url,
\'timeout_limit\'=>$timeout_limit,
\'currency\'=>$currency,
\'test_mode\'=>$test_mode
);
}else{
$hash_str=$merchant_id.$user_ip.$merchant_oid.$email.$payment_amount.$yontem.$test_mode;
$paytr_token=base64_encode(hash_hmac(\'sha256\',$hash_str.$merchant_salt,$merchant_key,true));
$post_vals=array(
\'merchant_id\'=>$merchant_id,
\'user_ip\'=>$user_ip,
\'merchant_oid\'=>$merchant_oid,
\'email\'=>$email,
\'payment_amount\'=>$payment_amount,
\'payment_type\'=>$yontem,
\'paytr_token\'=>$paytr_token,
\'debug_on\'=>$debug_on,
\'timeout_limit\'=>$timeout_limit,
\'test_mode\'=>$test_mode
);
}
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.paytr.com/odeme/api/get-token");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vals);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$result = @curl_exec($ch);
if(curl_errno($ch))
die("PAYTR IFRAME connection error. err:".curl_error($ch));
curl_close($ch);
$result=json_decode($result,1);
if($result[\'status\']==\'success\'){
$token = $result[\'token\'];
$ekle = $vt->prepare("INSERT INTO paytr_odemeler SET odeme_ip=?, odeme_ekstra=?, odeme_sahibi=?, odendimi=?, odeme_tutari=?, odeme_durum=?, odeme_tarih=?");
$ekle-> execute(array($ip,$merchant_oid,$uye->username,\'0\',$tutar,\'Beklemede\',$tarih));
$output = [\'t\'=>\'Baarl\',\'m\'=>\'Ltfen bekleyin deme sayfasna ynlendiriliyorsunuz\',\'s\'=>\'success\',\'r\'=>$router->generate(\'pay_tr.view\',[\'slug\'=>$token,\'url\'=>$yontem])];
echo json_encode($output);
}else{
$output = [\'t\'=>\'Hata\',\'m\'=>\'deme ilemi balatlrken hata olutu ltfen daha sonra tekrar deneyin\',\'s\'=>\'error\'];
echo json_encode($output);
}
}else{
$output = [\'t\'=>\'Hata\',\'m\'=>\'Minimum deme miktar 1 TL\'dir\',\'s\'=>\'error\'];
echo json_encode($output);
}
},\'payt_tr.post\');
$router->map(\'GET\', \'/online-odeme/[*:slug]/[*:url]\', function($slug,$url){
global $vt,$title,$router,$siteayar,$uye;
include \'views/default/header.view.php\';
if ( $url == "eft" ) {
$url = "https://www.paytr.com/odeme/api/";
} else {
$url = "https://www.paytr.com/odeme/guvenli/";
}
echo \'
<main id="app-main" class="app-main">
<div class="wrap">
<section class="app-content">
<div class="row">
<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
<iframe src="\'.$url.$slug.\'" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe>
<script>iFrameResize({},\'#paytriframe\');</script>
</div><!-- .row -->
</section><!-- #dash-content -->
</div><!-- .wrap -->
\';
include \'views/default/footer.view.php\';
},\'pay_tr.view\');
$router->map(\'GET\', \'/online-odeme-basarili\', function(){
global $vt,$title,$router,$siteayar,$uye;
include \'views/default/header.view.php\';
echo \'
<main id="app-main" class="app-main">
<div class="wrap">
<section class="app-content">
<div class="row">
<div class="alert alert-success alert-dismissible" role="alert">
<strong>Baarl! </strong>
<span>deme ileminiz tamamland, en ksa zamanla hesabnza aktarlacaktr.</span>
</div>
</div><!-- .row -->
</section><!-- #dash-content -->
</div><!-- .wrap -->
\';
include \'views/default/footer.view.php\';
},\'pay_tr_basarili.view\');
$router->map(\'GET\', \'/online-odeme-basarisiz\', function(){
global $vt,$title,$router,$siteayar,$uye;
include \'views/default/header.view.php\';
echo \'
<main id="app-main" class="app-main">
<div class="wrap">
<section class="app-content">
<div class="row">
<div class="alert alert-danger alert-dismissible" role="alert">
<strong>Baarsz! </strong>
<span>deme ileminiz tamamlanamad, ltfen daha sonra tekrar deneyin.</span>
</div>
</div><!-- .row -->
</section><!-- #dash-content -->
</div><!-- .wrap -->
\';
include \'views/default/footer.view.php\';
},\'pay_tr_basarisiz.view\');
## Kullanc POST lemleri ##
$router->map(\'POST\', \'/sifremi-unuttum\', function(){
global $vt,$title,$router,$siteayar,$uye;
$tur = $_POST["tur"];
$mail = $_POST["email"];
$telefon = str_replace(" ","",$_POST["telefon"]);
$tarih = date("Y.m.d H:i:s");
if ( $tur == \'telefon\' ) {
$sor = $vt->prepare("SELECT * FROM uyeler WHERE telefon=?");
$sor -> execute(array($telefon));
$uye = $sor->fetch(PDO::FETCH_OBJ);
}else{
$sor = $vt->prepare("SELECT * FROM uyeler WHERE mail=?");
$sor -> execute(array($mail));
$uye = $sor->fetch(PDO::FETCH_OBJ);
}
if ( $tur == \'secin\' || $tur == \'telefon\' && empty($telefon) || $tur == \'email\' && empty($mail) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( !$sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Girilen bilgiler ile uyuan kullanc bulunamad","s"=>"info"];
echo json_encode($output);
}elseif( $tur == \'telefon\' ){
## Onay Kodu Olutur ##
$kod = rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9);
$olustur = $vt->prepare("INSERT INTO sifremiunuttum SET sahibi=?, kod=?, tarih=?");
$olustur -> execute(array($uye->username,$kod,$tarih));
## Onay Kodunu Gnder ##
sifremiUnuttum($telefon,$kod);
}elseif( $tur == \'email\' ){
## Onay Kodu Olutur ##
$kod = rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9);
$olustur = $vt->prepare("INSERT INTO sifremiunuttum SET sahibi=?, kod=?, tarih=?");
$olustur -> execute(array($uye->username,$kod,$tarih));
## Onay Kodunu Gnder ##
sifremiUnuttumMail($uye->mail,"ifrenizi gncellemek iin gerekli kod olan: ".$kod,"Parolam unuttum");
}
exit();
},\'password_forget.post\');
$router->map(\'POST\', \'/sifremi-guncelle\', function(){
global $vt,$title,$router,$siteayar,$uye;
$kod = $_POST["kod"];
$yeni = $_POST["sifre"];
$pass = md5($_POST["sifre"]);
$sor = $vt->prepare("SELECT * FROM sifremiunuttum WHERE kod=?");
$sor -> execute(array($kod));
$kod = $sor->fetch(PDO::FETCH_OBJ);
$uye = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$uye -> execute(array($kod->sahibi));
$uye = $uye->fetch(PDO::FETCH_OBJ);
if ( empty($kod) || empty($yeni) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( !$sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Girilen kod geersiz","s"=>"info"];
echo json_encode($output);
}elseif(strlen($yeni)<6){
$output = ["t"=>"Bilgi","m"=>"Girdiiniz ifre 6 karakterden ksa olmamal","s"=>"info"];
echo json_encode($output);
}else{
$guncelle = $vt->prepare("UPDATE uyeler SET password=? WHERE username=?");
$guncelle -> execute(array($pass,$uye->username));
if ($guncelle) {
$output = ["t"=>"Mkemmel!","m"=>"ifreniz gncellendi, ynlendiriliyorsunuz","s"=>"success",\'r\'=>$router->generate(\'login.view\')];
echo json_encode($output);
$delete = $vt->prepare("DELETE FROM sifremiunuttum WHERE sahibi=?");
$delete -> execute(array($uye->username));
}else{
$output = ["t"=>"Hata","m"=>"ifreniz gncellenirken hata olutur.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'sifre_guncelle.post\');
$router->map(\'POST\', \'/kayit-ol\', function(){
global $vt,$title,$router,$siteayar;
$tarih = date("Y-m-d H:i:s");
$ad = ilkHarf($_POST["name"]);
$mail = $_POST["mail"];
$username = str_replace(" ", "", trCevir($_POST["username"]));
$password = $_POST["password"];
$phone = str_replace(" ", "", $_POST["phone"]);
$captcha = @$_POST[\'g-recaptcha-response\'];
$key = md5(apikeyOlustur(32).time());
$ksorgu = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$ksorgu -> execute(array($username));
$msorgu = $vt->prepare("SELECT * FROM uyeler WHERE mail=?");
$msorgu -> execute(array($mail));
$tsorgu = $vt->prepare("SELECT * FROM uyeler WHERE telefon=?");
$tsorgu -> execute(array($phone));
$googlesecret = "6Letw1MUAAAAAJehqausSNFkdcGUjsxQrLWtdvqM";
$robotkontrol = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$googlesecret&response=" . $captcha . "&remoteip=" . $_SERVER[\'REMOTE_ADDR\']);
$robotkontrol = json_decode($robotkontrol);
if (empty($ad) || empty($mail) || empty($username) || empty($password) || empty($phone)) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
echo json_encode($output);
}elseif (!$captcha) {
$output = ["t"=>"Hata","m"=>"Robot olmadnz kantlayn","s"=>"error"];
echo json_encode($output);
}elseif($ksorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Bu kullanc ad daha nce kullanlm.","s"=>"info"];
echo json_encode($output);
}elseif(!filter_var($mail,FILTER_VALIDATE_EMAIL)) {
$output = ["t"=>"Bilgi","m"=>"Girdiiniz mail format hatal.","s"=>"info"];
echo json_encode($output);
}elseif($msorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Bu mail adresi daha nce kullanlm.","s"=>"info"];
echo json_encode($output);
}elseif (strlen($password)<6) {
$output = ["t"=>"Bilgi","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"info"];
echo json_encode($output);
}elseif($tsorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Bu telefon numaras daha nce kullanlm.","s"=>"info"];
echo json_encode($output);
}elseif( $robotkontrol->success == \'false\' ){
$output = ["t"=>"Hata","m"=>"Ltfen robot olmadnz onaylayn.","s"=>"error"];
echo json_encode($output);
}else{
$kod = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
$password = md5($_POST["password"]);
$insert = $vt->prepare("INSERT INTO uyeler SET adsoyad=?, mail=?, username=?, password=?, telefon=?, uyeliktarihi=?, apikey=?, bakiye=?, onay=?, yetki=?, avatar=?");
$insert-> execute(array($ad,$mail,$username,$password,$phone,$tarih,$key,0,0,\'Mteri\',\'default_avatar_jpg\'));
if ($insert) {
if ($siteayar->sms_onay) {
$kodekle = $vt->prepare("INSERT INTO onay_kodlari SET onay_sahibi=?, onay_kodu=?, onay_tarihi=?");
$kodekle-> execute(array($username,$kod,$tarih));
yeniuyeSMS($phone,$kod);
}
$output = ["t"=>"Mkemmel!","m"=>"Kayt ileminiz baaryla sonuland, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'login.view\')];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'register.post\');
$router->map(\'POST\', \'/bakiye-ekle-banka\', function(){
global $vt,$title,$router,$siteayar,$uye;
$odemeBanka = $_POST["odemeBanka"];
$odemeTutar = $_POST["odemeTutar"];
$tarih = date("Y-m-d H:i:s");
if ( empty($odemeBanka) || $odemeBanka=="yok" || empty($odemeTutar) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$ekle = $vt->prepare("INSERT INTO banka_odemeler SET odeme_sahibi=?, odeme_banka=?, odeme_tutar=?, odeme_tarih=?, odeme_durum=?, odendimi=? ");
$ekle -> execute(array($uye->username,$odemeBanka,$odemeTutar,$tarih,\'Beklemede\',0));
if ($ekle) {
$output = ["t"=>"Mkemmel!","m"=>"deme talebiniz alnd.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"deme talebi srasnda hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'add_banka.post\');
$router->map(\'POST\', \'/paywant-odeme\', function(){
global $vt,$title,$router,$siteayar,$uye;
$bakiyeYontem = $_POST["bakiyeYontem"];
$bakiyeTutar = $_POST["bakiyeTutar"];
if ( $bakiyeYontem == 1 ) {
$yontemNasil = "Mobil deme";
}elseif ( $bakiyeYontem == 2 ) {
$yontemNasil = "Kredi Kart";
}elseif ( $bakiyeYontem == 3 ) {
$yontemNasil = "Havale/Eft/Atm";
}
if ( empty($bakiyeTutar) || empty($bakiyeYontem) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $bakiyeTutar < 10 ){
$output = ["t"=>"Bilgi","m"=>"10 TL altndaki deme ilemi yaplamaz.","s"=>"info"];
echo json_encode($output);
}else{
## PAYYWANT DEME BALA ##
$apiKey = $siteayar->paywant_api; // PAYWANT API
$apiSecret = $siteayar->paywant_secret; // API GIZLI ANAHTAR
$userID = $uye->id; // BAKIYE EKLENECEK KULLANICI ID
$userEmail = $uye->mail; // BAKIYE EKLENECEK KULLANICI EMAL
$userIPAdresi = GetIP();
$extraData = rand(10000,99999999);
$hashOlustur = base64_encode(hash_hmac(\'sha256\',"$userEmail|$userEmail|$userID".$apiKey,$apiSecret,true));
$postData = array(
\'apiKey\' => $apiKey,
\'hash\' => $hashOlustur,
\'returnData\'=> $userEmail,
\'userEmail\' => $userEmail,
\'userIPAddress\' => $userIPAdresi,
\'userID\' => $userID,
\'proApi\' => TRUE,
\'productData\' => [
"name" => $bakiyeTutar." TL Tutarnda Bakiye (".$extraData.")",
"amount" => $bakiyeTutar* 111,
"extraData" => $extraData,
"paymentChannel" => $bakiyeYontem, // 1 Mobil deme, 2 Kredi Kart,3 Banka Havale/Eft/Atm,4 Trk Telekom deme (TTNET),5 Mikrocard,6 CashU
"commissionType" => 2 // 1 seilirse komisyonu bizden al, 2 olursa komisyonu mteri desin
]
);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://api.paywant.com/gateway.php",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => http_build_query($postData),
));
$response = curl_exec($curl); $err = curl_error($curl);
if ($err){
// echo "cURL Error #:" . $err; // cURL hatasn ekrana bastr
$output = ["t"=>"Hata","m"=>"Beklenmedik bir hata olutu, ltfen daha sonra tekrar deneyin.","s"=>"error"];
echo json_encode($output);
}else{
$jsonDecode = json_decode($response,false);
if($jsonDecode->Status == 100){
$tarih = date("Y-m-d H:i:s");
$ekle = $vt->prepare("INSERT INTO paywant_odemeler SET odeme_ekstra=?, odeme_sahibi=?, odeme_kanali=?, odeme_tutari=?, odeme_net=?, odeme_durum=?, odeme_tarih=?");
$ekle-> execute(array($extraData,$uye->username,$yontemNasil,$bakiyeTutar,\'Cevap bekleniyor\',\'Beklemede\',$tarih));
$output = ["t"=>"Mkemmel!","m"=>"deme ileminiz iin deme sayfasna ynlendiriliyorsunuz, ltfen bekleyin.","s"=>"success","r"=> $jsonDecode->Message];
echo json_encode($output);
}else{
// echo $response; // Dnen hatann ne olduunu bastr
$output = ["t"=>"Hata","m"=>"Beklenmedik bir hata olutu, ltfen daha sonra tekrar deneyin.","s"=>"error"];
echo json_encode($output);
}
}
curl_close($curl);
## PAYWANT DEME BTR ##
}
exit();
},\'add_paywant.post\');
$router->map(\'POST|GET\', \'/paywant-odeme-kabul\', function(){
global $vt,$title,$router,$siteayar,$uye;
## PAYWANT DEME KABUL BALA ##
$apiKey = $siteayar->paywant_api; // PAYWANT API
$apiSecret = $siteayar->paywant_secret; // API GIZLI ANAHTAR
if ($_POST){
$SiparisID = $_POST["SiparisID"];
$ExtraData = $_POST["ExtraData"];
$UserID = $_POST["UserID"];
$ReturnData = $_POST["ReturnData"];
$Status = $_POST["Status"];
$OdemeKanali = $_POST["OdemeKanali"];
$OdemeTutari = $_POST["OdemeTutari"];
$NetKazanc = $_POST["NetKazanc"];
$Hash = $_POST["Hash"];
if ($SiparisID != "" || $ExtraData != "" || $UserID != "" || $ReturnData != "" || $Status != "" || $OdemeKanali != "" || $OdemeTutari !="" || $NetKazanc != "" || $Hash != ""){
$hashKontrol = base64_encode(hash_hmac(\'sha256\',"$SiparisID|$ExtraData|$UserID|$ReturnData|$Status|$OdemeKanali|$OdemeTutari|$NetKazanc" . $apiKey, $apiSecret, true));
if ($Hash == $hashKontrol){
if ($Status == 100) {
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE id=?");
$uyesor-> execute(array($UserID));
$uyecek = $uyesor->fetch(PDO::FETCH_OBJ);
if ( $uyesor->rowCount() ) {
$odemesor = $vt->prepare("SELECT * FROM paywant_odemeler WHERE odeme_ekstra=? && odendimi=?");
$odemesor-> execute(array($ExtraData,0));
if ( $odemesor->rowCount() ) {
$odemecek = $odemesor->fetch(PDO::FETCH_OBJ);
$eklenecek = $odemecek->odeme_tutari;
$bakiye = $vt->prepare("UPDATE uyeler SET bakiye=? WHERE id=?");
$bakiye-> execute(array($uyecek->bakiye+$eklenecek,$UserID));
if ($bakiye) {
$duzelt = $vt->prepare("UPDATE paywant_odemeler SET odendimi=?, odeme_net=?, odeme_durum=? WHERE odeme_ekstra=?");
$duzelt-> execute(array(1,$eklenecek,\'Onayland\',$ExtraData));
$tarih = date("Y.m.d H:i:s");
$kazanc = $vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
$kazanc -> execute(array($eklenecek,$tarih));
echo "OK";
}else{
echo "NO - BAKYE EKLENEMED";
}
}else{
echo "NO - DEME DAHA NCE YAPILMI";
}
}else{
echo "NO - BYLE KULLANICI YOK";
}
}else{
$duzelt = $vt->prepare("UPDATE paywant_odemeler SET odeme_net=?, odeme_durum=? WHERE odeme_ekstra=?");
$duzelt-> execute(array($eklenecek,\'ptal\',$ExtraData));
echo \'NO - DEME PTAL EDLM\';
}
}else{
echo \'NO - HASH HATALI\';
}
}else{
echo \'NO - PARAMETRE EKSIK\';
}
}else{
echo \'NO - POST YOK\';
}
## PAYWANT DEME KABUL BTR ##
},\'add_paywant_accept.post\');
$router->map(\'POST\', \'/mobil-onay\', function(){
global $vt,$title,$router,$siteayar,$uye;
$onay_kodu = $_POST["onay_kodu"];
$sor = $vt->prepare("SELECT * FROM onay_kodlari WHERE onay_sahibi=? && onay_kodu=?");
$sor -> execute(array($uye->username,$onay_kodu));
if ( empty($onay_kodu) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$update = $vt->prepare("UPDATE uyeler SET onay=? WHERE username=?");
$update-> execute(array(1,$uye->username));
$sil = $vt->prepare("DELETE FROM onay_kodlari WHERE onay_sahibi=?");
$sil -> execute(array($uye->username));
if ( $update ) {
$output = ["t"=>"Mkemmel!","m"=>"Hesabnz onayland, artk sipari vermeye hazrsnz.","s"=>"success","r"=>$router->generate(\'main.view\')];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Hesabnz onaylanamad.","s"=>"error"];
echo json_encode($output);
}
}else{
$output = ["t"=>"Hata","m"=>"Onay kodunu yanl girdiniz.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'mobile.post\');
$router->map(\'POST\', \'/giris-yap\', function(){
global $vt,$title,$router,$siteayar;
$mail = $_POST["mail"];
$password = md5($_POST["password"]);
$remember = @$_POST["remember"];
$ksorgu = $vt->prepare("SELECT * FROM uyeler WHERE mail=? && password=?");
$ksorgu -> execute(array($mail,$password));
$kbilgi = $ksorgu ->fetch(PDO::FETCH_OBJ);
if ( empty($mail) || empty($_POST["password"]) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
echo json_encode($output);
}elseif(!$ksorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Kullanc adnz ya da parolanz hatal.","s"=>"info"];
echo json_encode($output);
}else{
$_SESSION["login"] = true;
$_SESSION["username"] = $kbilgi->username;
if( @$remember == true ) { setcookie(\'username\',$kbilgi->username,time()+60*60*24*7); }
$output = ["t"=>"Mkemmel!","m"=>"Kullanc girii yapld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'main.view\')];
echo json_encode($output);
}
exit();
},\'login.post\');
$router->map(\'POST\', \'/admin/giris-yap\', function(){
global $vt,$title,$router,$siteayar;
$mail = $_POST["mail"];
$password = md5($_POST["password"]);
$ksorgu = $vt->prepare("SELECT * FROM uyeler WHERE mail=? && password=? && yetki=?");
$ksorgu -> execute(array($mail,$password,\'Admin\'));
$kbilgi = $ksorgu ->fetch(PDO::FETCH_OBJ);
if ( empty($mail) || empty($_POST["password"]) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
echo json_encode($output);
}elseif(!$ksorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Kullanc adnz ya da parolanz hatal.","s"=>"info"];
echo json_encode($output);
}else{
$_SESSION["adminlogin"] = true;
$_SESSION["admin"] = true;
$_SESSION["username"] = $kbilgi->username;
$output = ["t"=>"Mkemmel!","m"=>"Admin girii yapld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'admin_main.view\')];
echo json_encode($output);
}
exit();
},\'adminlogin.post\');
$router->map(\'POST\', \'/profil\', function(){
global $vt,$title,$router,$siteayar,$uye;
$password = md5($_POST["password"]);
$ypass = md5($_POST["npassword"]);
$yypass = $_POST["nnpassword"];
if ( empty($_POST["password"]) || empty($_POST["npassword"]) || empty($_POST["nnpassword"]) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($uye->password!=$password){
$output = ["t"=>"Bilgi","m"=>"Geerli parolanz yanl girdiniz.","s"=>"info"];
echo json_encode($output);
}elseif( strlen($_POST["npassword"])<6 ){
$output = ["t"=>"Bilgi","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"info"];
echo json_encode($output);
}elseif( $_POST["npassword"] != $_POST["nnpassword"] ){
$output = ["t"=>"Bilgi","m"=>"Girilen yeni ifreler birbirinin ayns olmal.","s"=>"info"];
echo json_encode($output);
}else{
$update = $vt->prepare("UPDATE uyeler SET password=? WHERE username=? ");
$update -> execute(array($ypass,$uye->username));
if ($update) {
$output = ["t"=>"Mkemmel!","m"=>"Parolanz baar ile gncellediniz.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Parolanz gncellerken bir hata ile karlatk.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'my_setting.post\');
$router->map(\'POST\', \'/yeni-siparis\', function(){
global $vt,$title,$router,$siteayar,$uye,$smmapi;
$kategori = $_POST["servisKat"];
$miktar = $_POST["servisMiktar"];
$bakiye = $uye->bakiye;
$urun = $_POST["servisUrun"];
$link = $_POST["servisLink"];
$user = $uye->username;
$gonderiSayi = @$_POST["gonderiSayi"];
$gecikme = @$_POST["gecikme"];
$otoMin = @$_POST["otoMin"];
$otoMak = @$_POST["otoMak"];
$yorumlar = @$_POST["yorumlar"];
$yorumsayi = count(explode("
",$yorumlar));
$urunbilgi= $vt->prepare("SELECT * FROM urunler WHERE id=?");
$urunbilgi-> execute(array($urun));
$urunbilgi= $urunbilgi->fetch(PDO::FETCH_OBJ); if($urunbilgi->urun_secenegi=="Paket"){$miktar="1";}
if($urunbilgi->urun_secenegi==\'Paket\'){$miktar=$urunbilgi->urun_min;}
$api = $vt->prepare("SELECT * FROM api WHERE id=?");
$api -> execute(array($urunbilgi->urun_api));
$api = $api->fetch(PDO::FETCH_OBJ);
$ozelfiyat= $vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
$ozelfiyat-> execute(array($user,$urun));
$ozelsay = $ozelfiyat->rowCount();
$ozelfiyat= $ozelfiyat->fetch(PDO::FETCH_OBJ);
if ($ozelsay) {
if ( @$urunbilgi->urun_secenegi == \'Paket\' ) {
$fiyat = $ozelfiyat->fiyat_fiyat;
$miktar = @$urunbilgi->urun_min;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Servis\' ) {
$fiyat = $miktar*($ozelfiyat->fiyat_fiyat/1000);
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Yorum\' ) {
$fiyat = $yorumsayi*($ozelfiyat->fiyat_fiyat/1000);
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Abonelik\' ) {
$fiyat = $miktar*$ozelfiyat->fiyat_fiyat;
$miktar = 1;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}
}else{
if ( @$urunbilgi->urun_secenegi == \'Paket\' ) {
$fiyat = @$urunbilgi->urun_fiyat;
$miktar = @$urunbilgi->urun_min;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Servis\' ) {
$fiyat = @$urunbilgi->urun_birim*$miktar;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Yorum\' ) {
$fiyat = @$urunbilgi->urun_birim*$yorumsayi;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}elseif ( @$urunbilgi->urun_secenegi == \'Abonelik\' ) {
$fiyat = @$urunbilgi->urun_birim*$miktar;
$miktar = 1;
$ybakiye = $bakiye-$fiyat;
$tarih = date("Y-m-d H:i:s");
$servis = $urunbilgi->id;
}
}
if ( $urun==\'0\' || $kategori==\'kategorisec\' || empty($link) || ( $urunbilgi->urun_secenegi=="Servis" && empty($miktar) ) || ( $urunbilgi->urun_secenegi=="Yorum" && empty($yorumlar) ) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
echo json_encode($output);
}elseif( $bakiye<$fiyat ){
$output = ["t"=>"Bilgi","m"=>"Bakiyeniz yetersiz.","s"=>"info"];
echo json_encode($output);
}elseif( $urunbilgi->urun_secenegi == "Abonelik" && empty($gonderiSayi) ){
$output = ["t"=>"Bilgi","m"=>"Gnderi saysn doldurmalsnz","s"=>"info"];
echo json_encode($output);
}elseif( $urunbilgi->urun_secenegi==\'Servis\' && $miktar<$urunbilgi->urun_min ){
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
echo json_encode($output);
}elseif( $urunbilgi->urun_secenegi==\'Yorum\' && $yorumsayi<$urunbilgi->urun_min ){
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
echo json_encode($output);
}elseif ( $urunbilgi->urun_secenegi==\'Yorum\' && $yorumsayi>$urunbilgi->urun_max ) {
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
echo json_encode($output);
}elseif( $urunbilgi->urun_secenegi==\'Abonelik\' && $otoMin<$urunbilgi->urun_min ){
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
echo json_encode($output);
}elseif ($miktar>$urunbilgi->urun_max) {
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
echo json_encode($output);
}elseif ( $urunbilgi->urun_secenegi==\'Abonelik\' && $otoMak>$urunbilgi->urun_max ) {
$output = ["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
echo json_encode($output);
}else{
if ($urunbilgi->urun_api=="Manuel") {
$apiSiparis = array("order"=>"Manuel");
$apiSiparis = (object) $apiSiparis;
$api_order_id = 1;
}elseif( $api->api_tercih == "Takipcial.net" ){
$post = array(
\'type\' => \'neworder\',
\'service\' => \'follow\',
\'username\' => $link,
\'quantity\' => $miktar,
);
$takipci = takipcialnetAPI( $post, $api->api_api, $api->api_url );
$takipcialnet = json_decode($takipci);
$api_order_id = @$takipcialnet->callback->orderid;
}elseif( $api->api_tercih == \'Begenikasma.com\' ){
$apiSiparis = begenikasmaAPI($api->api_api,$api->api_url,$link,$miktar);
$apiSiparis = json_decode($apiSiparis);
$api_order_id = @$apiSiparis->order_id;
}elseif( $api->api_tercih == \'jnsta.mobi\' ){
$fapi = new socialsmedia_api($api->api_api);
$data = array(
\'cmd\' => \'orderadd\',\'orders\' => array(
0 => array(\'service\' => $urunbilgi->urun_api_servis,\'amount\' => $miktar, \'data\' => $link,))
);
$result = $fapi->query($data);
$api_order_id = @$result[0][0][id];
}elseif( $api->api_tercih == \'Sosyalpazarim.com\' ){
$apiSiparis = sosyalpazarimAl($miktar,$link,$api->api_api);
$apiSiparisSosyal = json_decode($apiSiparis);
$api_order_id = 1;
}elseif( $api->api_tercih == \'Ytmatikvip.com\' ){
$apiSiparis = YTMatikal($api->api_api,$api->api_url,$urunbilgi->urun_api_servis,$link,$miktar);
$apiSiparisSosyal = json_decode($apiSiparis);
$api_order_id = @$apiSiparis->order;
}elseif( $api->api_tercih == \'Hizmetpaneli.com\' ){
$apiSiparis = hizmetpaneliSatin($api->api_api,$urunbilgi->urun_api_servis,$miktar,$link,$api->api_url);
$apiSiparisSosyal = json_decode($apiSiparis);
$api_order_id = @$apiSiparis->order;
}else{
if ( $urunbilgi->urun_secenegi == "Abonelik" ) {
$apiSiparis = $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'username\'=>$link,\'min\'=>$otoMin,\'max\'=>$otoMak,\'posts\'=>$gonderiSayi,\'delay\'=>$gecikme),$api->api_url);
$api_order_id = $apiSiparis->order;
}elseif( $urunbilgi->urun_secenegi == "Yorum" ) {
$apiSiparis = $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'link\'=>$link,\'comments\'=>$yorumlar),$api->api_url);
$api_order_id = $apiSiparis->order;
}else{
$apiSiparis = $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'link\'=>$link,\'quantity\'=>$miktar),$api->api_url);
$api_order_id = @$apiSiparis->order;
}
}
if ( @$apiSiparis->order || $api_order_id || @$takipcialnet->status==\'success\' || @$apiSiparisSosyal->islem==\'basarili\' ) {
$siparis = $vt->prepare("INSERT INTO siparisler SET siparis_sahibi=?, siparis_servis=?, urun_api_order_id=?, siparis_durum=?, siparis_miktar=?, siparis_tutar=?, siparis_link=?, siparis_tarih=?");
$siparis-> execute(array($user,$servis,$api_order_id,\'Beklemede\',$miktar,$fiyat,$link,$tarih));
if ($siparis) {
$output = ["t"=>"Mkemmel!","m"=>"Sipariiniz verildi.","s"=>"success"];
echo json_encode($output);
$bakiye = $vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
$bakiye-> execute(array($ybakiye,$user));
//siparisMail(\'[email protected]\',\'Yeni sipariiniz mevcut.\',\'Sipari Bilgilendirme\');
}elseif($apiSiparis->error){
$output = ["t"=>"Bilgi","m"=>"Sipari verilirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}else{
$output = ["t"=>"Bilgi","m"=>"Sipari verilirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_order.post\');
$router->map(\'POST\', \'/yeni-destek-talebi\', function(){
global $vt,$title,$router,$siteayar,$uye;
$konu = $_POST["konu"];
$baslik = $_POST["baslik"];
$icerik = $_POST["icerik"];
$tarih = date("Y-m-d H:i:s");
$sorgu = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ");
$sorgu-> execute(array($uye->username,\'Ak\'));
if ( empty($konu) || empty($baslik) || empty($icerik) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($sorgu->rowCount()){
$output = ["t"=>"Bilgi","m"=>"Halen zlmemi bir destek talebin var.","s"=>"info"];
echo json_encode($output);
}else{
$talep = $vt->prepare("INSERT INTO destek_talepler SET talep_sahibi=?, talep_tarihi=?, talep_baslik=?, talep_konu=?, talep_durum=? ");
$talep -> execute(array($uye->username,$tarih,$baslik,$konu,\'Ak\'));
$id = $vt->lastInsertId();
$talepi = $vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
if ($talep) {
$output = ["t"=>"Mkemmel!","m"=>"Destek talebiniz oluturuldu, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'all_tickets.view\')];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Destek talebiniz oluturulurken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_ticket.post\');
$router->map(\'POST\', \'/talebe-cevap-ver-[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
$id = $slug;
$icerik = $_POST["icerik"];
$tarih = date("Y-m-d H:i:s");
$sorgu = $vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
$sorgu-> execute(array($id));
if ( empty($icerik) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($sorgu->rowCount()<0){
$output = ["t"=>"Bilgi","m"=>"Byle bir destek talebi yok.","s"=>"info"];
echo json_encode($output);
}else{
$talepi = $vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
if ($talepi) {
$edit = $vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
$edit -> execute(array(\'Ak\',$id));
$output = ["t"=>"Mkemmel!","m"=>"Destek talebine cevap verdiniz, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'all_tickets.view\')];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Destek talebine destek verirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_reply.post\');
$router->map(\'POST\', \'/ajax-isleri\', function(){
global $vt,$title,$router,$siteayar,$uye;
$durum = $_POST["durum"];
if ($durum==1) {
$id = $_POST["id"];
$urunler = $vt->prepare("SELECT * FROM urunler WHERE urun_kategori=? && durum=?");
$urunler -> execute(array($id,\'1\'));
$say = $urunler->rowCount();
$urunler = $urunler->fetchAll(PDO::FETCH_OBJ);
if ($id=="kategorisec") {
echo \'<option value="0">Ltfen nce kategori sein..</option>\';
}else{
if ($say) {
foreach ($urunler as $urun) {
echo \'<option value="\'.$urun->id.\'">\'.$urun->urun_adi.\'</option>\';
}
}else{
echo \'<option value="0">Bu Kategoride rn Bulunmamaktadr.</option>\';
}
}
}
if ($durum==2) {
$id = $_POST["id"];
$ozelfiyat= $vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
$ozelfiyat-> execute(array($uye->username,$id));
$ozelsay = $ozelfiyat->rowCount();
$ozelfiyat= $ozelfiyat->fetch(PDO::FETCH_OBJ);
$urun = $vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
$urun -> execute(array($id,\'1\'));
$urun = $urun->fetch(PDO::FETCH_OBJ);
if ($ozelsay>0) {
echo $ozelfiyat->fiyat_fiyat/1000;
}else{
if ($urun->urun_secenegi=="Servis" || $urun->urun_secenegi=="Yorum") {
echo $urun->urun_birim;
}elseif($urun->urun_secenegi=="Paket"){
echo $urun->urun_birim*1000;
}
}
}
if ($durum==3) {
$id = $_POST["id"];
$urun = $vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
$urun -> execute(array($id,\'1\'));
$urun = $urun->fetch(PDO::FETCH_OBJ);
echo $urun->urun_secenegi;
}
if ($durum==4) {
$id = $_POST["id"];
$urun = $vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
$urun -> execute(array($id,\'1\'));
$urun = $urun->fetch(PDO::FETCH_OBJ);
if ( strlen($urun->urun_aciklama)>5 ) {
echo $urun->urun_aciklama;
}else{
echo \'0\';
}
}
if ($durum==5) {
$yorumlar = $_POST["yorumlar"];
echo count(explode("
",$yorumlar));
exit();
}
},\'urunleri_cek.post\');
## Admin GET lemleri ##
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'\', function(){
global $vt,$title,$router,$siteayar,$uye,$kazanc,$bayisayisi,$odemesayisi,$talepsayisi;
if (@$_SESSION["admin"]) {
$title.= \'Anasayfa\';
include \'views/\'.SITE_TEMA.\'/admin/main.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_main.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/giris-yap\', function(){
global $vt,$title,$router,$siteayar;
if (@!$_SESSION["admin"]) {
$title.= \'Giri Yap\';
include \'views/\'.SITE_TEMA.\'/admin/login.view.php\';
}else{
yonlendir($router->generate(\'admin_main.view\'));
}
exit();
},\'admin_login.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/haberler\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
if (@$_SESSION["admin"]) {
$title.= \'Haberler\';
include \'views/\'.SITE_TEMA.\'/admin/news.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_new.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/yeni-haber\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
if (@$_SESSION["admin"]) {
$title.= \'Haberler\';
include \'views/\'.SITE_TEMA.\'/admin/new_news.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_news.new.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/haber-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
if (@$_SESSION["admin"]) {
$title.= \'Haber Dzenle\';
$haber = $vt->prepare("SELECT * FROM haberler WHERE id=?");
$haber-> execute(array($slug));
$haber = $haber->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/edit_news.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_news.edit.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/odemeler\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$odemeler;
if (@$_SESSION["admin"]) {
$title.= \'demeler\';
include \'views/\'.SITE_TEMA.\'/admin/odemeler.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_odemeler.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/paywant-odemeler/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'Paywant demeleri\';
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM paywant_odemeler WHERE odeme_durum=\'Onayland\' ")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
if($verisay!=0){if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_paywant_odemeler.view\',[\'slug\'=>1]));}}
/* Sayfalama */
$odemeler = $vt->prepare("SELECT * FROM paywant_odemeler WHERE odeme_durum=? ORDER BY id DESC LIMIT $nereden,$kactane");
$odemeler -> execute(array(\'Onayland\'));
$odemeler = $odemeler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/paywant_odemeler.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_paywant_odemeler.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/paytr-odemeler/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'Paywant demeleri\';
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM paytr_odemeler WHERE odendimi=\'1\' ")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
if($verisay!=0){if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_paytr_odemeler.view\',[\'slug\'=>1]));}}
/* Sayfalama */
$odemeler = $vt->prepare("SELECT * FROM paytr_odemeler WHERE odendimi=? ORDER BY id DESC LIMIT $nereden,$kactane");
$odemeler -> execute(array(\'1\'));
$odemeler = $odemeler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/paytr_odemeler.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_paytr_odemeler.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/odeme-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$odemeler;
if (@$_SESSION["admin"]) {
$title.= \'deme Dzenle\';
$odeme = $vt->prepare("SELECT * FROM banka_odemeler WHERE id=?");
$odeme-> execute(array($slug));
$odeme = $odeme->fetch(PDO::FETCH_OBJ);
$banka = $vt->prepare("SELECT * FROM banka_hesaplari WHERE id=?");
$banka-> execute(array($odeme->odeme_banka));
$banka = $banka->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/odeme.edit.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_odeme.edit.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesap-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
if (@$_SESSION["admin"]) {
$title.= \'Banka Hesab Ekle\';
include \'views/\'.SITE_TEMA.\'/admin/bank.account.new.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'bank_account.new.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesaplari\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
if (@$_SESSION["admin"]) {
$title.= \'Banka Hesaplar\';
include \'views/\'.SITE_TEMA.\'/admin/bank.account.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'bank_accounts.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesap/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
if (@$_SESSION["admin"]) {
$title.= \'Banka Hesab Dzenle\';
$banka = $vt->prepare("SELECT * FROM banka_hesaplari WHERE id=?");
$banka-> execute(array($slug));
$banka = $banka->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/bank.account.edit.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'bank_account.edit.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparis-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["admin"]) {
$title.= \'Sipari Dzenle\';
$siparis = $vt->prepare("SELECT * FROM siparisler WHERE id=?");
$siparis-> execute(array($slug));
$siparis = $siparis->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/order.edit.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_order_edit.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparisler\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["admin"]) {
$title.= \'Sipariler\';
$slug = 1;
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM siparisler")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_orderss.view\',[\'slug\'=>1]));}
/* Sayfalama */
$siparisler = $vt->prepare("SELECT * FROM siparisler ORDER BY id DESC LIMIT $nereden,$kactane");
$siparisler-> execute(array());
$siparisler = $siparisler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/orders.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_orders.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparisler/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["admin"]) {
$title.= \'Sipariler\';
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM siparisler")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_orderss.view\',[\'slug\'=>1]));}
/* Sayfalama */
$siparisler = $vt->prepare("SELECT * FROM siparisler ORDER BY id DESC LIMIT $nereden,$kactane");
$siparisler-> execute(array());
$siparisler = $siparisler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/orders.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_orderss.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/api-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'API Olutur\';
include \'views/\'.SITE_TEMA.\'/admin/new_api.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'new_api.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/apiler\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
if (@$_SESSION["admin"]) {
$title.= \'Sistemdeki API Servisleri\';
include \'views/\'.SITE_TEMA.\'/admin/api.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'api.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/api-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'API Olutur\';
$api = $vt->prepare("SELECT * FROM api WHERE id=?");
$api-> execute(array($slug));
$api = $api->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/edit_api.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'edit_api.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/kategoriler\', function(){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'Sistemdeki rn Kategorileri\';
include \'views/\'.SITE_TEMA.\'/admin/all_categories.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'all_categories.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urun-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye,$apiler,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'Yeni rn Ekle\';
include \'views/\'.SITE_TEMA.\'/admin/new_product.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'new_product.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urunler\', function(){
global $vt,$title,$router,$siteayar,$uye,$urunlerr;
if (@$_SESSION["admin"]) {
$title.= \'rnler\';
include \'views/\'.SITE_TEMA.\'/admin/all_product.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'all_product.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urun-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$apiler,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'rn Dzenle\';
$urun = $vt->prepare("SELECT * FROM urunler WHERE id=?");
$urun-> execute(array($slug));
$urun = $urun->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/edit_product.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'edit_product.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye-ara\', function(){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'ye Ara\';
$kelime = $_GET["ara"];
$tip = $_GET["tip"];
if ( $tip == \'mail\' ) {
$sor = $vt->prepare("SELECT * FROM uyeler WHERE mail LIKE ? ");
$sor -> execute(array("%".$kelime."%"));
}elseif( $tip == \'telefon\' ){
$sor = $vt->prepare("SELECT * FROM uyeler WHERE telefon LIKE ? ");
$sor -> execute(array("%".$kelime."%"));
}elseif( $tip == \'username\' ){
$sor = $vt->prepare("SELECT * FROM uyeler WHERE username LIKE ?\' ");
$sor -> execute(array("%".$kelime."%"));
}elseif( $tip == \'ad\' ){
$sor = $vt->prepare("SELECT * FROM uyeler WHERE adsoyad LIKE ?\' ");
$sor -> execute(array("%".$kelime."%"));
}
/* Sayfalama */
if ( $tip == \'mail\' ) {
$uyeler = $vt->prepare("SELECT * FROM uyeler WHERE mail LIKE ? ORDER BY id DESC");
$uyeler -> execute(array("%".$kelime."%"));
$uyeler = $uyeler->fetchAll(PDO::FETCH_OBJ);
}elseif( $tip == \'telefon\' ){
$uyeler = $vt->prepare("SELECT * FROM uyeler WHERE telefon LIKE ? ORDER BY id DESC");
$uyeler -> execute(array("%".$kelime."%"));
$uyeler = $uyeler->fetchAll(PDO::FETCH_OBJ);
}elseif( $tip == \'username\' ){
$uyeler = $vt->prepare("SELECT * FROM uyeler WHERE username LIKE ? ORDER BY id DESC");
$uyeler -> execute(array("%".$kelime."%"));
$uyeler = $uyeler->fetchAll(PDO::FETCH_OBJ);
}elseif( $tip == \'ad\' ){
$uyeler = $vt->prepare("SELECT * FROM uyeler WHERE adsoyad LIKE ? ORDER BY id DESC");
$uyeler -> execute(array("%".$kelime."%"));
$uyeler = $uyeler->fetchAll(PDO::FETCH_OBJ);
}
include \'views/\'.SITE_TEMA.\'/admin/ara_users.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'ara_users.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uyeler/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
$title.= \'Sistemdeki yeler\';
/* Sayfalama */
$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
$kactane = 10; // Sayfada Ka Veri Gzksn
$nereden = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
$verisay = $vt->query("SELECT * FROM uyeler")->rowCount(); // Ka Tane Veri Var
$toplamsayfa = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
if($slug>$toplamsayfa){yonlendir($router->generate(\'all_users.view\',[\'slug\'=>1]));}
/* Sayfalama */
$uyeler = $vt->prepare("SELECT * FROM uyeler ORDER BY id DESC LIMIT $nereden,$kactane");
$uyeler -> execute(array());
$uyeler = $uyeler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/all_users.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'all_users.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyatlar\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$urunler;
if (@$_SESSION["admin"]) {
$title.= \'yeye zel Fiyatlandrma\';
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE id=?");
$uyesor-> execute(array($slug));
if (!$uyesor = $uyesor->fetch(PDO::FETCH_OBJ)) {
yonlendir($router->generate(\'admin_main.view\'));
}
include \'views/\'.SITE_TEMA.\'/admin/private_price.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'private_price.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye,$kategoriler;
if (@$_SESSION["admin"]) {
if ( $slug == "[*:slug]") {
$slug = $_GET["slug"];
}
$title.= \'ye Bilgileri\';
$uyebilgi = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$uyebilgi -> execute(array($slug));
$uyesay = $uyebilgi->rowCount();
$uyebilgi = $uyebilgi->fetch(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/edit_user.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'edit_user.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'Destek Talepleri\';
$talepler = $vt->prepare("SELECT * FROM destek_talepler ORDER BY id DESC");
$talepler-> execute(array());
$talepler = $talepler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_tickets.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/bekleyenler\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'Destek Talepleri\';
$talepler = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
$talepler-> execute(array(\'Ak\'));
$talepler = $talepler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'login.view\'));
}
exit();
},\'admin_tickets_bekleyenler.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/yanitlanmis\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'Destek Talepleri\';
$talepler = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
$talepler-> execute(array(\'Yantland\'));
$talepler = $talepler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_tickets_yanitlandi.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/kapali\', function(){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'Destek Talepleri\';
$talepler = $vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
$talepler-> execute(array(\'Kapal\'));
$talepler = $talepler->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_tickets_kapali.view\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talep/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if (@$_SESSION["admin"]) {
$title.= \'Destek Talepleri\';
$talep = $vt->prepare("SELECT * FROM destek_talep_cevap WHERE talep_id=? ORDER BY id ASC");
$talep-> execute(array($slug));
$talep = $talep->fetchAll(PDO::FETCH_OBJ);
include \'views/\'.SITE_TEMA.\'/admin/read_ticket.view.php\';
}else{
yonlendir($router->generate(\'admin_login.view\'));
}
exit();
},\'admin_ticket_read.view\');
## SMS Yolla ##
$router->map(\'POST\', \'/toplu-sms\', function(){
global $vt,$title,$router,$siteayar,$uye;
$mesaj = $_POST["sms"];
topluSMS($mesaj);
exit();
},\'toplu_sms.post\');
$router->map(\'POST\', \'/sms-yolla-[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$uyesor-> execute(array($slug));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$mesaj = $_POST["sms"];
uyeyeSMS($uyesor->telefon,$mesaj);
exit();
},\'send_sms.post\');
$router->map(\'POST\', \'/yeni-kod-yolla\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( $uye->onay == 0 ) {
$onaysor = $vt->prepare("SELECT * FROM onay_kodlari WHERE onay_sahibi=?");
$onaysor-> execute(array($uye->username));
if ( $onaysor->rowCount() ) {
$onaysor = $onaysor->fetch(PDO::FETCH_OBJ);
$t = date("Hi");
$t2 = date("Hi", strtotime($onaysor->onay_tarihi));
if ( $t-$t2 > 3 ) {
tekrarkodSMS($uye->telefon,$onaysor->onay_kodu);
}else{
$output = ["t"=>"Bilgi","m"=>"Yeni kod alabilmek iin son kod istemenizin stnden 3 dakika gemeli","s"=>"info"];
echo json_encode($output);
}
}else{
$tarih = date("Y-m-d H:i:s");
$kod = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
$kodekle = $vt->prepare("INSERT INTO onay_kodlari SET onay_sahibi=?, onay_kodu=?, onay_tarihi=?");
$kodekle-> execute(array($uye->username,$kod,$tarih));
if ($kodekle) {
tekrarkodSMS($uye->telefon,$kod);
}else{
$output = ["t"=>"Hata","m"=>"Kod gnderilirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
}else{
$output = ["t"=>"Bilgi","m"=>"Hesabnz zaten onayl.","s"=>"info"];
echo json_encode($output);
}
exit();
},\'onay_kodu.again.post\');
## Admin POST lemleri ##
$router->map(\'POST\', \'/\'.$siteayar->site_admin, function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$sozlesme = $_POST["ckEditor"];
$site_url = $_POST["site_url"];
$site_title = $_POST["site_title"];
$site_description = $_POST["site_description"];
$site_keywords = $_POST["site_keywords"];
$site_admin = $_POST["site_admin"];
$sms_saglayici = $_POST["sms_saglayici"];
$sms_baslik = $_POST["sms_baslik"];
$sms_kadi = $_POST["sms_kadi"];
$sms_sifre = $_POST["sms_sifre"];
$sms_onay = $_POST["sms_onay"];
$paywant_aktif = $_POST["paywant_aktif"];
$paywant_api = $_POST["paywant_api"];
$paywant_secret = $_POST["paywant_secret"];
$merchant_id = $_POST["merchant_id"];
$merchant_key = $_POST["merchant_key"];
$merchant_salt = $_POST["merchant_salt"];
$odeme_tipi = $_POST["odeme_tipi"];
$buypayer_magaza = $_POST["buypayer_magaza"];
$buypayer_mail = $_POST["buypayer_mail"];
$buypayer_guvenlik = $_POST["buypayer_guvenlik"];
if ( empty($site_url) || empty($site_title) || empty($site_description) || empty($site_keywords) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$edit = $vt->prepare("UPDATE siteayar SET
buypayer_magaza=?,buypayer_mail=?,buypayer_guvenlik=?,
merchant_id=?,merchant_key=?,merchant_salt=?,odeme_tipi=?,sozlesme=?, site_url=?, site_title=?, site_description=?, site_keywords=?, site_admin=?, paywant_aktif=?, paywant_api=?, paywant_secret=?, sms_saglayici=?, sms_baslik=?, sms_kadi=?, sms_sifre=?, sms_onay=? WHERE id=?");
$edit-> execute(array($buypayer_magaza,$buypayer_mail,$buypayer_guvenlik,$merchant_id,$merchant_key,$merchant_salt,$odeme_tipi,$sozlesme,$site_url,$site_title,$site_description,$site_keywords,$site_admin,$paywant_aktif,$paywant_api,$paywant_secret,$sms_saglayici,$sms_baslik,$sms_kadi,$sms_sifre,$sms_onay,1));
if ($edit) {
$output = ["t"=>"Mkemmel!","m"=>"Sistem bilgileri gncellendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$site_admin];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Sistem bilgileri gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'admin_main.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$uyecek = $vt->prepare("SELECT * FROM uyeler WHERE id=?");
$uyecek-> execute(array($slug));
$uyecek = $uyecek->fetch(PDO::FETCH_OBJ);
$delete = $vt->prepare("DELETE FROM uyeler WHERE id=?");
$delete-> execute(array($slug));
if ($delete) {
$delete = $vt->prepare("DELETE FROM siparisler WHERE siparis_sahibi=?");
$delete-> execute(array($uyecek->username));
$delete = $vt->prepare("DELETE FROM paywant_odemeler WHERE odeme_sahibi=?");
$delete-> execute(array($uyecek->username));
$delete = $vt->prepare("DELETE FROM fiyatlandirma WHERE fiyat_sahibi=?");
$delete-> execute(array($uyecek->username));
$delete = $vt->prepare("DELETE FROM destek_talepler WHERE talep_sahibi=?");
$delete-> execute(array($uyecek->username));
$delete = $vt->prepare("DELETE FROM destek_talep_cevap WHERE talep_user=?");
$delete-> execute(array($uyecek->username));
$delete = $vt->prepare("DELETE FROM banka_odemeler WHERE odeme_sahibi=?");
$delete-> execute(array($uyecek->username));
$output = ["t"=>"Mkemmel!","m"=>"ye sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_users.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"ye kaldrrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'delete_user.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$haber_baslik = $_POST["haber_baslik"];
$haber_icerik = $_POST["haber_icerik"];
if ( empty($haber_baslik) || empty($haber_icerik) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$duzelt = $vt->prepare("UPDATE haberler SET haber_baslik=?, haber_icerik=? WHERE id=?");
$duzelt-> execute(array($haber_baslik,$haber_icerik,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"Yeni haber dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Haber dzenlenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'admin_news.edit.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$haber_baslik = $_POST["haber_baslik"];
$haber_icerik = $_POST["haber_icerik"];
$tarih = date("Y-m-d H:i:s");
if ( empty($haber_baslik) || empty($haber_icerik) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$ekle = $vt->prepare("INSERT INTO haberler SET haber_baslik=?, haber_icerik=?, haber_tarih=?");
$ekle-> execute(array($haber_baslik,$haber_icerik,$tarih));
if ($ekle) {
$output = ["t"=>"Mkemmel!","m"=>"Yeni haber eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Haber eklenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'admin_news.new.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$delete = $vt->prepare("DELETE FROM haberler WHERE id=?");
$delete-> execute(array($slug));
if ($delete) {
$output = ["t"=>"Mkemmel!","m"=>"Haber sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Haber kaldrlrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'admin_news.delete.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/odeme-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$odeme_durum = $_POST["odeme_durum"];
$odeme = $vt->prepare("SELECT * FROM banka_odemeler WHERE id=?");
$odeme-> execute(array($slug));
$odeme = $odeme->fetch(PDO::FETCH_OBJ);
$sahip = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$sahip-> execute(array($odeme->odeme_sahibi));
$sahip = $sahip->fetch(PDO::FETCH_OBJ);
if ( $odeme->odendimi == 0 && $odeme_durum == \'Onayland\' ) {
$bakiye = $vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
$bakiye-> execute(array($sahip->bakiye+$odeme->odeme_tutar,$odeme->odeme_sahibi));
$odendi = $vt->prepare("UPDATE banka_odemeler SET odendimi=? WHERE id=?");
$odendi-> execute(array(1,$slug));
$tarih = date("Y.m.d H:i:s");
$kazanc = $vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
$kazanc -> execute(array($odeme->odeme_tutar,$tarih));
}
if ( empty($odeme_durum) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$duzelt = $vt->prepare("UPDATE banka_odemeler SET odeme_durum=? WHERE id=?");
$duzelt-> execute(array($odeme_durum,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"deme dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_odemeler.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"deme gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'admin_odeme.edit.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap-ekle\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["ad"];
$iban = $_POST["iban"];
$hesap = $_POST["hesap"];
$sube = $_POST["sube"];
$alici = $_POST["alici"];
$logo = $_POST["logo"];
if ( empty($ad) || empty($iban) || empty($alici) || empty($logo) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$ekle = $vt->prepare("INSERT INTO banka_hesaplari SET banka_ad=?, banka_iban=?, banka_hesapno=?, banka_sube=?, banka_alici=?, banka_logo=?");
$ekle-> execute(array($ad,$iban,$hesap,$sube,$alici,$logo));
if ($ekle) {
$output = ["t"=>"Mkemmel!","m"=>"Banka bilgileri eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Banka bilgileri eklenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'bank_account.new.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["ad"];
$iban = $_POST["iban"];
$hesap = $_POST["hesap"];
$sube = $_POST["sube"];
$alici = $_POST["alici"];
$logo = $_POST["logo"];
if ( empty($ad) || empty($iban) || empty($alici) || empty($logo) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$duzelt = $vt->prepare("UPDATE banka_hesaplari SET banka_ad=?, banka_iban=?, banka_hesapno=?, banka_sube=?, banka_alici=?, banka_logo=? WHERE id=?");
$duzelt-> execute(array($ad,$iban,$hesap,$sube,$alici,$logo,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"Banka bilgileri dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Banka bilgileri gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'bank_account.edit.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$duzelt = $vt->prepare("UPDATE banka_hesaplari SET banka_durum=? WHERE id=?");
$duzelt-> execute(array(\'0\',$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"Banka bilgileri sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Banka bilgileri kaldrlrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'bank_account.delete.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/siparis-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$durum = $_POST["durum"];
$sor = $vt->prepare("SELECT * FROM siparisler WHERE id=? ");
$sor -> execute(array($slug));
$sor = $sor->fetch(PDO::FETCH_OBJ);
if ( empty($durum) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}else{
$insert = $vt->prepare("UPDATE siparisler SET siparis_durum=? WHERE id=?");
$insert-> execute(array($durum,$slug));
if ($insert) {
if ( $sor->siparis_durum!="ptal" && $durum == "ptal" ) {
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE username=? ");
$uyesor -> execute(array($sor->siparis_sahibi));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$bakiye = $uyesor->bakiye+$sor->siparis_tutar;
$update = $vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
$update-> execute(array($bakiye,$sor->siparis_sahibi));
}
$output = ["t"=>"Mkemmel!","m"=>"Sipari baaryla gncellendir, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_orders.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Sipari gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'admin_order_edit.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-olustur\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["adi"];
$url = $_POST["url"];
$api = $_POST["api"];
$trch = $_POST["api_tercih"];
$sor = $vt->prepare("SELECT * FROM api WHERE api_url=? ");
$sor -> execute(array($url));
if ( empty($ad) || empty($url) || empty($api) || empty($trch)) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu API URL\'i sistemde zaten kaytl.","s"=>"info"];
echo json_encode($output);
}else{
$insert = $vt->prepare("INSERT INTO api SET api_adi=?, api_url=?, api_api=?, api_tercih=?");
$insert-> execute(array($ad,$url,$api,$trch));
if ($insert) {
$output = ["t"=>"Mkemmel!","m"=>"API sisteme baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"API sisteme eklenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_api.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["adi"];
$url = $_POST["url"];
$api = $_POST["api"];
$trch = $_POST["api_tercih"];
$sor = $vt->prepare("SELECT * FROM api WHERE api_url=? && id!=? ");
$sor -> execute(array($url,$slug));
if ( empty($ad) || empty($url) || empty($api) || empty($trch) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu API URL\'i sistemde zaten kaytl.","s"=>"info"];
echo json_encode($output);
}else{
$update = $vt->prepare("UPDATE api SET api_adi=?, api_url=?, api_api=?, api_tercih=? WHERE id=?");
$update-> execute(array($ad,$url,$api,$trch,$slug));
if ($update) {
$output = ["t"=>"Mkemmel!","m"=>"API bilgileriniz dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"API bilgileri dzenlenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'edit_api.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$delete = $vt->prepare("DELETE FROM api WHERE id=?");
$delete-> execute(array($slug));
if ($delete) {
$output = ["t"=>"Mkemmel!","m"=>"API servisi kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"API servisini kaldrrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'delete_api.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-olustur\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["adi"];
$sira = $_POST["sira"];
$sor = $vt->prepare("SELECT * FROM kategoriler WHERE kategori_adi=? ");
$sor -> execute(array($ad));
if ( empty($ad) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu kategori zaten sistemde kaytl.","s"=>"info"];
echo json_encode($output);
}else{
$insert = $vt->prepare("INSERT INTO kategoriler SET kategori_adi=?, sira=?");
$insert-> execute(array($ad,$sira));
if ($insert) {
$output = ["t"=>"Mkemmel!","m"=>"Kategori baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Kategori sisteme eklenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_category.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$delete = $vt->prepare("DELETE FROM kategoriler WHERE id=?");
$delete-> execute(array($slug));
if ($delete) {
$output = ["t"=>"Mkemmel!","m"=>"Kategori kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Kategori kaldrrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'delete_category.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-durum/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$kat = $vt->prepare("SELECT * FROM kategoriler WHERE id=?");
$kat-> execute(array($slug));
$kat = $kat->fetch(PDO::FETCH_OBJ);
if ( $kat->durum == 1 ) {
$durum = 0 ;
$etki = \'pasif\';
}else{
$durum = 1 ;
$etki = \'aktif\';
}
$edit = $vt->prepare("UPDATE kategoriler SET durum=? WHERE id=?");
$edit-> execute(array($durum,$slug));
if ($edit) {
$output = ["t"=>"Mkemmel!","m"=>"Kategori ".$etki."letirildi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Kategori ".$etki."letirilirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'pasif_category.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$ad = $_POST["adi"];
$sira = $_POST["sira"];
$sor = $vt->prepare("SELECT * FROM kategoriler WHERE kategori_adi=? && id!=? ");
$sor -> execute(array($ad,$slug));
$sor2 = $vt->query("SELECT * FROM kategoriler WHERE id=\'$slug\' ")->fetch(PDO::FETCH_OBJ);
if ( empty($ad) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu kategori sistemde zaten kaytl.","s"=>"info"];
echo json_encode($output);
}else{
$update = $vt->prepare("UPDATE kategoriler SET kategori_adi=?, sira=? WHERE id=?");
$update-> execute(array($ad,$sira,$slug));
if ($update) {
$output = ["t"=>"Mkemmel!","m"=>"Kategori bilgileriniz dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"Kategori bilgileri dzenlenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'edit_category.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/yeni-urun\', function(){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$api_servis = $_POST["api_servis"];
$aciklama = $_POST["aciklama"];
$kategori = $_POST["kategori"];
$fiyat = $_POST["fiyat"];
@$birim = $fiyat/1000;
$url = $_POST["baglanti"];
$min = $_POST["min"];
$mak = $_POST["mak"];
$api = $_POST["api"];
$ad = $_POST["adi"];
$sor = $vt->prepare("SELECT * FROM urunler WHERE urun_api=? && urun_api_servis=? WHERE durum=\'1\' ");
$sor -> execute(array($api,$api_servis));
if ( empty($ad) || empty($api) || empty($mak) || empty($min) || empty($url) || empty($fiyat) || empty($kategori) || empty($api_servis) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($mak<$min){
$output = ["t"=>"Bilgi","m"=>"Maksimum sipari miktarnz minimum sipari miktarndan ufak olamaz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu API ve servis ile kaytl rn zaten var.","s"=>"info"];
echo json_encode($output);
}else{
$insert = $vt->prepare("INSERT INTO urunler SET urun_adi=?, urun_aciklama=?, urun_fiyat=?, urun_birim=?, urun_secenegi=?, urun_kategori=?, urun_min=?, urun_max=?, urun_api=?, urun_api_servis=?");
$insert-> execute(array($ad,$aciklama,$fiyat,$birim,$url,$kategori,$min,$mak,$api,$api_servis));
if ($insert) {
$output = ["t"=>"Mkemmel!","m"=>"rn sisteme baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"rn sisteme eklenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_product.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-sil/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$delete = $vt->prepare("UPDATE urunler SET durum=? WHERE id=?");
$delete-> execute(array(0,$slug));
if ($delete) {
$output = ["t"=>"Mkemmel!","m"=>"rn hizmetten kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"rn hizmetten kaldrrken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'delete_product.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-durum/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$urun = $vt->prepare("SELECT * FROM urunler WHERE id=?");
$urun-> execute(array($slug));
$urun = $urun->fetch(PDO::FETCH_OBJ);
if ( $urun->durum == 1 ) {
$durum = 2 ;
$etki = \'pasif\';
}elseif( $urun->durum == 2 ){
$durum = 1 ;
$etki = \'aktif\';
}
$edit = $vt->prepare("UPDATE urunler SET durum=? WHERE id=?");
$edit-> execute(array($durum,$slug));
if ($edit) {
$output = ["t"=>"Mkemmel!","m"=>"rn ".$etki."letirildi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"rn ".$etki."letirilirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
exit();
},\'pasif_product.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-duzenle/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$api_servis = $_POST["api_servis"];
$aciklama = $_POST["aciklama"];
$kategori = $_POST["kategori"];
$fiyat = $_POST["fiyat"];
$birim = $fiyat/1000;
$url = $_POST["baglanti"];
$min = $_POST["min"];
$mak = $_POST["mak"];
$api = $_POST["api"];
$ad = $_POST["adi"];
$sor = $vt->prepare("SELECT * FROM urunler WHERE urun_api=? && urun_api_servis=? && id!=? ");
$sor -> execute(array($api,$api_servis,$slug));
if ( empty($ad) || empty($api) || empty($mak) || empty($min) || empty($url) || empty($fiyat) || empty($kategori) || empty($api_servis) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($mak<$min){
$output = ["t"=>"Bilgi","m"=>"Maksimum sipari miktarnz minimum sipari miktarndan ufak olamaz.","s"=>"info"];
echo json_encode($output);
}elseif( $sor->rowCount() ){
$output = ["t"=>"Bilgi","m"=>"Bu API ve servis ile kaytl rn zaten var.","s"=>"info"];
echo json_encode($output);
}else{
$update = $vt->prepare("UPDATE urunler SET urun_adi=?, urun_aciklama=?, urun_fiyat=?, urun_birim=?, urun_secenegi=?, urun_kategori=?, urun_min=?, urun_max=?, urun_api=?, urun_api_servis=? WHERE id=?");
$update-> execute(array($ad,$aciklama,$fiyat,$birim,$url,$kategori,$min,$mak,$api,$api_servis,$slug));
if ($update) {
$output = ["t"=>"Mkemmel!","m"=>"rn baaryla dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"rn dzenlenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'edit_product.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/talebe-cevap-ver-[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$id = $slug;
$icerik = $_POST["icerik"];
$tarih = date("Y-m-d H:i:s");
$sorgu = $vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
$sorgu-> execute(array($id));
if ( empty($icerik) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($sorgu->rowCount()<0){
$output = ["t"=>"Bilgi","m"=>"Byle bir destek talebi yok.","s"=>"info"];
echo json_encode($output);
}else{
$talepi = $vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
if ($talepi) {
$edit = $vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
$edit -> execute(array(\'Yantland\',$id));
$output = ["t"=>"Mkemmel!","m"=>"Destek talebine cevap verdiniz, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'admin_tickets_bekleyenler.view\')];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Destek talebine destek verirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'new_reply_admin.post\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'talep-durum-ac-[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$sor = $vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
$sor-> execute(array($slug));
$sor = $sor->fetch(PDO::FETCH_OBJ);
if ( $sor->talep_durum == "Ak" ) {
$output = ["t"=>"Hata","m"=>"Talep zaten ak durumda.","s"=>"error"];
echo json_encode($output);
}else{
$edit = $vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
$edit-> execute(array("Ak",$slug));
if ($edit) {
$output = ["t"=>"Mkemmel!","m"=>"Destek talebi durumu deitirildi.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Destek talebi durumu deitirilemedi.","s"=>"error"];
echo json_encode($output);
}
}
exit();
}, \'talep_ac.post\');
$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'talep-durum-kapa-[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$sor = $vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
$sor-> execute(array($slug));
$sor = $sor->fetch(PDO::FETCH_OBJ);
if ( $sor->talep_durum == "Kapal" ) {
$output = ["t"=>"Hata","m"=>"Talep zaten kapal durumda.","s"=>"error"];
echo json_encode($output);
}else{
$edit = $vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
$edit-> execute(array("Kapal",$slug));
if ($edit) {
$output = ["t"=>"Mkemmel!","m"=>"Destek talebi durumu deitirildi.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"Destek talebi durumu deitirilemedi.","s"=>"error"];
echo json_encode($output);
}
}
exit();
}, \'talep_kapat.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/bakiye\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$uyesor-> execute(array($slug));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$tarih = date("Y.m.d H:i:s");
$miktar = $_POST["miktar"];
$islem = $_POST["islem"];
if ( $islem == \'ekle\' ) {
$bakiye = $uyesor->bakiye+$miktar;
$durum = \'ekleme\';
}elseif ( $islem == \'eksilt\' ) {
$bakiye = $uyesor->bakiye-$miktar;
$durum = \'eksiltme\';
}else{
$durum = \'bos\';
}
if ( empty($miktar) || empty($islem) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif( $durum == "bos" ){
$output = ["t"=>"Bilgi","m"=>"lem uan iin gerekletirilemiyor.","s"=>"info"];
echo json_encode($output);
}else{
$duzelt = $vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
$duzelt -> execute(array($bakiye,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>$miktar." TL tutarnda bakiye ".$durum." ilemi gerekletirildi.","s"=>"success"];
echo json_encode($output);
if ( $islem == \'ekle\' ) {
$kazanc = $vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
$kazanc -> execute(array($miktar,$tarih));
}
}else{
$output = ["t"=>"Hata","m"=>"ye bakiye ilemi srasnda hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'add_balance_user.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyatlar/[*:slug2]\', function($slug,$slug2){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE id=?");
$uyesor-> execute(array($slug));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$urunsor = $vt->prepare("SELECT * FROM urunler WHERE id=?");
$urunsor-> execute(array($slug2));
$urunsor = $urunsor->fetch(PDO::FETCH_OBJ);
$fiyat = $_POST["fiyat"];
$sor = $vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=? ");
$sor -> execute(array($uyesor->username,$slug2));
if ( empty($fiyat) ) {
$output = ["t"=>"Bilgi","m"=>"Fiyat alann doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif($sor->rowCount()){
$update = $vt->prepare("UPDATE fiyatlandirma SET fiyat_fiyat=? WHERE fiyat_sahibi=? && fiyat_servis=?");
$update-> execute(array($fiyat,$uyesor->username,$slug2));
if ($update) {
$output = ["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi baarl.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"yeye zel fiyatlandrma ilemi srasnda hata olutu.","s"=>"error"];
echo json_encode($output);
}
}else{
$insert = $vt->prepare("INSERT INTO fiyatlandirma SET fiyat_fiyat=?, fiyat_sahibi=?, fiyat_servis=?");
$insert-> execute(array($fiyat,$uyesor->username,$slug2));
if ($insert) {
$output = ["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi baarl.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"yeye zel fiyatlandrma ilemi srasnda hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'private_price.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyat-sil/[*:slug2]\', function($slug,$slug2){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE id=?");
$uyesor-> execute(array($slug));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$sor = $vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=? ");
$sor -> execute(array($uyesor->username,$slug2));
if($sor->rowCount()){
$delete = $vt->prepare("DELETE FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
$delete-> execute(array($uyesor->username,$slug2));
if ($delete) {
$output = ["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi silindi.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata!","m"=>"yeye zel fiyatlandrma silinirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'private_price_delete.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
$uyesor-> execute(array($slug));
$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
$telefon = str_replace(" ","",$_POST["telefon"]);
$adsoyad = ilkHarf($_POST["adsoyad"]);
$yetki = $_POST["yetki"];
$mail = $_POST["mail"];
$onay = $_POST["onay"];
if ( empty($adsoyad) || empty($mail) || empty($yetki) || empty($telefon) ) {
$output = ["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
echo json_encode($output);
}elseif(!filter_var($mail,FILTER_VALIDATE_EMAIL)){
$output = ["t"=>"Bilgi","m"=>"Girilen mail format yanl.","s"=>"info"];
echo json_encode($output);
}else{
$duzelt = $vt->prepare("UPDATE uyeler SET adsoyad=?, mail=?, telefon=?, yetki=?, onay=? WHERE username=?");
$duzelt -> execute(array($adsoyad,$mail,$telefon,$yetki,$onay,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"ye bilgileri gncellendi.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"ye bilgileri gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'edit_user.post\');
$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye-pass/[*:slug]\', function($slug){
global $vt,$title,$router,$siteayar,$uye;
if ( !$_SESSION[\'admin\'] ) { exit; }
$pass = $_POST["pass"];
if ( empty($pass) || strlen($pass) < 6 ) {
$output = ["t"=>"Bilgi","m"=>"Parola 6 karakterden ksa olamaz.","s"=>"info"];
echo json_encode($output);
}else{
$pass = md5($_POST["pass"]);
$duzelt = $vt->prepare("UPDATE uyeler SET password=? WHERE username=?");
$duzelt -> execute(array($pass,$slug));
if ($duzelt) {
$output = ["t"=>"Mkemmel!","m"=>"ye ifresi gncellendi.","s"=>"success"];
echo json_encode($output);
}else{
$output = ["t"=>"Hata","m"=>"ye ifresi gncellenirken hata olutu.","s"=>"error"];
echo json_encode($output);
}
}
exit();
},\'edit_user_pass.post\');
$match = $router->match();
if( $match && is_callable( $match[\'target\'] ) ) {
call_user_func_array( $match[\'target\'], $match[\'params\'] );
} else {
header( $_SERVER["SERVER_PROTOCOL"] . \' 404 Not Found\');
}
?>'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCg0KDQoNCnJlcXVpcmUoJ2xpc2Fucy5waHAnKTsvL2xpc2Fucy5waHAgZG9zeWFzaW5pIGVrbGUNCiRsaXNhbnNbJ3NpdGUnXT1nZXRlbnYoJ0hUVFBfSE9TVCcpOy8vc2l0ZSBkb21haW5pbmkgYWwNCmlmIChzdWJzdHIoJGxpc2Fuc1snc2l0ZSddLCAwLCA0KSA9PSAid3d3LiIpLy9kb21haW4gYmFzaW5kYWtpIHd3dy4gdmFybWkgeW9rbXUga29udHJvbCBldA0KJGxpc2Fuc1snc2l0ZSddPXN1YnN0cigkbGlzYW5zWydzaXRlJ10sNCk7Ly93d3cuIHNpbCB2ZSBzYWRlY2UgZG9tYWluLmNvbSBvbGFyYWsgYWRyZXNpIGFsDQogDQokYmFzID0gIk1ZQS0iOy8vTGlzYW5zIGtvZHUgYmHFn8SxbmEgaXN0ZWRpxJ9pbml6IHlhesSxIGVrbGVuZWJpbGlyDQokc29uID0gIi0yMDE4IjsvL0xpc2FucyBrb2R1IHNvbnVuYSBpc3RlZGnEn2luaXogeWF6xLEgZWtsZW5lYmlsaXINCiRtID0gIm1kNSI7Ly9tZDUgc2lmcmVsZW1lIA0KJHMgPSAic2hhMSI7Ly9zaGExIHNpZnJlbGVtZSANCiANCiANCiRsaXNhbnNbJ2hhc2gnXT13b3Jkd3JhcChzdHJ0b3VwcGVyKCRzICgkcyAoJHMgKCRzICgkbSAoJHMgKCRzICgkbSAoJGxpc2Fuc1snc2l0ZSddLmRhdGUoJ1ltZCcpKSkpKSkpKSkpLDUsJy0nLHRydWUpOy8vbGlzYW5zIGtvZHVudSBvbHVzdHVyIHZlIDUga2FyYWt0ZXJkZSBiaXIgLSBrb3kNCiRsaXNrb2QgPSAkbGlzYW5zWydoYXNoJ107DQokY2V2aXI9c3RycmV2KCRsaXNrb2QpOy8vbGlzYW5zIGtvZHVudSB0ZXJzaW5lIGNldmlyDQokYmNzID0gIiRiYXMkY2V2aXIkc29uIjsNCiANCmlmKCRiY3MhPT0kbGlzYW5za29kdSkvL2xpc2FucyBrb2R1bnUga29udHJvbCBldCBmYXJrIHZhcnNhIHN1bnVjdXlhIGJhZ2xhbiAtIDI0IHNhYXR0ZSBiaXIgbGlzYW5zIGtvZHUgZGVnaXNpcg0Kew0KJGxpc2Fuc19jZXZhcD1maWxlX2dldF9jb250ZW50cygnaHR0cDovL2luc3RhLmFkYW5hYmlsaXNpbS5uZXQvbGlzYW5zL2tvbnRyb2wucGhwP3NpdGU9Jy4kbGlzYW5zWydzaXRlJ10pOy8vbGlzYW5zIHN1bnVjdXN1bmRhbiBsaXNhbnMga29udHJvbHUgeWFwDQppZigkbGlzYW5zX2NldmFwIT0nTElTQU5TTEknKS8vc3VudWN1ZGFuIGdlbGVuIGNldmFwIExJU0FOU0xJIGRlZ2lsc2UNCiANCmRpZSgnQnUgc2l0ZXllIGFpdCBsaXNhbnMgYnVsdW5hbWFkaSEhISBMdXRmZW4gbGlzYW5zIGFsbWFrIGljaW4gc29ydW5zdXpzY3JpcHQuY29tIGFkcmVzaW5pIHppeWFyZXQgZWRpbml6Jyk7Ly9saXNhbnMgZ2VjZXJzaXogbWVzYWppIHZlcmlsaXIgaXNsZW0gZHVydXINCiANCiRseWF6ID0gZm9wZW4oJ2xpc2Fucy5waHAnLCJ3KyIpOy8vbGlzYW5zLnBocCBkb3N5YXNpbmkgYWMgeWVuaSBsaXNhbnMga29kdW51IHlheiBidSBkb3N5YSB5YXrEsWxhYmlsaXIgb2xtYWzEsWTEsXINCkBmd3JpdGUoJGx5YXosJzw/cGhwDQovKioNCiAgICBTb3J1bnN1eiBTY3JpcHQgUGhwIExpc2FucyBTaXN0ZW1pDQogICAgDQogICAgDQogICAgQnUgZG9zeWF5YSBoZXJoYW5naSBiaXIgbGlzYW5zIGtvZHUgeWF6bWFuaXogZ2VyZWttZXoNCiAgICBBbG1pcyBvbGR1Z3VudXogdXJ1bmUgYWl0IGxpc2FucyBzaXN0ZW1kZSBha3RpZiBvbGR1Z3VuZGENCiAgICBMaXNhbnMga29kdW51eiBvdG9tYXRpayBvbGFyYWsgZ2lyaWxlY2VrdGlyLg0KCQ0KCVllbmkgbGlzYW5zIGFsbWFrIGljaW4gd3d3LnNvcnVuc3V6c2NyaXB0LmNvbSBhZHJlc2luaSB6aXlhcmV0IGVkZWJpbGlyc2luaXoNCiANCiAqLw0KJGxpc2Fuc2tvZHU9IicuJGJjcy4nIjsNCj8+Jyk7DQpmY2xvc2UoJGx5YXopOw0KfQ0KDQoNCglyZXF1aXJlX29uY2UgJ3N5cy9jb25maWcucGhwJzsNCglyZXF1aXJlX29uY2UgJ3ZlbmRvci9hdXRvbG9hZC5waHAnOw0KDQoJJHJvdXRlcgk9IG5ldyBBbHRvUm91dGVyKCk7DQoJDQoJJHNtbWFwaQkJPQluZXcgU01NQXBpKCk7DQoNCgl1c2UgUEhQTWFpbGVyXFBIUE1haWxlclxQSFBNYWlsZXI7DQoJdXNlIFBIUE1haWxlclxQSFBNYWlsZXJcRXhjZXB0aW9uOw0KCSRtYWlsID0gbmV3IFBIUE1haWxlcih0cnVlKTsNCg0KDQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9hcGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRzbW1hcGk7DQogICAgCXJlcXVpcmVfb25jZSAnYXBpLnBocCc7DQoJCQlleGl0KCk7DQoJfSwnYXBpLnZpZXd3Jyk7DQoNCgkjIyBLdWxsYW7EsWPEsSBHRVQgxLDFn2xlbWxlcmkgIyMNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc2lwYXJpc2xlciwkaGFiZXJsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0FuYXNheWZhJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9tYWluLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdsb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnbWFpbi52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Nvemxlc21lbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc2lwYXJpc2xlciwkaGFiZXJsZXI7DQoJCQkJCSR0aXRsZS49CSdTw7Z6bGXFn21lbGVyaW1peic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvc296bGVzbWUudmlldy5waHAnOw0KCQkJCQlleGl0KCk7DQoJfSwnc296bGVzbWVsZXIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9jaWtpcy15YXAnLCBmdW5jdGlvbigpew0KCQkJZ2xvYmFsICRyb3V0ZXI7DQoJCQl1bnNldCgkX1NFU1NJT05bImxvZ2luIl0pOw0KCQkJdW5zZXQoJF9TRVNTSU9OWyJ1c2VybmFtZSJdKTsNCgkJCXNlc3Npb25fZGVzdHJveSgpOw0KCQkJc2V0Y29va2llKCJ1c2VybmFtZSIsICRfU0VTU0lPTlsidXNlcm5hbWUiXSwgdGltZSgpIC0gNjAqNjAqMjQqNyk7DQogICAgCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpKTsNCgkJCWV4aXQoKTsNCgl9LCdsb2dvdXQudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9rYXlpdC1vbCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KCQkJaWYgKEAhJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0thecSxdCBPbCc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9yZWdpc3Rlci52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdyZWdpc3Rlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KCQkJaWYgKEAhJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0dpcmnFnyBZYXAnOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbG9naW4udmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbG9naW4udmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9wYXJvbGFtaS11bnV0dHVtJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXI7DQoJCQlpZiAoQCEkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknUGFyb2xhbcSxIFVudXR0dW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvcGFzc3dvcmRfZm9yZ2V0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ3Bhc3N3b3JkX2ZvcmdldC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Bhcm9sYW1pLWd1bmNlbGxlJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXI7DQoJCQlpZiAoQCEkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknUGFyb2xhbcSxIFVudXR0dW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvcGFzc3dvcmRfZm9yZ2V0Mi52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdzaWZyZV9ndW5jZWxsZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2Jha2l5ZS1la2xlJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYmFua2FsYXI7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdCYWtpeWUgRWtsZSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZGRfYmFsYW5jZS52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZGRfYmFsYW5jZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3llbmktZGVzdGVrLXRhbGViaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdZZW5pIERlc3RlayBUYWxlYmkgT2x1xZ90dXInOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbmV3X3RpY2tldC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCduZXdfdGlja2V0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGViaS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlCS49CSdEZXN0ZWsgVGFsZWJpbmkgR8O2csO8bnTDvGxlJzsNCgkJCQkkdGFsZXAJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIFdIRVJFIGlkPT8gIik7DQoJCQkJJHRhbGVwCS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkdGFsZXAJPQkkdGFsZXAJLT4gZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJHRhbGVwLT50YWxlcF9zYWhpYmkhPSR1eWUtPnVzZXJuYW1lKSB7DQoJCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FsbF90aWNrZXRzLnZpZXcnKSk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJHRhbGVwY2V2YXBsYXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwX2NldmFwIFdIRVJFIHRhbGVwX2lkPT8iKTsNCgkJCQkJCSR0YWxlcGNldmFwbGFyIC0+IGV4ZWN1dGUoYXJyYXkoJHRhbGVwLT5pZCkpOw0KCQkJCQkJJHRhbGVwY2V2YXBsYXIJPQkkdGFsZXBjZXZhcGxhci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQl9DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9yZWFkX3RpY2tldC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdyZWFkX3RpY2tldC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2Rlc3Rlay10YWxlcGxlcmltJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0Rlc3RlayBUYWxlcGxlcmltJzsNCgkJCQkkdGFsZXBsZXJpbQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfc2FoaWJpPT8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCSR0YWxlcGxlcmltLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSkpOw0KCQkJCSR0YWxlcGxlcmltCT0JJHRhbGVwbGVyaW0tPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FsbF90aWNrZXRzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FsbF90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGVwbGVyaW0vYmVrbGV5ZW5sZXInLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ0HDp8SxaycpKTsNCgkJCQkkdGFsZXBsZXJpbQk9CSR0YWxlcGxlcmltLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hbGxfdGlja2V0cy52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiZWtsZXllbl90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGVwbGVyaW0veWFuaXRsYW5taXMnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ1lhbsSxdGxhbmTEsScpKTsNCgkJCQkkdGFsZXBsZXJpbQk9CSR0YWxlcGxlcmltLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hbGxfdGlja2V0cy52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCd5YW5pdGxhbmRpX3RpY2tldHMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9kZXN0ZWstdGFsZXBsZXJpbS9rYXBhbGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ0thcGFsxLEnKSk7DQoJCQkJJHRhbGVwbGVyaW0JPQkkdGFsZXBsZXJpbS0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwna2FwYWxpX3RpY2tldHMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy95ZW5pLXNpcGFyaXMnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlciwka2F0ZWdvcmlsZXJmaXlhdDsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1llbmkgU2lwYXJpxZ8nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbmV3X29yZGVyLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ25ld19vcmRlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3NpcGFyaXNsZXJpbScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknU2lwYXJpxZ9sZXJpbSc7DQoJCQkJJHNsdWcJPQkxOw0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPSckdXllLT51c2VybmFtZScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgaWYoJHRvcGxhbXNheWZhPT0wKXskdG9wbGFtc2F5ZmE9MTt9IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdteV9vcmRlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJHNpcGFyaXNsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciBXSEVSRSBzaXBhcmlzX3NhaGliaT0/IE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbXlfb3JkZXJzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvc2lwYXJpc2xlcmltL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1NpcGFyacWfbGVyaW0nOw0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPSckdXllLT51c2VybmFtZScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgaWYoJHRvcGxhbXNheWZhPT0wKXskdG9wbGFtc2F5ZmE9MTt9IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdteV9vcmRlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJHNpcGFyaXNsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciBXSEVSRSBzaXBhcmlzX3NhaGliaT0/IE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbXlfb3JkZXJzcy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Bha2V0bGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlciwka2F0ZWdvcmlsZXJmaXlhdDsNCgkJCQkkdGl0bGUuPQknRml5YXQgTGlzdGVzaSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9wcmljZV9saXN0LnZpZXcucGhwJzsNCgkJCQlleGl0KCk7DQoJfSwncHJpY2VfbGlzdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Byb2ZpbCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdQcm9maWxpbSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9zZXR0aW5nLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ215X3NldHRpbmcudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vZGVtZWxlcmltJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJGJvZGVtZWxlciwkYm9ubGluZW9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lbGVyaW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvb2RlbWVsZXIudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnb2RlbWVsZXIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9tb2JpbC1vbmF5JywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCQkkdGl0bGUuPQknQW5hc2F5ZmEnOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL21vYmlsZS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ21vYmlsZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9idXlwYXllci1vZGVtZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJJHR1dGFyCT0Jc3RyX3JlcGxhY2UoJy4nLCAnLCcsICRfUE9TVFsidHV0YXIiXSk7DQoJCQkJJHlvbnRlbSA9CSRfUE9TVFsieW9udGVtIl07DQoJCQkJJHJhbmQJPQlyYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpOw0KCQkJCSR0YXJpaCAJPQlkYXRlKCJZLm0uZCIpOw0KCQkJCSRpcCAJPQlHZXRJUCgpOw0KCQkJCWlmICggJHR1dGFyID49IDEgKSB7DQoJCQkJCQ0KCQkJCQloZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7DQoJCQkJCSRwb3N0VXJsPSdodHRwczovL3d3dy5idXlwYXllci5jb20vcmVjZWl2ZTIuYXNwJzsNCg0KCQkJCQkvLyBpdHQgYWxhbsSxbmRhIHRhaHNpbCBlZGlsZWNlayB0dXRhcmRhIGt1cnXFnyBvbG1hc8SxIGR1cnVtdW5kYSB2aXJnw7xsIGt1bGxhbsSxbsSxeiAiODUsNTUiIGdpYmkNCgkJCQkJJHhtbFN0cmluZz0neG1sPTxzZW5kPg0KCQkJCQkJCTxtZ3ppZD4nLiRzaXRlYXlhci0+YnV5cGF5ZXJfbWFnYXphLic8L21nemlkPg0KCQkJCQkgICAgICAgIDxpdHQ+Jy4kdHV0YXIuJzwvaXR0PiANCgkJCQkJICAgICAgICA8c2lwaWQ+Jy4kcmFuZC4nPC9zaXBpZD4NCgkJCQkJCQk8YWRzb3lhZD4nLiR1eWUtPmFkc295YWQuJzwvYWRzb3lhZD4NCgkJCQkJCQk8dGVsZWZvbj4nLiR1eWUtPnRlbGVmb24uJzwvdGVsZWZvbj4NCgkJCQkJCSAgICA8ZXBvc3RhPicuJHV5ZS0+ZW1haWwuJzwvZXBvc3RhPg0KCQkJCQkgICAgICAgIDxhZHJlcz5CZWxpcnRpbG1lbWnFnzwvYWRyZXM+DQoJCQkJCQkJPHVydW5hZGk+Jy4kdHV0YXIuJyBUTCBiYWtpeWUgecO8a2xlbWVzaTwvdXJ1bmFkaT4NCgkJCQkJCQk8Z3ZrPicuJHNpdGVheWFyLT5idXlwYXllcl9ndXZlbmxpay4nPC9ndms+DQoJCQkJCQkJPHV5ZW1haWw+Jy4kc2l0ZWF5YXItPmJ1eXBheWVyX21haWwuJzwvdXllbWFpbD4NCgkJCQkJCQkNCgkJCQkJPC9zZW5kPic7ICANCg0KCQkJCQkkVmVyaWxlciA9ICAkeG1sU3RyaW5nOw0KCQkJCQkkY2ggPSBjdXJsX2luaXQoKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHBvc3RVcmwpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgMSk7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkVmVyaWxlcik7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzApOw0KCQkJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCQkJY3VybF9jbG9zZSgkY2gpOw0KDQoJCQkJCQ0KDQoJCQkJCWlmKCRyZXNwb25zZSl7DQoJCQkJCQkkZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYnV5cGF5ZXJfb2RlbWVsZXIgU0VUIG9kZW1lX2lwPT8sIG9kZW1lX2Vrc3RyYT0/LCBvZGVtZV9zYWhpYmk9Pywgb2RlbmRpbWk9Pywgb2RlbWVfdHV0YXJpPT8sIG9kZW1lX2R1cnVtPT8sIG9kZW1lX3RhcmloPT8iKTsNCgkJCQkJCSRla2xlLT4gZXhlY3V0ZShhcnJheSgkaXAsJHJhbmQsJHV5ZS0+dXNlcm5hbWUsJzAnLCR0dXRhciwnQmVrbGVtZWRlJywkdGFyaWgpKTsNCgkJCQkJCSRvdXRwdXQgPSBbJ3QnPT4nQmHFn2FyxLFsxLEnLCdtJz0+J0zDvHRmZW4gYmVrbGV5aW4gw7ZkZW1lIHNheWZhc8SxbmEgecO2bmxlbmRpcmlsaXlvcnN1bnV6Jywncyc9PidzdWNjZXNzJywncic9PiRyZXNwb25zZV07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCSRvdXRwdXQgPSBbJ3QnPT4nSGF0YScsJ20nPT4nw5ZkZW1lIGnFn2xlbWkgYmHFn2xhdMSxbMSxcmtlbiBoYXRhIG9sdcWfdHUgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluJywncyc9PidlcnJvciddOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfQ0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0hhdGEnLCdtJz0+J01pbmltdW0gw7ZkZW1lIG1pa3RhcsSxIDEgVExcJ2RpcicsJ3MnPT4nZXJyb3InXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoNCg0KDQoJfSwnYnV5cGF5ZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvcGF5dHItb2RlbWUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJCSR0dXRhcgk9CSRfUE9TVFsidHV0YXIiXTsNCgkJCQkkeW9udGVtID0JJF9QT1NUWyJ5b250ZW0iXTsNCg0KCQkJCWlmICggJHR1dGFyID49IDEgKSB7DQoJCQkJCSR0YXJpaAkJCQkJPSBkYXRlKCdZLW0tZCBIOmk6cycpOw0KCQkJCQkkaXAgCQkJCQkJPSBHZXRJUCgpOw0KCQkJCQkkbWVyY2hhbnRfaWQgCQk9ICRzaXRlYXlhci0+bWVyY2hhbnRfaWQ7ICMjIEFQSSBFbnRlZ3Jhc3lvbiBCaWxnaWxlcmkNCgkJCQkJJG1lcmNoYW50X2tleSAJPSAkc2l0ZWF5YXItPm1lcmNoYW50X2tleTsgIyMgQVBJIEVudGVncmFzeW9uIEJpbGdpbGVyaQ0KCQkJCQkkbWVyY2hhbnRfc2FsdAk9ICRzaXRlYXlhci0+bWVyY2hhbnRfc2FsdDsgIyMgQVBJIEVudGVncmFzeW9uIEJpbGdpbGVyaQ0KDQoJCQkJCSRlbWFpbCAJCQkJCQkJPSAkdXllLT5tYWlsOyAjIyBNw7zFn3RlcmluaXppbiBzaXRlbml6ZGUga2F5xLF0bMSxIHZleWEgZm9ybSB2YXPEsXRhc8SxeWxhIGFsZMSxxJ/EsW7EsXogZXBvc3RhIGFkcmVzaQ0KCQkJCQkkcGF5bWVudF9hbW91bnQJCQk9ICgkdHV0YXIrJHR1dGFyKjEwLzEwMCkqMTAwOyAgIyMgVGFoc2lsIGVkaWxlY2VrIHR1dGFyLg0KCQkJCQkkbWVyY2hhbnRfb2lkIAkJCT0gcmFuZCgxMDAwMCw5OTk5OTk5OSk7ICMjIFNpcGFyacWfIG51bWFyYXPEsQ0KCQkJCQkkdXNlcl9uYW1lIAkJCQkJPSAkdXllLT5hZHNveWFkOyAjIyBNw7zFn3RlcmluaXppbiBzaXRlbml6ZGUga2F5xLF0bMSxIHZleWEgZm9ybSBhcmFjxLFsxLHEn8SxeWxhIGFsZMSxxJ/EsW7EsXogYWQgdmUgc295YWQgYmlsZ2lzaQ0KCQkJCQkkdXNlcl9hZGRyZXNzIAkJCT0gIsSwc3RhbmJ1bCI7ICMjIE3DvMWfdGVyaW5pemluIHNpdGVuaXpkZSBrYXnEsXRsxLEgdmV5YSBmb3JtIGFyYWPEsWzEscSfxLF5bGEgYWxkxLHEn8SxbsSxeiBhZHJlcyBiaWxnaXNpDQoJCQkJCSR1c2VyX3Bob25lIAkJCQk9ICR1eWUtPnRlbGVmb247ICMjIE3DvMWfdGVyaW5pemluIHNpdGVuaXpkZSBrYXnEsXRsxLEgdmV5YSBmb3JtIGFyYWPEsWzEscSfxLF5bGEgYWxkxLHEn8SxbsSxeiB0ZWxlZm9uIGJpbGdpc2kNCgkJCQkJJG1lcmNoYW50X29rX3VybCAJCT0gImh0dHA6Ly8iLiRzaXRlYXlhci0+c2l0ZV91cmwuIm9ubGluZS1vZGVtZS1iYXNhcmlsaSI7ICMjIEJhxZ9hcsSxbMSxIMO2ZGVtZSBzb25yYXPEsSBtw7zFn3RlcmluaXppbiB5w7ZubGVuZGlyaWxlY2XEn2kgc2F5ZmENCgkJCQkJJG1lcmNoYW50X2ZhaWxfdXJsIAk9ICJodHRwOi8vIi4kc2l0ZWF5YXItPnNpdGVfdXJsLiJvbmxpbmUtb2RlbWUtYmFzYXJpc2l6IjsgIyMgw5ZkZW1lIHPDvHJlY2luZGUgYmVrbGVubWVkaWsgYmlyIGhhdGEgb2x1xZ9tYXPEsSBkdXJ1bXVuZGEgbcO8xZ90ZXJpbml6aW4gecO2bmxlbmRpcmlsZWNlxJ9pIHNheWZhDQoJCQkJCSR1c2VyX2Jhc2tldCA9IGJhc2U2NF9lbmNvZGUoanNvbl9lbmNvZGUoYXJyYXkoDQoJCQkJCQlhcnJheSgkdHV0YXIuIiBUTCBCYWtpeWUiLCAkdHV0YXIsIDEpDQoJCQkJCSkpKTsgIyMgTcO8xZ90ZXJpbmluIHNlcGV0L3NpcGFyacWfIGnDp2VyacSfaQ0KCQkJCQkkdXNlcl9pcAkJCQkJPQkkaXA7DQoJCQkJCSR0aW1lb3V0X2xpbWl0IAkJPSAiMzAiOyAjIyDEsMWfbGVtIHphbWFuIGHFn8SxbcSxIHPDvHJlc2kgLSBkYWtpa2EgY2luc2luZGVuDQoJCQkJCSRkZWJ1Z19vbiAJCQkJPSAxOyAjIyBIYXRhIG1lc2FqbGFyxLFuxLFuIGVrcmFuYSBiYXPEsWxtYXPEsSBpw6dpbiBlbnRlZ3Jhc3lvbiB2ZSB0ZXN0IHPDvHJlY2luZGUgMSBvbGFyYWsgYsSxcmFrxLFuLiBEYWhhIHNvbnJhIDAgeWFwYWJpbGlyc2luaXouDQoJCQkgICAgCSR0ZXN0X21vZGUgCQkJCT0gMDsgICMjIE1hxJ9hemEgY2FubMSxIG1vZGRhIGlrZW4gdGVzdCBpxZ9sZW0geWFwbWFrIGnDp2luIDEgb2xhcmFrIGfDtm5kZXJpbGViaWxpci4NCgkJCQkJJG5vX2luc3RhbGxtZW50CQk9IDA7IC8vIFRha3NpdCB5YXDEsWxtYXPEsW7EsSBpc3RlbWl5b3JzYW7EsXosIHNhZGVjZSB0ZWsgw6dla2ltIHN1bmFjYWtzYW7EsXogMSB5YXDEsW4NCgkJCQkJJG1heF9pbnN0YWxsbWVudCAJPSAwOyAjIyBTYXlmYWRhIGfDtnLDvG50w7xsZW5lY2VrIHRha3NpdCBhZGVkaW5pIHPEsW7EsXJsYW1hayBpc3RpeW9yc2FuxLF6IHV5Z3VuIMWfZWtpbGRlIGRlxJ9pxZ90aXJpbi4NCgkJCQkJJGN1cnJlbmN5ID0gIlRMIjsNCg0KDQoJCQkJCSMjIyMjIyMgQnUga8Sxc8SxbWRhIGhlcmhhbmdpIGJpciBkZcSfacWfaWtsaWsgeWFwbWFuxLF6YSBnZXJlayB5b2t0dXIuICMjIyMjIyMNCgkJCQkJaWYoICR5b250ZW0gIT0gImVmdCIgKXsNCgkJCQkJCSRoYXNoX3N0ciA9ICRtZXJjaGFudF9pZCAuJHVzZXJfaXAgLiRtZXJjaGFudF9vaWQgLiRlbWFpbCAuJHBheW1lbnRfYW1vdW50IC4kdXNlcl9iYXNrZXQuJG5vX2luc3RhbGxtZW50LiRtYXhfaW5zdGFsbG1lbnQuJGN1cnJlbmN5LiR0ZXN0X21vZGU7DQoJCQkJCQkkcGF5dHJfdG9rZW49YmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsJGhhc2hfc3RyLiRtZXJjaGFudF9zYWx0LCRtZXJjaGFudF9rZXksdHJ1ZSkpOw0KCQkJCQkJJHBvc3RfdmFscz1hcnJheSgNCgkJCQkJCQknbWVyY2hhbnRfaWQnPT4kbWVyY2hhbnRfaWQsDQoJCQkJCQkJJ3VzZXJfaXAnPT4kdXNlcl9pcCwNCgkJCQkJCQknbWVyY2hhbnRfb2lkJz0+JG1lcmNoYW50X29pZCwNCgkJCQkJCQknZW1haWwnPT4kZW1haWwsDQoJCQkJCQkJJ3BheW1lbnRfYW1vdW50Jz0+JHBheW1lbnRfYW1vdW50LA0KCQkJCQkJCSdwYXl0cl90b2tlbic9PiRwYXl0cl90b2tlbiwNCgkJCQkJCQkndXNlcl9iYXNrZXQnPT4kdXNlcl9iYXNrZXQsDQoJCQkJCQkJJ2RlYnVnX29uJz0+JGRlYnVnX29uLA0KCQkJCQkJCSdub19pbnN0YWxsbWVudCc9PiRub19pbnN0YWxsbWVudCwNCgkJCQkJCQknbWF4X2luc3RhbGxtZW50Jz0+JG1heF9pbnN0YWxsbWVudCwNCgkJCQkJCQkndXNlcl9uYW1lJz0+JHVzZXJfbmFtZSwNCgkJCQkJCQkndXNlcl9hZGRyZXNzJz0+JHVzZXJfYWRkcmVzcywNCgkJCQkJCQkndXNlcl9waG9uZSc9PiR1c2VyX3Bob25lLA0KCQkJCQkJCSdtZXJjaGFudF9va191cmwnPT4kbWVyY2hhbnRfb2tfdXJsLA0KCQkJCQkJCSdtZXJjaGFudF9mYWlsX3VybCc9PiRtZXJjaGFudF9mYWlsX3VybCwNCgkJCQkJCQkndGltZW91dF9saW1pdCc9PiR0aW1lb3V0X2xpbWl0LA0KCQkJCQkJCSdjdXJyZW5jeSc9PiRjdXJyZW5jeSwNCgkJICAgICAgICAgICAJCQkndGVzdF9tb2RlJz0+JHRlc3RfbW9kZQ0KCQkJCQkJKTsNCgkJCQkJfWVsc2V7DQoJCQkJCQkkaGFzaF9zdHI9JG1lcmNoYW50X2lkLiR1c2VyX2lwLiRtZXJjaGFudF9vaWQuJGVtYWlsLiRwYXltZW50X2Ftb3VudC4keW9udGVtLiR0ZXN0X21vZGU7DQoJCQkJCQkkcGF5dHJfdG9rZW49YmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsJGhhc2hfc3RyLiRtZXJjaGFudF9zYWx0LCRtZXJjaGFudF9rZXksdHJ1ZSkpOw0KCQkJCQkJJHBvc3RfdmFscz1hcnJheSgNCgkJCQkJCQknbWVyY2hhbnRfaWQnPT4kbWVyY2hhbnRfaWQsDQoJCQkJCQkJJ3VzZXJfaXAnPT4kdXNlcl9pcCwNCgkJCQkJCQknbWVyY2hhbnRfb2lkJz0+JG1lcmNoYW50X29pZCwNCgkJCQkJCQknZW1haWwnPT4kZW1haWwsDQoJCQkJCQkJJ3BheW1lbnRfYW1vdW50Jz0+JHBheW1lbnRfYW1vdW50LA0KCQkJCQkJCSdwYXltZW50X3R5cGUnPT4keW9udGVtLA0KCQkJCQkJCSdwYXl0cl90b2tlbic9PiRwYXl0cl90b2tlbiwNCgkJCQkJCQknZGVidWdfb24nPT4kZGVidWdfb24sDQoJCQkJCQkJJ3RpbWVvdXRfbGltaXQnPT4kdGltZW91dF9saW1pdCwNCgkJCQkgICAgICAgICAgICAndGVzdF9tb2RlJz0+JHRlc3RfbW9kZQ0KCQkJCQkJKTsNCgkJCQkJfQ0KDQoNCgkJCQkJJGNoPWN1cmxfaW5pdCgpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cHM6Ly93d3cucGF5dHIuY29tL29kZW1lL2FwaS9nZXQtdG9rZW4iKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpIDsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0X3ZhbHMpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgdHJ1ZSk7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAyMCk7DQoJCQkJCSRyZXN1bHQgPSBAY3VybF9leGVjKCRjaCk7DQoNCgkJCQkJaWYoY3VybF9lcnJubygkY2gpKQ0KCQkJCQkJZGllKCJQQVlUUiBJRlJBTUUgY29ubmVjdGlvbiBlcnJvci4gZXJyOiIuY3VybF9lcnJvcigkY2gpKTsNCg0KCQkJCQljdXJsX2Nsb3NlKCRjaCk7DQoNCgkJCQkJJHJlc3VsdD1qc29uX2RlY29kZSgkcmVzdWx0LDEpOw0KDQoJCQkJCWlmKCRyZXN1bHRbJ3N0YXR1cyddPT0nc3VjY2Vzcycpew0KCQkJCQkJJHRva2VuCT0JJHJlc3VsdFsndG9rZW4nXTsNCgkJCQkJCSRla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwYXl0cl9vZGVtZWxlciBTRVQgb2RlbWVfaXA9Pywgb2RlbWVfZWtzdHJhPT8sIG9kZW1lX3NhaGliaT0/LCBvZGVuZGltaT0/LCBvZGVtZV90dXRhcmk9Pywgb2RlbWVfZHVydW09Pywgb2RlbWVfdGFyaWg9PyIpOw0KCQkJCQkJJGVrbGUtPiBleGVjdXRlKGFycmF5KCRpcCwkbWVyY2hhbnRfb2lkLCR1eWUtPnVzZXJuYW1lLCcwJywkdHV0YXIsJ0Jla2xlbWVkZScsJHRhcmloKSk7DQoJCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0JhxZ9hcsSxbMSxJywnbSc9PidMw7x0ZmVuIGJla2xleWluIMO2ZGVtZSBzYXlmYXPEsW5hIHnDtm5sZW5kaXJpbGl5b3JzdW51eicsJ3MnPT4nc3VjY2VzcycsJ3InPT4kcm91dGVyLT5nZW5lcmF0ZSgncGF5X3RyLnZpZXcnLFsnc2x1Zyc9PiR0b2tlbiwndXJsJz0+JHlvbnRlbV0pXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KDQoJCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0hhdGEnLCdtJz0+J8OWZGVtZSBpxZ9sZW1pIGJhxZ9sYXTEsWzEsXJrZW4gaGF0YSBvbHXFn3R1IGzDvHRmZW4gZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbicsJ3MnPT4nZXJyb3InXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dCA9IFsndCc9PidIYXRhJywnbSc9PidNaW5pbXVtIMO2ZGVtZSBtaWt0YXLEsSAxIFRMXCdkaXInLCdzJz0+J2Vycm9yJ107DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KDQoNCg0KCX0sJ3BheXRfdHIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vbmxpbmUtb2RlbWUvWyo6c2x1Z10vWyo6dXJsXScsIGZ1bmN0aW9uKCRzbHVnLCR1cmwpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9oZWFkZXIudmlldy5waHAnOw0KCQkJaWYgKCAkdXJsID09ICJlZnQiICkgew0KCQkJCSR1cmwgPSAiaHR0cHM6Ly93d3cucGF5dHIuY29tL29kZW1lL2FwaS8iOw0KCQkJfSBlbHNlIHsNCgkJCQkkdXJsID0gImh0dHBzOi8vd3d3LnBheXRyLmNvbS9vZGVtZS9ndXZlbmxpLyI7DQoJCQl9DQoNCgkJCWVjaG8gJw0KCQkJPG1haW4gaWQ9ImFwcC1tYWluIiBjbGFzcz0iYXBwLW1haW4iPg0KCQkJICA8ZGl2IGNsYXNzPSJ3cmFwIj4NCgkJCQk8c2VjdGlvbiBjbGFzcz0iYXBwLWNvbnRlbnQiPg0KCQkJCQk8ZGl2IGNsYXNzPSJyb3ciPg0KCQkJPHNjcmlwdCBzcmM9Imh0dHBzOi8vd3d3LnBheXRyLmNvbS9qcy9pZnJhbWVSZXNpemVyLm1pbi5qcyI+PC9zY3JpcHQ+DQoJICAgIDxpZnJhbWUgc3JjPSInLiR1cmwuJHNsdWcuJyIgaWQ9InBheXRyaWZyYW1lIiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJubyIgc3R5bGU9IndpZHRoOiAxMDAlOyI+PC9pZnJhbWU+DQoJCQkJPHNjcmlwdD5pRnJhbWVSZXNpemUoe30sXCcjcGF5dHJpZnJhbWVcJyk7PC9zY3JpcHQ+DQoJCQkJCTwvZGl2PjwhLS0gLnJvdyAtLT4NCgkJCQk8L3NlY3Rpb24+PCEtLSAjZGFzaC1jb250ZW50IC0tPg0KCQkJPC9kaXY+PCEtLSAud3JhcCAtLT4NCgkJCQkJJzsNCgkJCWluY2x1ZGUgJ3ZpZXdzL2RlZmF1bHQvZm9vdGVyLnZpZXcucGhwJzsNCgl9LCdwYXlfdHIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vbmxpbmUtb2RlbWUtYmFzYXJpbGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9oZWFkZXIudmlldy5waHAnOw0KCQkJZWNobyAnDQoJCQk8bWFpbiBpZD0iYXBwLW1haW4iIGNsYXNzPSJhcHAtbWFpbiI+DQoJCQkgIDxkaXYgY2xhc3M9IndyYXAiPg0KCQkJCTxzZWN0aW9uIGNsYXNzPSJhcHAtY29udGVudCI+DQoJCQkJCTxkaXYgY2xhc3M9InJvdyI+DQoJCQkJCTxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MgYWxlcnQtZGlzbWlzc2libGUiIHJvbGU9ImFsZXJ0Ij4NCgkJCQkJCQk8c3Ryb25nPkJhxZ9hcsSxbMSxISA8L3N0cm9uZz4NCgkJCQkJCQk8c3Bhbj7DlmRlbWUgacWfbGVtaW5peiB0YW1hbWxhbmTEsSwgZW4ga8Sxc2EgemFtYW5sYSBoZXNhYsSxbsSxemEgYWt0YXLEsWxhY2FrdMSxci48L3NwYW4+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+PCEtLSAucm93IC0tPg0KCQkJCTwvc2VjdGlvbj48IS0tICNkYXNoLWNvbnRlbnQgLS0+DQoJCQk8L2Rpdj48IS0tIC53cmFwIC0tPg0KCQkJCQknOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9mb290ZXIudmlldy5waHAnOw0KCX0sJ3BheV90cl9iYXNhcmlsaS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL29ubGluZS1vZGVtZS1iYXNhcmlzaXonLCBmdW5jdGlvbigpew0KCQkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWluY2x1ZGUgJ3ZpZXdzL2RlZmF1bHQvaGVhZGVyLnZpZXcucGhwJzsNCgkJCWVjaG8gJw0KCQkJPG1haW4gaWQ9ImFwcC1tYWluIiBjbGFzcz0iYXBwLW1haW4iPg0KCQkJCTxkaXYgY2xhc3M9IndyYXAiPg0KCQkJCTxzZWN0aW9uIGNsYXNzPSJhcHAtY29udGVudCI+DQoJCQkJCTxkaXYgY2xhc3M9InJvdyI+DQoJCQkJCTxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRhbmdlciBhbGVydC1kaXNtaXNzaWJsZSIgcm9sZT0iYWxlcnQiPg0KCQkJCQkJCTxzdHJvbmc+QmHFn2FyxLFzxLF6ISA8L3N0cm9uZz4NCgkJCQkJCQk8c3Bhbj7DlmRlbWUgacWfbGVtaW5peiB0YW1hbWxhbmFtYWTEsSwgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluLjwvc3Bhbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQk8L2Rpdj48IS0tIC5yb3cgLS0+DQoJCQkJPC9zZWN0aW9uPjwhLS0gI2Rhc2gtY29udGVudCAtLT4NCgkJCTwvZGl2PjwhLS0gLndyYXAgLS0+DQoJCQkJCSc7DQoJCQlpbmNsdWRlICd2aWV3cy9kZWZhdWx0L2Zvb3Rlci52aWV3LnBocCc7DQoJfSwncGF5X3RyX2Jhc2FyaXNpei52aWV3Jyk7DQoNCgkjIyBLdWxsYW7EsWPEsSBQT1NUIMSwxZ9sZW1sZXJpICMjDQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9zaWZyZW1pLXVudXR0dW0nLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkdHVyCQkJPQkkX1BPU1RbInR1ciJdOw0KCQkJJG1haWwJCQk9CSRfUE9TVFsiZW1haWwiXTsNCgkJCSR0ZWxlZm9uCT0Jc3RyX3JlcGxhY2UoIiAiLCIiLCRfUE9TVFsidGVsZWZvbiJdKTsNCgkJCSR0YXJpaCAgICA9IGRhdGUoIlkubS5kIEg6aTpzIik7DQoNCgkJCWlmICggJHR1ciA9PSAndGVsZWZvbicgKSB7DQoJCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb249PyIpOw0KCQkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkdGVsZWZvbikpOw0KCQkJCSR1eWUJCQkJPQkJJHNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJfWVsc2V7DQoJCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIG1haWw9PyIpOw0KCQkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCkpOw0KCQkJCSR1eWUJCQkJPQkJJHNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJfQ0KDQoJCQkJaWYgKCAkdHVyID09ICdzZWNpbicgfHwgJHR1ciA9PSAndGVsZWZvbicgJiYgZW1wdHkoJHRlbGVmb24pIHx8ICR0dXIgPT0gJ2VtYWlsJyAmJiBlbXB0eSgkbWFpbCkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAhJHNvci0+cm93Q291bnQoKSApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIGJpbGdpbGVyIGlsZSB1eXXFn2FuIGt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxIiwicyI9PiJpbmZvIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2VpZiggJHR1ciA9PSAndGVsZWZvbicgKXsNCgkJCQkJIyMgT25heSBLb2R1IE9sdcWfdHVyICMjDQoJCQkJCSRrb2QgCQkJPSByYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KTsNCgkJCQkJJG9sdXN0dXIJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIHNpZnJlbWl1bnV0dHVtIFNFVCBzYWhpYmk9Pywga29kPT8sIHRhcmloPT8iKTsNCgkJCQkJJG9sdXN0dXIgLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwka29kLCR0YXJpaCkpOw0KCQkJCQkjIyBPbmF5IEtvZHVudSBHw7ZuZGVyICMjDQoJCQkJCXNpZnJlbWlVbnV0dHVtKCR0ZWxlZm9uLCRrb2QpOw0KCQkJCX1lbHNlaWYoICR0dXIgPT0gJ2VtYWlsJyApew0KCQkJCQkjIyBPbmF5IEtvZHUgT2x1xZ90dXIgIyMNCgkJCQkJJGtvZCAJCQk9IHJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpOw0KCQkJCQkkb2x1c3R1cgk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gc2lmcmVtaXVudXR0dW0gU0VUIHNhaGliaT0/LCBrb2Q9PywgdGFyaWg9PyIpOw0KCQkJCQkkb2x1c3R1ciAtPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lLCRrb2QsJHRhcmloKSk7DQoJCQkJCSMjIE9uYXkgS29kdW51IEfDtm5kZXIgIyMNCgkJCQkJc2lmcmVtaVVudXR0dW1NYWlsKCR1eWUtPm1haWwsIsWeaWZyZW5pemkgZ8O8bmNlbGxlbWVrIGnDp2luIGdlcmVrbGkga29kIG9sYW46ICIuJGtvZCwiUGFyb2xhbcSxIHVudXR0dW0iKTsNCgkJCQl9DQoNCgkJCQlleGl0KCk7DQoJfSwncGFzc3dvcmRfZm9yZ2V0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3NpZnJlbWktZ3VuY2VsbGUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkka29kCQkJCT0JJF9QT1NUWyJrb2QiXTsNCgkJCSR5ZW5pCQkJCT0JJF9QT1NUWyJzaWZyZSJdOw0KCQkJJHBhc3MJCQkJPQltZDUoJF9QT1NUWyJzaWZyZSJdKTsNCg0KCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lmcmVtaXVudXR0dW0gV0hFUkUga29kPT8iKTsNCgkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgka29kKSk7DQoJCQkka29kCQkJCT0gCSRzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCSR1eWUJCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkkdXllCQkJCS0+CWV4ZWN1dGUoYXJyYXkoJGtvZC0+c2FoaWJpKSk7DQoJCQkkdXllCQkJCT0gCSR1eWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KDQoJCQkJaWYgKCBlbXB0eSgka29kKSB8fCBlbXB0eSgkeWVuaSkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAhJHNvci0+cm93Q291bnQoKSApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIGtvZCBnZcOnZXJzaXoiLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKHN0cmxlbigkeWVuaSk8Nil7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkdpcmRpxJ9pbml6IMWfaWZyZSA2IGthcmFrdGVyZGVuIGvEsXNhIG9sbWFtYWzEsSIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KDQoJCQkJCSRndW5jZWxsZSA9ICR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgcGFzc3dvcmQ9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCSRndW5jZWxsZSAtPiBleGVjdXRlKGFycmF5KCRwYXNzLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJCQlpZiAoJGd1bmNlbGxlKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLFnmlmcmVuaXogZ8O8bmNlbGxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXoiLCJzIj0+InN1Y2Nlc3MiLCdyJz0+JHJvdXRlci0+Z2VuZXJhdGUoJ2xvZ2luLnZpZXcnKV07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCQkkZGVsZXRlID0gJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBzaWZyZW1pdW51dHR1bSBXSEVSRSBzYWhpYmk9PyIpOw0KCQkJCQkJCSRkZWxldGUgLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSkpOw0KCQkJCQkJfWVsc2V7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLFnmlmcmVuaXogZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dXIuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfQ0KDQoNCgkJCQlleGl0KCk7DQoJfSwnc2lmcmVfZ3VuY2VsbGUucG9zdCcpOw0KICAkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2theWl0LW9sJywgZnVuY3Rpb24oKXsNCgkJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkkYWQJCQkJPQlpbGtIYXJmKCRfUE9TVFsibmFtZSJdKTsNCgkJJG1haWwJCQk9CSRfUE9TVFsibWFpbCJdOw0KCQkkdXNlcm5hbWUJPQlzdHJfcmVwbGFjZSgiICIsICIiLCB0ckNldmlyKCRfUE9TVFsidXNlcm5hbWUiXSkpOw0KCQkkcGFzc3dvcmQJPQkkX1BPU1RbInBhc3N3b3JkIl07DQoJCSRwaG9uZQkJPQlzdHJfcmVwbGFjZSgiICIsICIiLCAkX1BPU1RbInBob25lIl0pOw0KCQkkY2FwdGNoYSAJPSBAJF9QT1NUWydnLXJlY2FwdGNoYS1yZXNwb25zZSddOw0KDQoJCSRrZXkJCQk9IG1kNShhcGlrZXlPbHVzdHVyKDMyKS50aW1lKCkpOw0KDQoJCSRrc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCSRrc29yZ3UJCS0+CWV4ZWN1dGUoYXJyYXkoJHVzZXJuYW1lKSk7DQoJCSRtc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBtYWlsPT8iKTsNCgkJJG1zb3JndQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCkpOw0KCQkkdHNvcmd1CQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdGVsZWZvbj0/Iik7DQoJCSR0c29yZ3UJCS0+CWV4ZWN1dGUoYXJyYXkoJHBob25lKSk7DQoNCgkJJGdvb2dsZXNlY3JldAk9ICI2TGV0dzFNVUFBQUFBSmVocWF1c1NORmtkY0dVanN4UXJMV3RkdnFNIjsNCg0KCQkkcm9ib3Rrb250cm9sIAk9IGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkvc2l0ZXZlcmlmeT9zZWNyZXQ9JGdvb2dsZXNlY3JldCZyZXNwb25zZT0iIC4gJGNhcHRjaGEgLiAiJnJlbW90ZWlwPSIgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQoJCSRyb2JvdGtvbnRyb2wgCT0JanNvbl9kZWNvZGUoJHJvYm90a29udHJvbCk7DQoNCgkJaWYgKGVtcHR5KCRhZCkgfHwgZW1wdHkoJG1haWwpIHx8IGVtcHR5KCR1c2VybmFtZSkgfHwgZW1wdHkoJHBhc3N3b3JkKSB8fCBlbXB0eSgkcGhvbmUpKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYgKCEkY2FwdGNoYSkgew0KCQkgICAgJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJSb2JvdCBvbG1hZMSxxJ/EsW7EsXrEsSBrYW7EsXRsYXnEsW4iLCJzIj0+ImVycm9yIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUga3VsbGFuxLFjxLEgYWTEsSBkYWhhIMO2bmNlIGt1bGxhbsSxbG3EscWfLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZighZmlsdGVyX3ZhcigkbWFpbCxGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJkacSfaW5peiBtYWlsIGZvcm1hdMSxIGhhdGFsxLEuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRtc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUgbWFpbCBhZHJlc2kgZGFoYSDDtm5jZSBrdWxsYW7EsWxtxLHFny4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYgKHN0cmxlbigkcGFzc3dvcmQpPDYpIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYW7EsXogZW4gYXogNiBrYXJha3RlcmRlbiBvbHXFn21hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkdHNvcmd1LT5yb3dDb3VudCgpKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IHRlbGVmb24gbnVtYXJhc8SxIGRhaGEgw7ZuY2Uga3VsbGFuxLFsbcSxxZ8uIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkcm9ib3Rrb250cm9sLT5zdWNjZXNzID09ICdmYWxzZScgICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkzDvHRmZW4gcm9ib3Qgb2xtYWTEscSfxLFuxLF6xLEgb25heWxhecSxbi4iLCJzIj0+ImVycm9yIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRrb2QJPSByYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KTsNCgkJCSRwYXNzd29yZAk9CW1kNSgkX1BPU1RbInBhc3N3b3JkIl0pOw0KCQkJJGluc2VydAk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gdXllbGVyIFNFVCBhZHNveWFkPT8sIG1haWw9PywgdXNlcm5hbWU9PywgcGFzc3dvcmQ9PywgdGVsZWZvbj0/LCB1eWVsaWt0YXJpaGk9PywgYXBpa2V5PT8sIGJha2l5ZT0/LCBvbmF5PT8sIHlldGtpPT8sIGF2YXRhcj0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkYWQsJG1haWwsJHVzZXJuYW1lLCRwYXNzd29yZCwkcGhvbmUsJHRhcmloLCRrZXksMCwwLCdNw7zFn3RlcmknLCdkZWZhdWx0X2F2YXRhcl9qcGcnKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJaWYgKCRzaXRlYXlhci0+c21zX29uYXkpIHsNCgkJCQkJCSRrb2Rla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBvbmF5X2tvZGxhcmkgU0VUIG9uYXlfc2FoaWJpPT8sIG9uYXlfa29kdT0/LCBvbmF5X3RhcmloaT0/Iik7DQoJCQkJCQkka29kZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJHVzZXJuYW1lLCRrb2QsJHRhcmloKSk7DQoJCQkJCQl5ZW5pdXllU01TKCRwaG9uZSwka29kKTsNCgkJCQkJfQ0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkthecSxdCBpxZ9sZW1pbml6IGJhxZ9hcsSxeWxhIHNvbnXDp2xhbmTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJQYXJvbGFuxLF6IGVuIGF6IDYga2FyYWt0ZXJkZW4gb2x1xZ9tYWzEsS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgkJfSwncmVnaXN0ZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvYmFraXllLWVrbGUtYmFua2EnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkb2RlbWVCYW5rYQkJPQkkX1BPU1RbIm9kZW1lQmFua2EiXTsNCgkJCSRvZGVtZVR1dGFyCQk9CSRfUE9TVFsib2RlbWVUdXRhciJdOw0KCQkJJHRhcmloCQkJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCg0KCQkJaWYgKCBlbXB0eSgkb2RlbWVCYW5rYSkgfHwgJG9kZW1lQmFua2E9PSJ5b2siIHx8IGVtcHR5KCRvZGVtZVR1dGFyKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlew0KCQkJCSRla2xlCQk9CQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGJhbmthX29kZW1lbGVyIFNFVCBvZGVtZV9zYWhpYmk9Pywgb2RlbWVfYmFua2E9Pywgb2RlbWVfdHV0YXI9Pywgb2RlbWVfdGFyaWg9Pywgb2RlbWVfZHVydW09Pywgb2RlbmRpbWk9PyAiKTsNCgkJCQkkZWtsZQkJLT4JZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwkb2RlbWVCYW5rYSwkb2RlbWVUdXRhciwkdGFyaWgsJ0Jla2xlbWVkZScsMCkpOw0KCQkJCQlpZiAoJGVrbGUpIHsNCgkJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIHRhbGViaW5peiBhbMSxbmTEsS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDlmRlbWUgdGFsZWJpIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYWRkX2JhbmthLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3BheXdhbnQtb2RlbWUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkYmFraXllWW9udGVtCT0JJF9QT1NUWyJiYWtpeWVZb250ZW0iXTsNCgkJCSRiYWtpeWVUdXRhcgk9CSRfUE9TVFsiYmFraXllVHV0YXIiXTsNCg0KDQoJCQlpZiAoICRiYWtpeWVZb250ZW0gPT0gMSApIHsNCgkJCQkkeW9udGVtTmFzaWwgPSAiTW9iaWwgw5ZkZW1lIjsNCgkJCX1lbHNlaWYgKCAkYmFraXllWW9udGVtID09IDIgKSB7DQoJCQkJJHlvbnRlbU5hc2lsID0gIktyZWRpIEthcnTEsSI7DQoJCQl9ZWxzZWlmICggJGJha2l5ZVlvbnRlbSA9PSAzICkgew0KCQkJCSR5b250ZW1OYXNpbCA9ICJIYXZhbGUvRWZ0L0F0bSI7DQoJCQl9DQoNCgkJCQlpZiAoIGVtcHR5KCRiYWtpeWVUdXRhcikgfHwgZW1wdHkoJGJha2l5ZVlvbnRlbSkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAkYmFraXllVHV0YXIgPCAxMCApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiIxMCBUTCBhbHTEsW5kYWtpIMO2ZGVtZSBpxZ9sZW1pIHlhcMSxbGFtYXouIiwicyI9PiJpbmZvIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoNCg0KDQoJCQkJCSMjIFBBWVlXQU5UIMOWREVNRSBCQcWeTEEgIyMNCgkJCQkJJGFwaUtleSAJCQk9ICRzaXRlYXlhci0+cGF5d2FudF9hcGk7IC8vIFBBWVdBTlQgQVBJDQoJCQkJCSRhcGlTZWNyZXQgCQk9ICRzaXRlYXlhci0+cGF5d2FudF9zZWNyZXQ7IC8vIEFQSSBHSVpMSSBBTkFIVEFSDQoJCQkJCSR1c2VySUQgCQkJPSAkdXllLT5pZDsgLy8gQkFLSVlFIEVLTEVORUNFSyBLVUxMQU5JQ0kgSUQNCgkJCQkJJHVzZXJFbWFpbCAJCT0gJHV5ZS0+bWFpbDsgLy8gQkFLSVlFIEVLTEVORUNFSyBLVUxMQU5JQ0kgRU1BxLBMDQoJCQkJCSR1c2VySVBBZHJlc2kgPSBHZXRJUCgpOw0KCQkJCQkkZXh0cmFEYXRhCQk9IHJhbmQoMTAwMDAsOTk5OTk5OTkpOw0KCQkJCQkkaGFzaE9sdXN0dXIgPSBiYXNlNjRfZW5jb2RlKGhhc2hfaG1hYygnc2hhMjU2JywiJHVzZXJFbWFpbHwkdXNlckVtYWlsfCR1c2VySUQiLiRhcGlLZXksJGFwaVNlY3JldCx0cnVlKSk7DQoJCQkJCSRwb3N0RGF0YSA9IGFycmF5KA0KCQkJCQknYXBpS2V5JyA9PiAkYXBpS2V5LA0KCQkJCQknaGFzaCcgPT4gJGhhc2hPbHVzdHVyLA0KCQkJCQkncmV0dXJuRGF0YSc9PiAkdXNlckVtYWlsLA0KCQkJCQkndXNlckVtYWlsJyA9PiAkdXNlckVtYWlsLA0KCQkJCQkndXNlcklQQWRkcmVzcycgPT4gJHVzZXJJUEFkcmVzaSwNCgkJCQkJJ3VzZXJJRCcgPT4gJHVzZXJJRCwNCgkJCQkJJ3Byb0FwaScgPT4gVFJVRSwNCgkJCQkJICdwcm9kdWN0RGF0YScgPT4gWw0KCQkJCQkJCSAibmFtZSIgPT4gICRiYWtpeWVUdXRhci4iIFRMIFR1dGFyxLFuZGEgQmFraXllICgiLiRleHRyYURhdGEuIikiLA0KCQkJCQkJCSAiYW1vdW50IiA9PiAkYmFraXllVHV0YXIqIDExMSwNCgkJCQkJCQkgImV4dHJhRGF0YSIgPT4gJGV4dHJhRGF0YSwNCgkJCQkJCQkgInBheW1lbnRDaGFubmVsIiA9PiAkYmFraXllWW9udGVtLCAvLyAxIE1vYmlsIMOWZGVtZSwgMiBLcmVkaSBLYXJ0xLEsMyBCYW5rYSBIYXZhbGUvRWZ0L0F0bSw0IFTDvHJrIFRlbGVrb20gw5ZkZW1lIChUVE5FVCksNSBNaWtyb2NhcmQsNiBDYXNoVQ0KCQkJCQkJCSAiY29tbWlzc2lvblR5cGUiID0+IDIgLy8gMSBzZcOnaWxpcnNlIGtvbWlzeW9udSBiaXpkZW4gYWwsIDIgb2x1cnNhIGtvbWlzeW9udSBtw7zFn3Rlcmkgw7ZkZXNpbg0KCQkJCQkgXQ0KCQkJCQkpOw0KCQkJCQkkY3VybCA9IGN1cmxfaW5pdCgpOw0KCQkJCQkJY3VybF9zZXRvcHRfYXJyYXkoJGN1cmwsIGFycmF5KA0KCQkJCQkJCUNVUkxPUFRfVVJMID0+ICJodHRwOi8vYXBpLnBheXdhbnQuY29tL2dhdGV3YXkucGhwIiwNCgkJCQkJCQlDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsDQoJCQkJCQkJQ1VSTE9QVF9FTkNPRElORyA9PiAiIiwNCgkJCQkJCQlDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwNCgkJCQkJCQlDVVJMT1BUX1RJTUVPVVQgPT4gMzAsDQoJCQkJCQkJQ1VSTE9QVF9IVFRQX1ZFUlNJT04gPT4gQ1VSTF9IVFRQX1ZFUlNJT05fMV8xLA0KCQkJCQkJCUNVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsDQoJCQkJCQkJQ1VSTE9QVF9QT1NURklFTERTID0+IGh0dHBfYnVpbGRfcXVlcnkoJHBvc3REYXRhKSwNCgkJCQkJCSkpOw0KCQkJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmwpOyAkZXJyID0gY3VybF9lcnJvcigkY3VybCk7DQoJCQkJCWlmICgkZXJyKXsNCgkJCQkJCS8vIGVjaG8gImNVUkwgRXJyb3IgIzoiIC4gJGVycjsgLy8gY1VSTCBoYXRhc8SxbsSxIGVrcmFuYSBiYXN0xLFyDQoJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkJla2xlbm1lZGlrIGJpciBoYXRhIG9sdcWfdHUsIGzDvHRmZW4gZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbi4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCSRqc29uRGVjb2RlID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlLGZhbHNlKTsNCgkJCQkJCQlpZigkanNvbkRlY29kZS0+U3RhdHVzID09IDEwMCl7DQoJCQkJCQkJCSR0YXJpaAk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCQkJCSRla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwYXl3YW50X29kZW1lbGVyIFNFVCBvZGVtZV9la3N0cmE9Pywgb2RlbWVfc2FoaWJpPT8sIG9kZW1lX2thbmFsaT0/LCBvZGVtZV90dXRhcmk9Pywgb2RlbWVfbmV0PT8sIG9kZW1lX2R1cnVtPT8sIG9kZW1lX3RhcmloPT8iKTsNCgkJCQkJCQkJJGVrbGUtPiBleGVjdXRlKGFycmF5KCRleHRyYURhdGEsJHV5ZS0+dXNlcm5hbWUsJHlvbnRlbU5hc2lsLCRiYWtpeWVUdXRhciwnQ2V2YXAgYmVrbGVuaXlvcicsJ0Jla2xlbWVkZScsJHRhcmloKSk7DQoJCQkJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIGnFn2xlbWluaXogacOnaW4gw7ZkZW1lIHNheWZhc8SxbmEgecO2bmxlbmRpcmlsaXlvcnN1bnV6LCBsw7x0ZmVuIGJla2xleWluLiIsInMiPT4ic3VjY2VzcyIsInIiPT4gJGpzb25EZWNvZGUtPk1lc3NhZ2VdOw0KCQkJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkvLyBlY2hvICRyZXNwb25zZTsgLy8gRMO2bmVuIGhhdGFuxLFuIG5lIG9sZHXEn3VudSBiYXN0xLFyDQoJCQkJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iQmVrbGVubWVkaWsgYmlyIGhhdGEgb2x1xZ90dSwgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluLiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCQl9DQoJCQkJCX0NCgkJCQkJY3VybF9jbG9zZSgkY3VybCk7DQoJCQkJCSMjIFBBWVdBTlQgw5ZERU1FIELEsFTEsFIgIyMNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FkZF9wYXl3YW50LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1R8R0VUJywgJy9wYXl3YW50LW9kZW1lLWthYnVsJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCg0KCQkJCQkjIyBQQVlXQU5UIMOWREVNRSBLQUJVTCBCQcWeTEEgIyMNCgkJCQkJJGFwaUtleSAJCQk9ICRzaXRlYXlhci0+cGF5d2FudF9hcGk7IC8vIFBBWVdBTlQgQVBJDQoJCQkJCSRhcGlTZWNyZXQgCQk9ICRzaXRlYXlhci0+cGF5d2FudF9zZWNyZXQ7IC8vIEFQSSBHSVpMSSBBTkFIVEFSDQoJCQkJCWlmICgkX1BPU1Qpew0KCQkJCQkJJFNpcGFyaXNJRCAJCT0gJF9QT1NUWyJTaXBhcmlzSUQiXTsNCgkJCQkJCSRFeHRyYURhdGEgCQk9ICRfUE9TVFsiRXh0cmFEYXRhIl07DQoJCQkJCQkkVXNlcklEIAkJCT0gJF9QT1NUWyJVc2VySUQiXTsNCgkJCQkJCSRSZXR1cm5EYXRhIAk9ICRfUE9TVFsiUmV0dXJuRGF0YSJdOw0KCQkJCQkJJFN0YXR1cyAJCQk9ICRfUE9TVFsiU3RhdHVzIl07DQoJCQkJCQkkT2RlbWVLYW5hbGkgCT0gJF9QT1NUWyJPZGVtZUthbmFsaSJdOw0KCQkJCQkJJE9kZW1lVHV0YXJpIAk9ICRfUE9TVFsiT2RlbWVUdXRhcmkiXTsNCgkJCQkJCSROZXRLYXphbmMgCQk9ICRfUE9TVFsiTmV0S2F6YW5jIl07DQoJCQkJCQkkSGFzaCAJCQkJPSAkX1BPU1RbIkhhc2giXTsNCgkJCQkJCWlmICgkU2lwYXJpc0lEICE9ICIiIHx8ICRFeHRyYURhdGEgIT0gIiIgfHwgJFVzZXJJRCAhPSAiIiB8fCAkUmV0dXJuRGF0YSAhPSAiIiB8fCAkU3RhdHVzICE9ICIiIHx8ICRPZGVtZUthbmFsaSAhPSAiIiB8fCAkT2RlbWVUdXRhcmkgIT0iIiB8fCAkTmV0S2F6YW5jICE9ICIiIHx8ICRIYXNoICE9ICIiKXsNCgkJCQkJCQkJJGhhc2hLb250cm9sID0gYmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsIiRTaXBhcmlzSUR8JEV4dHJhRGF0YXwkVXNlcklEfCRSZXR1cm5EYXRhfCRTdGF0dXN8JE9kZW1lS2FuYWxpfCRPZGVtZVR1dGFyaXwkTmV0S2F6YW5jIiAuICRhcGlLZXksICRhcGlTZWNyZXQsIHRydWUpKTsNCgkJCQkJCQkJaWYgKCRIYXNoID09ICRoYXNoS29udHJvbCl7DQoJCQkJCQkJCQlpZiAoJFN0YXR1cyA9PSAxMDApIHsNCgkJCQkJCQkJCQkkdXllc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBpZD0/Iik7DQoJCQkJCQkJCQkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJFVzZXJJRCkpOw0KCQkJCQkJCQkJCSR1eWVjZWsJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCQkJCQkJCWlmICggJHV5ZXNvci0+cm93Q291bnQoKSApIHsNCgkJCQkJCQkJCQkJCSRvZGVtZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBwYXl3YW50X29kZW1lbGVyIFdIRVJFIG9kZW1lX2Vrc3RyYT0/ICYmIG9kZW5kaW1pPT8iKTsNCgkJCQkJCQkJCQkJCSRvZGVtZXNvci0+IGV4ZWN1dGUoYXJyYXkoJEV4dHJhRGF0YSwwKSk7DQoJCQkJCQkJCQkJCQkJaWYgKCAkb2RlbWVzb3ItPnJvd0NvdW50KCkgKSB7DQoJCQkJCQkJCQkJCQkJCSRvZGVtZWNlayAgPSAkb2RlbWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJCQkJCQkJCQkJJGVrbGVuZWNlayA9ICRvZGVtZWNlay0+b2RlbWVfdHV0YXJpOw0KCQkJCQkJCQkJCQkJCQkkYmFraXllCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXllbGVyIFNFVCBiYWtpeWU9PyBXSEVSRSBpZD0/Iik7DQoJCQkJCQkJCQkJCQkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPmJha2l5ZSskZWtsZW5lY2VrLCRVc2VySUQpKTsNCgkJCQkJCQkJCQkJCQkJCWlmICgkYmFraXllKSB7DQoJCQkJCQkJCQkJCQkJCQkJJGR1emVsdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHBheXdhbnRfb2RlbWVsZXIgU0VUIG9kZW5kaW1pPT8sIG9kZW1lX25ldD0/LCBvZGVtZV9kdXJ1bT0/IFdIRVJFIG9kZW1lX2Vrc3RyYT0/Iik7DQoJCQkJCQkJCQkJCQkJCQkJJGR1emVsdC0+IGV4ZWN1dGUoYXJyYXkoMSwkZWtsZW5lY2VrLCdPbmF5bGFuZMSxJywkRXh0cmFEYXRhKSk7DQoJCQkJCQkJCQkJCQkJCQkJJHRhcmloICA9IGRhdGUoIlkubS5kIEg6aTpzIik7DQoJCQkJCQkJCQkJCQkJCQkJJGthemFuYwkJPQkJJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBiYWtpeWVfa2F6YW5jIFNFVCB0dXRhcj0/LCB0YXJpaD0/Iik7DQoJCQkJCQkJCQkJCQkJCQkJJGthemFuYwkJLT4JZXhlY3V0ZShhcnJheSgkZWtsZW5lY2VrLCR0YXJpaCkpOw0KCQkJCQkJCQkJCQkJCQkJCWVjaG8gIk9LIjsNCgkJCQkJCQkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCQkJCQkJCWVjaG8gIk5PIC0gQkFLxLBZRSBFS0xFTkVNRUTEsCI7DQoJCQkJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCQkJfWVsc2V7DQoJCQkJCQkJCQkJCQkJCWVjaG8gIk5PIC0gw5ZERU1FIERBSEEgw5ZOQ0UgWUFQSUxNScWeIjsNCgkJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCQkJZWNobyAiTk8gLSBCw5ZZTEUgS1VMTEFOSUNJIFlPSyI7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCSRkdXplbHQJPQkkdnQtPnByZXBhcmUoIlVQREFURSBwYXl3YW50X29kZW1lbGVyIFNFVCAgb2RlbWVfbmV0PT8sIG9kZW1lX2R1cnVtPT8gV0hFUkUgb2RlbWVfZWtzdHJhPT8iKTsNCgkJCQkJCQkJCQkkZHV6ZWx0LT4gZXhlY3V0ZShhcnJheSgkZWtsZW5lY2VrLCfEsHB0YWwnLCRFeHRyYURhdGEpKTsNCgkJCQkJCQkJCQllY2hvICdOTyAtIMOWREVNRSDEsFBUQUwgRUTEsExNxLDFnic7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJZWNobyAnTk8gLSBIQVNIIEhBVEFMSSc7DQoJCQkJCQkJCX0NCgkJCQkJCX1lbHNlew0KCQkJCQkJCWVjaG8gJ05PIC0gUEFSQU1FVFJFIEVLU0lLJzsNCgkJCQkJCX0NCgkJCQkJfWVsc2V7DQoJCQkJCQllY2hvICdOTyAtIFBPU1QgWU9LJzsNCgkJCQkJfQ0KCQkJCQkjIyBQQVlXQU5UIMOWREVNRSBLQUJVTCBCxLBUxLBSICMjDQoJfSwnYWRkX3BheXdhbnRfYWNjZXB0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL21vYmlsLW9uYXknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkb25heV9rb2R1CT0JJF9QT1NUWyJvbmF5X2tvZHUiXTsNCg0KCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gb25heV9rb2RsYXJpIFdIRVJFIG9uYXlfc2FoaWJpPT8gJiYgb25heV9rb2R1PT8iKTsNCgkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwkb25heV9rb2R1KSk7DQoJCQkJaWYgKCBlbXB0eSgkb25heV9rb2R1KSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlaWYoICRzb3ItPnJvd0NvdW50KCkgKXsNCgkJCQkJJHVwZGF0ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgb25heT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoMSwkdXllLT51c2VybmFtZSkpOw0KCQkJCQkkc2lsCQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gb25heV9rb2RsYXJpIFdIRVJFIG9uYXlfc2FoaWJpPT8iKTsNCgkJCQkJJHNpbAktPglleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJCQlpZiAoICR1cGRhdGUgKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJIZXNhYsSxbsSxeiBvbmF5bGFuZMSxLCBhcnTEsWsgc2lwYXJpxZ8gdmVybWV5ZSBoYXrEsXJzxLFuxLF6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JyldOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+Ikhlc2FixLFuxLF6IG9uYXlsYW5hbWFkxLEuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iT25heSBrb2R1bnUgeWFubMSxxZ8gZ2lyZGluaXouIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnbW9iaWxlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSRtYWlsCQkJPQkkX1BPU1RbIm1haWwiXTsNCgkJJHBhc3N3b3JkCT0JbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk7DQoJCSRyZW1lbWJlciAJPQlAJF9QT1NUWyJyZW1lbWJlciJdOw0KDQoJCSRrc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBtYWlsPT8gJiYgcGFzc3dvcmQ9PyIpOw0KCQkka3Nvcmd1CQktPglleGVjdXRlKGFycmF5KCRtYWlsLCRwYXNzd29yZCkpOw0KCQkka2JpbGdpCQk9CSRrc29yZ3UJCS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCWlmICggZW1wdHkoJG1haWwpIHx8IGVtcHR5KCRfUE9TVFsicGFzc3dvcmQiXSkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoISRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iS3VsbGFuxLFjxLEgYWTEsW7EsXogeWEgZGEgcGFyb2xhbsSxeiBoYXRhbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkX1NFU1NJT05bImxvZ2luIl0JCQk9CXRydWU7DQoJCQkkX1NFU1NJT05bInVzZXJuYW1lIl0JCT0JJGtiaWxnaS0+dXNlcm5hbWU7DQoNCgkJCWlmKCBAJHJlbWVtYmVyID09IHRydWUgKSB7IHNldGNvb2tpZSgndXNlcm5hbWUnLCRrYmlsZ2ktPnVzZXJuYW1lLHRpbWUoKSs2MCo2MCoyNCo3KTsgfQ0KDQoNCgkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS3VsbGFuxLFjxLEgZ2lyacWfaSB5YXDEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2xvZ2luLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2FkbWluL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSRtYWlsCQkJPQkkX1BPU1RbIm1haWwiXTsNCgkJJHBhc3N3b3JkCT0JbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk7DQoNCgkJJGtzb3JndQkJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIG1haWw9PyAmJiBwYXNzd29yZD0/ICYmIHlldGtpPT8iKTsNCgkJJGtzb3JndQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCwkcGFzc3dvcmQsJ0FkbWluJykpOw0KCQkka2JpbGdpCQk9CSRrc29yZ3UJCS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCWlmICggZW1wdHkoJG1haWwpIHx8IGVtcHR5KCRfUE9TVFsicGFzc3dvcmQiXSkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoISRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iS3VsbGFuxLFjxLEgYWTEsW7EsXogeWEgZGEgcGFyb2xhbsSxeiBoYXRhbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkX1NFU1NJT05bImFkbWlubG9naW4iXQk9CXRydWU7DQoJCQkkX1NFU1NJT05bImFkbWluIl0JCQk9CXRydWU7DQoJCQkkX1NFU1NJT05bInVzZXJuYW1lIl0JCT0JJGtiaWxnaS0+dXNlcm5hbWU7DQoNCgkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iQWRtaW4gZ2lyacWfaSB5YXDEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX21haW4udmlldycpXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2FkbWlubG9naW4ucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvcHJvZmlsJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCSRwYXNzd29yZAk9CW1kNSgkX1BPU1RbInBhc3N3b3JkIl0pOw0KCQkJJHlwYXNzCQk9CW1kNSgkX1BPU1RbIm5wYXNzd29yZCJdKTsNCgkJCSR5eXBhc3MJCT0JJF9QT1NUWyJubnBhc3N3b3JkIl07DQoNCg0KCQkJaWYgKCBlbXB0eSgkX1BPU1RbInBhc3N3b3JkIl0pIHx8IGVtcHR5KCRfUE9TVFsibnBhc3N3b3JkIl0pIHx8IGVtcHR5KCRfUE9TVFsibm5wYXNzd29yZCJdKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoJHV5ZS0+cGFzc3dvcmQhPSRwYXNzd29yZCl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iR2XDp2VybGkgcGFyb2xhbsSxesSxIHlhbmzEscWfIGdpcmRpbml6LiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCBzdHJsZW4oJF9QT1NUWyJucGFzc3dvcmQiXSk8NiApew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYW7EsXogZW4gYXogNiBrYXJha3RlcmRlbiBvbHXFn21hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCAkX1BPU1RbIm5wYXNzd29yZCJdICE9ICRfUE9TVFsibm5wYXNzd29yZCJdICApew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkdpcmlsZW4geWVuaSDFn2lmcmVsZXIgYmlyYmlyaW5pbiBheW7EsXPEsSBvbG1hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCgkJCQkkdXBkYXRlCQk9CQkkdnQtPnByZXBhcmUoIlVQREFURSB1eWVsZXIgU0VUIHBhc3N3b3JkPT8gV0hFUkUgdXNlcm5hbWU9PyAiKTsNCgkJCQkkdXBkYXRlCQktPglleGVjdXRlKGFycmF5KCR5cGFzcywkdXllLT51c2VybmFtZSkpOw0KCQkJCQlpZiAoJHVwZGF0ZSkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJQYXJvbGFuxLF6xLEgYmHFn2FyxLEgaWxlIGfDvG5jZWxsZWRpbml6LiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfWVsc2V7DQoJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IlBhcm9sYW7EsXrEsSBnw7xuY2VsbGVya2VuIGJpciBoYXRhIGlsZSBrYXLFn8SxbGHFn3TEsWsuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfQ0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ215X3NldHRpbmcucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcveWVuaS1zaXBhcmlzJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc21tYXBpOw0KDQoNCgkJCSRrYXRlZ29yaQkJCT0JJF9QT1NUWyJzZXJ2aXNLYXQiXTsNCgkJCSRtaWt0YXIJCQkJPQkkX1BPU1RbInNlcnZpc01pa3RhciJdOw0KCQkJJGJha2l5ZQkJCQk9CSR1eWUtPmJha2l5ZTsNCgkJCSR1cnVuCQkJCQk9CSRfUE9TVFsic2VydmlzVXJ1biJdOw0KCQkJJGxpbmsJCQkJCT0JJF9QT1NUWyJzZXJ2aXNMaW5rIl07DQoJCQkkdXNlcgkJCQkJPQkkdXllLT51c2VybmFtZTsNCgkJCSRnb25kZXJpU2F5aQk9CUAkX1BPU1RbImdvbmRlcmlTYXlpIl07DQoJCQkkZ2VjaWttZQkJCT0JQCRfUE9TVFsiZ2VjaWttZSJdOw0KCQkJJG90b01pbgkJCQk9CUAkX1BPU1RbIm90b01pbiJdOw0KCQkJJG90b01hawkJCQk9CUAkX1BPU1RbIm90b01hayJdOw0KCQkJJHlvcnVtbGFyCQkJPQlAJF9QT1NUWyJ5b3J1bWxhciJdOw0KCQkJJHlvcnVtc2F5aQkJPQljb3VudChleHBsb2RlKCJcbiIsJHlvcnVtbGFyKSk7DQoNCgkJCSR1cnVuYmlsZ2k9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJCSR1cnVuYmlsZ2ktPglleGVjdXRlKGFycmF5KCR1cnVuKSk7DQoJCQkkdXJ1bmJpbGdpPQkkdXJ1bmJpbGdpLT5mZXRjaChQRE86OkZFVENIX09CSik7IGlmKCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSJQYWtldCIpeyRtaWt0YXI9IjEiO30NCgkJCWlmKCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdQYWtldCcpeyRtaWt0YXI9JHVydW5iaWxnaS0+dXJ1bl9taW47fQ0KCQkJJGFwaQkJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBpZD0/Iik7DQoJCQkkYXBpCQktPglleGVjdXRlKGFycmF5KCR1cnVuYmlsZ2ktPnVydW5fYXBpKSk7DQoJCQkkYXBpCQkJPQkkYXBpLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCg0KCQkJJG96ZWxmaXlhdD0JCSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/ICYmIGZpeWF0X3NlcnZpcz0/Iik7DQoJCQkkb3plbGZpeWF0LT4gZXhlY3V0ZShhcnJheSgkdXNlciwkdXJ1bikpOw0KCQkJJG96ZWxzYXkJPQkJJG96ZWxmaXlhdC0+cm93Q291bnQoKTsNCgkJCSRvemVsZml5YXQ9CQkkb3plbGZpeWF0LT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJCWlmICgkb3plbHNheSkgew0KCQkJCWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1Bha2V0JyApIHsNCgkJCQkJJGZpeWF0ICAgCT0gJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQ7DQoJCQkJCSRtaWt0YXIJCT0JQCR1cnVuYmlsZ2ktPnVydW5fbWluOw0KCQkJCQkkeWJha2l5ZSAgCT0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9ZWxzZWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1NlcnZpcycgKSB7DQoJCQkJCSRmaXlhdCAgICAJPSAJJG1pa3RhciooJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQvMTAwMCk7DQoJCQkJCSR5YmFraXllICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX1lbHNlaWYgKCBAJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaSA9PSAnWW9ydW0nICkgew0KCQkJCQkkZml5YXQgICAgCT0gJHlvcnVtc2F5aSooJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQvMTAwMCk7DQoJCQkJCSR5YmFraXllICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX1lbHNlaWYgKCBAJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaSA9PSAnQWJvbmVsaWsnICkgew0KCQkJCQkkZml5YXQgICAgPSAkbWlrdGFyKiRvemVsZml5YXQtPmZpeWF0X2ZpeWF0Ow0KCQkJCQkkbWlrdGFyIAk9CTE7DQoJCQkJCSR5YmFraXllICAgCT0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9DQoJCQl9ZWxzZXsNCgkJCQlpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdQYWtldCcgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2ZpeWF0Ow0KCQkJCQkkbWlrdGFyCQk9CUAkdXJ1bmJpbGdpLT51cnVuX21pbjsNCgkJCQkJJHliYWtpeWUgID0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9ZWxzZWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1NlcnZpcycgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiRtaWt0YXI7DQoJCQkJCSR5YmFraXllICA9IAkkYmFraXllLSRmaXlhdDsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRzZXJ2aXMJCT0JJHVydW5iaWxnaS0+aWQ7DQoJCQkJfWVsc2VpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdZb3J1bScgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiR5b3J1bXNheWk7DQoJCQkJCSR5YmFraXllICA9IAkkYmFraXllLSRmaXlhdDsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRzZXJ2aXMJCT0JJHVydW5iaWxnaS0+aWQ7DQoJCQkJfWVsc2VpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdBYm9uZWxpaycgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiRtaWt0YXI7DQoJCQkJCSRtaWt0YXIgCT0JMTsNCgkJCQkJJHliYWtpeWUgICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX0NCgkJCX0NCg0KDQoNCgkJCWlmICggJHVydW49PScwJyB8fCAka2F0ZWdvcmk9PSdrYXRlZ29yaXNlYycgIHx8IGVtcHR5KCRsaW5rKSB8fCAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSJTZXJ2aXMiICYmIGVtcHR5KCRtaWt0YXIpICkgfHwgKCAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpPT0iWW9ydW0iICYmIGVtcHR5KCR5b3J1bWxhcikgKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiggJGJha2l5ZTwkZml5YXQgKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCYWtpeWVuaXogeWV0ZXJzaXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kJPT0JIkFib25lbGlrIiAmJiBlbXB0eSgkZ29uZGVyaVNheWkpICl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iR8O2bmRlcmkgc2F5xLFzxLFuxLEgZG9sZHVybWFsxLFzxLFuxLF6IiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdTZXJ2aXMnICYmICRtaWt0YXI8JHVydW5iaWxnaS0+dXJ1bl9taW4gICl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWluaW11bSBzaXBhcmnFnyBtaWt0YXLEsW5kYW4gZMO8xZ/DvGsuIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdZb3J1bScgJiYgJHlvcnVtc2F5aTwkdXJ1bmJpbGdpLT51cnVuX21pbiAgKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJTaXBhcmnFnyBlZGlsZW4gbWlrdGFyLCBtaW5pbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBkw7zFn8O8ay4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdZb3J1bScgJiYgJHlvcnVtc2F5aT4kdXJ1bmJpbGdpLT51cnVuX21heCAgKSB7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIGZhemxhLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpPT0nQWJvbmVsaWsnICYmICRvdG9NaW48JHVydW5iaWxnaS0+dXJ1bl9taW4gKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJTaXBhcmnFnyBlZGlsZW4gbWlrdGFyLCBtaW5pbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBkw7zFn8O8ay4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoJG1pa3Rhcj4kdXJ1bmJpbGdpLT51cnVuX21heCkgew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlNpcGFyacWfIGVkaWxlbiBtaWt0YXIsIG1ha3NpbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBmYXpsYS4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdBYm9uZWxpaycgJiYgJG90b01haz4kdXJ1bmJpbGdpLT51cnVuX21heCAgKSB7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIGZhemxhLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCg0KCQkJCWlmICgkdXJ1bmJpbGdpLT51cnVuX2FwaT09Ik1hbnVlbCIpIHsNCgkJCQkJJGFwaVNpcGFyaXMJCQk9CWFycmF5KCJvcmRlciI9PiJNYW51ZWwiKTsNCgkJCQkJJGFwaVNpcGFyaXMgCQk9IChvYmplY3QpICRhcGlTaXBhcmlzOw0KCQkJCQkkYXBpX29yZGVyX2lkCQk9CTE7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAiVGFraXBjaWFsLm5ldCIgKXsNCgkJCQkJJHBvc3QgPSBhcnJheSgNCgkJCQkJCSd0eXBlJwkJPT4gJ25ld29yZGVyJywNCgkJCQkJCSdzZXJ2aWNlJwk9PiAnZm9sbG93JywNCgkJCQkJCSd1c2VybmFtZScJPT4gJGxpbmssDQoJCQkJCQkncXVhbnRpdHknCT0+ICRtaWt0YXIsDQoJCQkJCSk7DQoJCQkJCSR0YWtpcGNpCQkJPQl0YWtpcGNpYWxuZXRBUEkoICRwb3N0LCAkYXBpLT5hcGlfYXBpLCAkYXBpLT5hcGlfdXJsICk7DQoJCQkJCSR0YWtpcGNpYWxuZXQJPQlqc29uX2RlY29kZSgkdGFraXBjaSk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJPQlAJHRha2lwY2lhbG5ldC0+Y2FsbGJhY2stPm9yZGVyaWQ7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnQmVnZW5pa2FzbWEuY29tJyApew0KCQkJCQkkYXBpU2lwYXJpcwkJCQk9CWJlZ2VuaWthc21hQVBJKCRhcGktPmFwaV9hcGksJGFwaS0+YXBpX3VybCwkbGluaywkbWlrdGFyKTsNCgkJCQkJJGFwaVNpcGFyaXMJCQkJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkYXBpU2lwYXJpcy0+b3JkZXJfaWQ7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnam5zdGEubW9iaScgKXsNCgkJCQkJJGZhcGkgCQkJCQkJPSBuZXcgc29jaWFsc21lZGlhX2FwaSgkYXBpLT5hcGlfYXBpKTsNCgkJCQkJJGRhdGEgPSBhcnJheSgNCgkJCQkJCSdjbWQnICAgICA9PiAgJ29yZGVyYWRkJywnb3JkZXJzJyAgPT4gIGFycmF5KA0KCQkJCQkJIDAgPT4gIGFycmF5KCdzZXJ2aWNlJyA9PiAgJHVydW5iaWxnaS0+dXJ1bl9hcGlfc2VydmlzLCdhbW91bnQnID0+ICAkbWlrdGFyLCAnZGF0YScgPT4gJGxpbmssKSkNCgkJCQkJICk7DQoJCQkJCSAJJHJlc3VsdCAJCQkJCT0gJGZhcGktPnF1ZXJ5KCRkYXRhKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkcmVzdWx0WzBdWzBdW2lkXTsNCgkJCQl9ZWxzZWlmKCAkYXBpLT5hcGlfdGVyY2loID09ICdTb3N5YWxwYXphcmltLmNvbScgKXsNCgkJCQkJJGFwaVNpcGFyaXMJCQkJPQlzb3N5YWxwYXphcmltQWwoJG1pa3RhciwkbGluaywkYXBpLT5hcGlfYXBpKTsNCgkJCQkJJGFwaVNpcGFyaXNTb3N5YWwJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CTE7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnWXRtYXRpa3ZpcC5jb20nICl7DQoJCQkJCSRhcGlTaXBhcmlzCQkJCT0JWVRNYXRpa2FsKCRhcGktPmFwaV9hcGksJGFwaS0+YXBpX3VybCwkdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJGxpbmssJG1pa3Rhcik7DQoJCQkJCSRhcGlTaXBhcmlzU29zeWFsCT0JanNvbl9kZWNvZGUoJGFwaVNpcGFyaXMpOw0KCQkJCQkkYXBpX29yZGVyX2lkCQkJPQlAJGFwaVNpcGFyaXMtPm9yZGVyOw0KCQkJCX1lbHNlaWYoICRhcGktPmFwaV90ZXJjaWggPT0gJ0hpem1ldHBhbmVsaS5jb20nICl7DQoJCQkJCSRhcGlTaXBhcmlzCQkJCT0JaGl6bWV0cGFuZWxpU2F0aW4oJGFwaS0+YXBpX2FwaSwkdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJG1pa3RhciwkbGluaywkYXBpLT5hcGlfdXJsKTsNCgkJCQkJJGFwaVNpcGFyaXNTb3N5YWwJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJfWVsc2V7DQoJCQkJCWlmICggJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaQk9PQkiQWJvbmVsaWsiICkgew0KCQkJCQkJJGFwaVNpcGFyaXMgCT0gJHNtbWFwaS0+eWVuaVNpcGFyaXMoYXJyYXkoJ2tleScgPT4kYXBpLT5hcGlfYXBpLCdhY3Rpb24nID0+J2FkZCcsJ3NlcnZpY2UnPT4kdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJ3VzZXJuYW1lJz0+JGxpbmssJ21pbic9PiRvdG9NaW4sJ21heCc9PiRvdG9NYWssJ3Bvc3RzJz0+JGdvbmRlcmlTYXlpLCdkZWxheSc9PiRnZWNpa21lKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQkkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kJPT0JIllvcnVtIiApIHsNCgkJCQkJCSRhcGlTaXBhcmlzIAk9ICRzbW1hcGktPnllbmlTaXBhcmlzKGFycmF5KCdrZXknID0+JGFwaS0+YXBpX2FwaSwnYWN0aW9uJyA9PidhZGQnLCdzZXJ2aWNlJz0+JHVydW5iaWxnaS0+dXJ1bl9hcGlfc2VydmlzLCdsaW5rJz0+JGxpbmssJ2NvbW1lbnRzJz0+JHlvcnVtbGFyKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQkkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJCX1lbHNlew0KCQkJCQkJJGFwaVNpcGFyaXMgCT0gJHNtbWFwaS0+eWVuaVNpcGFyaXMoYXJyYXkoJ2tleScgPT4kYXBpLT5hcGlfYXBpLCdhY3Rpb24nID0+J2FkZCcsJ3NlcnZpY2UnPT4kdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJ2xpbmsnPT4kbGluaywncXVhbnRpdHknPT4kbWlrdGFyKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQlAJGFwaVNpcGFyaXMtPm9yZGVyOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKCBAJGFwaVNpcGFyaXMtPm9yZGVyIHx8ICRhcGlfb3JkZXJfaWQgfHwgQCR0YWtpcGNpYWxuZXQtPnN0YXR1cz09J3N1Y2Nlc3MnIHx8IEAkYXBpU2lwYXJpc1Nvc3lhbC0+aXNsZW09PSdiYXNhcmlsaScgKSB7DQoJCQkJCSRzaXBhcmlzCQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gc2lwYXJpc2xlciBTRVQgc2lwYXJpc19zYWhpYmk9Pywgc2lwYXJpc19zZXJ2aXM9PywgdXJ1bl9hcGlfb3JkZXJfaWQ9Pywgc2lwYXJpc19kdXJ1bT0/LCBzaXBhcmlzX21pa3Rhcj0/LCBzaXBhcmlzX3R1dGFyPT8sIHNpcGFyaXNfbGluaz0/LCBzaXBhcmlzX3RhcmloPT8iKTsNCgkJCQkJJHNpcGFyaXMtPiAgZXhlY3V0ZShhcnJheSgkdXNlciwkc2VydmlzLCRhcGlfb3JkZXJfaWQsJ0Jla2xlbWVkZScsJG1pa3RhciwkZml5YXQsJGxpbmssJHRhcmloKSk7DQoJCQkJCQlpZiAoJHNpcGFyaXMpIHsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IlNpcGFyacWfaW5peiB2ZXJpbGRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQkJJGJha2l5ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYmFraXllPT8gV0hFUkUgdXNlcm5hbWU9PyIpOw0KCQkJCQkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCR5YmFraXllLCR1c2VyKSk7DQoJCQkJCQkJLy9zaXBhcmlzTWFpbCgnYjgxZXJpa2FuQGdtYWlsLmNvbScsJ1llbmkgc2lwYXJpxZ9pbml6IG1ldmN1dC4nLCdTaXBhcmnFnyBCaWxnaWxlbmRpcm1lJyk7DQoJCQkJCQl9ZWxzZWlmKCRhcGlTaXBhcmlzLT5lcnJvcil7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gdmVyaWxpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlNpcGFyacWfIHZlcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQl9DQoNCgkJCWV4aXQoKTsNCg0KCX0sJ25ld19vcmRlci5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy95ZW5pLWRlc3Rlay10YWxlYmknLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCSRrb251CQk9CSRfUE9TVFsia29udSJdOw0KCQkkYmFzbGlrCT0JJF9QT1NUWyJiYXNsaWsiXTsNCgkJJGljZXJpawk9CSRfUE9TVFsiaWNlcmlrIl07DQoJCSR0YXJpaAk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoNCgkJJHNvcmd1CT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/ICIpOw0KCQkkc29yZ3UtPiAgZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwnQcOnxLFrJykpOw0KDQoJCWlmICggZW1wdHkoJGtvbnUpIHx8IGVtcHR5KCRiYXNsaWspIHx8IGVtcHR5KCRpY2VyaWspICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iSGFsZW4gw6fDtnrDvGxtZW1pxZ8gYmlyIGRlc3RlayB0YWxlYmluIHZhci4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHRhbGVwCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBsZXIgU0VUIHRhbGVwX3NhaGliaT0/LCB0YWxlcF90YXJpaGk9PywgdGFsZXBfYmFzbGlrPT8sIHRhbGVwX2tvbnU9PywgdGFsZXBfZHVydW09PyAiKTsNCgkJCSR0YWxlcCAtPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lLCR0YXJpaCwkYmFzbGlrLCRrb251LCdBw6fEsWsnKSk7DQoJCQkkaWQJCQk9CSR2dC0+bGFzdEluc2VydElkKCk7DQoJCQkkdGFsZXBpCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBfY2V2YXAgU0VUIHRhbGVwX2lkPT8sIHRhbGVwX3RhcmloaT0/LCB0YWxlcF9pY2VyaWs9PywgdGFsZXBfdXNlcj0/ICIpOw0KCQkJJHRhbGVwaS0+IGV4ZWN1dGUoYXJyYXkoJGlkLCR0YXJpaCwkaWNlcmlrLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCR0YWxlcCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkRlc3RlayB0YWxlYmluaXogb2x1xZ90dXJ1bGR1LCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCdhbGxfdGlja2V0cy52aWV3JyldOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkRlc3RlayB0YWxlYmluaXogb2x1xZ90dXJ1bHVya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ25ld190aWNrZXQucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvdGFsZWJlLWNldmFwLXZlci1bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCg0KCQkkaWQJCQk9CSRzbHVnOw0KCQkkaWNlcmlrCT0JJF9QT1NUWyJpY2VyaWsiXTsNCgkJJHRhcmloCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCg0KCQkkc29yZ3UJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIFdIRVJFIGlkPT8iKTsNCgkJJHNvcmd1LT4gIGV4ZWN1dGUoYXJyYXkoJGlkKSk7DQoNCgkJaWYgKCBlbXB0eSgkaWNlcmlrKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoJHNvcmd1LT5yb3dDb3VudCgpPDApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQsO2eWxlIGJpciBkZXN0ZWsgdGFsZWJpIHlvay4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHRhbGVwaQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gZGVzdGVrX3RhbGVwX2NldmFwIFNFVCB0YWxlcF9pZD0/LCB0YWxlcF90YXJpaGk9PywgdGFsZXBfaWNlcmlrPT8sIHRhbGVwX3VzZXI9PyAiKTsNCgkJCSR0YWxlcGktPiBleGVjdXRlKGFycmF5KCRpZCwkdGFyaWgsJGljZXJpaywkdXllLT51c2VybmFtZSkpOw0KCQkJCWlmICgkdGFsZXBpKSB7DQoJCQkJCSRlZGl0CQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGRlc3Rla190YWxlcGxlciBTRVQgdGFsZXBfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkJCSRlZGl0CQktPiBleGVjdXRlKGFycmF5KCdBw6fEsWsnLCRpZCkpOw0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkRlc3RlayB0YWxlYmluZSBjZXZhcCB2ZXJkaW5peiwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnYWxsX3RpY2tldHMudmlldycpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpbmUgZGVzdGVrIHZlcmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ25ld19yZXBseS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9hamF4LWlzbGVyaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoNCgkJCSRkdXJ1bQk9CSRfUE9TVFsiZHVydW0iXTsNCg0KCQkJaWYgKCRkdXJ1bT09MSkgew0KCQkJCSRpZAkJCQk9CQkkX1BPU1RbImlkIl07DQoJCQkJJHVydW5sZXIJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgdXJ1bl9rYXRlZ29yaT0/ICYmIGR1cnVtPT8iKTsNCgkJCQkkdXJ1bmxlcgktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHNheSAJCQk9CQkkdXJ1bmxlci0+cm93Q291bnQoKTsNCgkJCQkkdXJ1bmxlcgk9CQkkdXJ1bmxlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJGlkPT0ia2F0ZWdvcmlzZWMiKSB7DQoJCQkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSIwIj5Mw7x0ZmVuIMO2bmNlIGthdGVnb3JpIHNlw6dpbi4uPC9vcHRpb24+JzsNCgkJCQkJfWVsc2V7DQoJCQkJCQlpZiAoJHNheSkgew0KCQkJCQkJCWZvcmVhY2ggKCR1cnVubGVyIGFzICR1cnVuKSB7DQoJCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJHVydW4tPmlkLiciPicuJHVydW4tPnVydW5fYWRpLic8L29wdGlvbj4nOw0KCQkJCQkJCX0NCgkJCQkJCX1lbHNlew0KCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IjAiPkJ1IEthdGVnb3JpZGUgw5xyw7xuIEJ1bHVubWFtYWt0YWTEsXIuPC9vcHRpb24+JzsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoJGR1cnVtPT0yKSB7DQoJCQkJJGlkCQkJCT0JCSRfUE9TVFsiaWQiXTsNCgkJCQkkb3plbGZpeWF0PQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGZpeWF0bGFuZGlybWEgV0hFUkUgZml5YXRfc2FoaWJpPT8gJiYgZml5YXRfc2VydmlzPT8iKTsNCgkJCQkkb3plbGZpeWF0LT4gCWV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJGlkKSk7DQoJCQkJJG96ZWxzYXkJPQkJJG96ZWxmaXlhdC0+cm93Q291bnQoKTsNCgkJCQkkb3plbGZpeWF0PQkJJG96ZWxmaXlhdC0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCSR1cnVuCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyAmJiBkdXJ1bT0/Iik7DQoJCQkJJHVydW4gCQktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHVydW4JCQk9CQkkdXJ1bi0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJG96ZWxzYXk+MCkgew0KCQkJCQkJZWNobyAkb3plbGZpeWF0LT5maXlhdF9maXlhdC8xMDAwOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCWlmICgkdXJ1bi0+dXJ1bl9zZWNlbmVnaT09IlNlcnZpcyIgfHwgJHVydW4tPnVydW5fc2VjZW5lZ2k9PSJZb3J1bSIpIHsNCgkJCQkJCQllY2hvICR1cnVuLT51cnVuX2JpcmltOw0KCQkJCQkJfWVsc2VpZigkdXJ1bi0+dXJ1bl9zZWNlbmVnaT09IlBha2V0Iil7DQoJCQkJCQkJZWNobyAkdXJ1bi0+dXJ1bl9iaXJpbSoxMDAwOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZHVydW09PTMpIHsNCgkJCQkkaWQJCQkJPQkJJF9QT1NUWyJpZCJdOw0KCQkJCSR1cnVuCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyAmJiBkdXJ1bT0/Iik7DQoJCQkJJHVydW4gCQktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHVydW4JCQk9CQkkdXJ1bi0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQllY2hvICR1cnVuLT51cnVuX3NlY2VuZWdpOw0KCQkJfQ0KDQoJCQlpZiAoJGR1cnVtPT00KSB7DQoJCQkJJGlkCQkJCT0JCSRfUE9TVFsiaWQiXTsNCgkJCQkkdXJ1bgkJCT0JCSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8gJiYgZHVydW09PyIpOw0KCQkJCSR1cnVuIAkJLT4gCWV4ZWN1dGUoYXJyYXkoJGlkLCcxJykpOw0KCQkJCSR1cnVuCQkJPQkJJHVydW4tPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaWYgKCBzdHJsZW4oJHVydW4tPnVydW5fYWNpa2xhbWEpPjUgKSB7DQoJCQkJCQllY2hvICR1cnVuLT51cnVuX2FjaWtsYW1hOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCWVjaG8gJzAnOw0KCQkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZHVydW09PTUpIHsNCgkJCQkkeW9ydW1sYXIJCQkJPQkJJF9QT1NUWyJ5b3J1bWxhciJdOw0KCQkJCWVjaG8gY291bnQoZXhwbG9kZSgiXG4iLCR5b3J1bWxhcikpOw0KCQkJCWV4aXQoKTsNCgkJCX0NCgl9LCd1cnVubGVyaV9jZWsucG9zdCcpOw0KDQoJIyMgQWRtaW4gR0VUIMSwxZ9sZW1sZXJpICMjDQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXphbmMsJGJheWlzYXlpc2ksJG9kZW1lc2F5aXNpLCR0YWxlcHNheWlzaTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknQW5hc2F5ZmEnOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL21haW4udmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9tYWluLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9naXJpcy15YXAnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhcjsNCgkJCWlmIChAISRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdHaXJpxZ8gWWFwJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2xvZ2luLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX2xvZ2luLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9oYWJlcmxlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRoYWJlcmxlcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0hhYmVybGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL25ld3Mudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX25ldy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicveWVuaS1oYWJlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRoYWJlcmxlcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0hhYmVybGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL25ld19uZXdzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLm5ldy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvaGFiZXItZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJGhhYmVybGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknSGFiZXIgRMO8emVubGUnOw0KCQkJCSRoYWJlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBoYWJlcmxlciBXSEVSRSBpZD0/Iik7DQoJCQkJJGhhYmVyLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCSRoYWJlciA9ICRoYWJlci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vZWRpdF9uZXdzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLmVkaXQudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL29kZW1lbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJG9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lbGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL29kZW1lbGVyLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvcGF5d2FudC1vZGVtZWxlci9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwka2F0ZWdvcmlsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ1BheXdhbnQgw5ZkZW1lbGVyaSc7DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQkkZ296dWtzdW4gPSAyMDsgLy8gTGlzdGVsZW1lZGUgeWFuIHlhbmEga2HDpyBzYXlmYSBudW1hcmFzxLEgb2xzdW4NCgkJCQkJJGthY3RhbmUgID0gMTA7IC8vIFNheWZhZGEgS2HDpyBWZXJpIEfDtnrDvGtzw7xuDQoJCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJCSR2ZXJpc2F5ICA9ICR2dC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGF5d2FudF9vZGVtZWxlciBXSEVSRSBvZGVtZV9kdXJ1bT0nT25heWxhbmTEsScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCQkkdG9wbGFtc2F5ZmEgID0gY2VpbCgkdmVyaXNheS8ka2FjdGFuZSk7IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCQlpZigkdmVyaXNheSE9MCl7aWYoJHNsdWc+JHRvcGxhbXNheWZhKXt5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX3BheXdhbnRfb2RlbWVsZXIudmlldycsWydzbHVnJz0+MV0pKTt9fQ0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJG9kZW1lbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHBheXdhbnRfb2RlbWVsZXIgV0hFUkUgb2RlbWVfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIExJTUlUICRuZXJlZGVuLCRrYWN0YW5lIik7DQoJCQkJCSRvZGVtZWxlcgktPiBleGVjdXRlKGFycmF5KCdPbmF5bGFuZMSxJykpOw0KCQkJCQkkb2RlbWVsZXIJPQkkb2RlbWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9wYXl3YW50X29kZW1lbGVyLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fcGF5d2FudF9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvcGF5dHItb2RlbWVsZXIvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdQYXl3YW50IMOWZGVtZWxlcmknOw0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJGdvenVrc3VuID0gMjA7IC8vIExpc3RlbGVtZWRlIHlhbiB5YW5hIGthw6cgc2F5ZmEgbnVtYXJhc8SxIG9sc3VuDQoJCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCQkkbmVyZWRlbiAgPSAkc2x1Zyoka2FjdGFuZS0ka2FjdGFuZTsgLy8gVmVyaWxlciBOZXJkZW4gw4dla2lsbWV5ZSBCYcWfbGFuYWNhaw0KCQkJCQkkdmVyaXNheSAgPSAkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBheXRyX29kZW1lbGVyIFdIRVJFIG9kZW5kaW1pPScxJyAiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgLy8gVG9wbGFtIEthw6cgU2F5ZmEgVmFyDQoJCQkJCWlmKCR2ZXJpc2F5IT0wKXtpZigkc2x1Zz4kdG9wbGFtc2F5ZmEpe3lvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fcGF5dHJfb2RlbWVsZXIudmlldycsWydzbHVnJz0+MV0pKTt9fQ0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJG9kZW1lbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHBheXRyX29kZW1lbGVyIFdIRVJFIG9kZW5kaW1pPT8gT1JERVIgQlkgaWQgREVTQyBMSU1JVCAkbmVyZWRlbiwka2FjdGFuZSIpOw0KCQkJCQkkb2RlbWVsZXIJLT4gZXhlY3V0ZShhcnJheSgnMScpKTsNCgkJCQkJJG9kZW1lbGVyCT0JJG9kZW1lbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vcGF5dHJfb2RlbWVsZXIudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9wYXl0cl9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvb2RlbWUtZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJG9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lIETDvHplbmxlJzsNCgkJCQkkb2RlbWUJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gYmFua2Ffb2RlbWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJCSRvZGVtZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkb2RlbWUJPQkkb2RlbWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkkYmFua2EgID0gJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGJhbmthX2hlc2FwbGFyaSBXSEVSRSBpZD0/Iik7DQoJCQkJJGJhbmthLT4gZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX2JhbmthKSk7DQoJCQkJJGJhbmthICA9ICRiYW5rYS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vb2RlbWUuZWRpdC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYWRtaW5fb2RlbWUuZWRpdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAtZWtsZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRiYW5rYWxhcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0JhbmthIEhlc2FixLEgRWtsZSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9iYW5rLmFjY291bnQubmV3LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQubmV3LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9iYW5rYS1oZXNhcGxhcmknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaSwkYmFua2FsYXI7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdCYW5rYSBIZXNhcGxhcsSxJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2JhbmsuYWNjb3VudC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYmFua19hY2NvdW50cy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRiYW5rYWxhcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0JhbmthIEhlc2FixLEgRMO8emVubGUnOw0KCQkJCSRiYW5rYQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBiYW5rYV9oZXNhcGxhcmkgV0hFUkUgaWQ9PyIpOw0KCQkJCSRiYW5rYS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkYmFua2EJPQkkYmFua2EtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2JhbmsuYWNjb3VudC5lZGl0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZWRpdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpcy1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaTsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1NpcGFyacWfIETDvHplbmxlJzsNCgkJCQkkc2lwYXJpcwk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIGlkPT8iKTsNCgkJCQkkc2lwYXJpcy0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkc2lwYXJpcwk9CSRzaXBhcmlzLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9vcmRlci5lZGl0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcl9lZGl0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9zaXBhcmlzbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGk7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdTaXBhcmnFn2xlcic7DQoJCQkJJHNsdWcgCT0JMTsNCgkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkkZ296dWtzdW4gPSAyMDsgLy8gTGlzdGVsZW1lZGUgeWFuIHlhbmEga2HDpyBzYXlmYSBudW1hcmFzxLEgb2xzdW4NCgkJCQkka2FjdGFuZSAgPSAxMDsgLy8gU2F5ZmFkYSBLYcOnIFZlcmkgR8O2esO8a3PDvG4NCgkJCQkkbmVyZWRlbiAgPSAkc2x1Zyoka2FjdGFuZS0ka2FjdGFuZTsgLy8gVmVyaWxlciBOZXJkZW4gw4dla2lsbWV5ZSBCYcWfbGFuYWNhaw0KCQkJCSR2ZXJpc2F5ICA9ICR2dC0+cXVlcnkoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciIpLT5yb3dDb3VudCgpOyAvLyBLYcOnIFRhbmUgVmVyaSBWYXINCgkJCQkkdG9wbGFtc2F5ZmEgID0gY2VpbCgkdmVyaXNheS8ka2FjdGFuZSk7IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9vcmRlcnNzLnZpZXcnLFsnc2x1Zyc9PjFdKSk7fQ0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRzaXBhcmlzbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIgT1JERVIgQlkgaWQgREVTQyBMSU1JVCAkbmVyZWRlbiwka2FjdGFuZSIpOw0KCQkJCSRzaXBhcmlzbGVyLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX29yZGVycy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpc2xlci9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGk7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdTaXBhcmnFn2xlcic7DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJGdvenVrc3VuID0gMjA7IC8vIExpc3RlbGVtZWRlIHlhbiB5YW5hIGthw6cgc2F5ZmEgbnVtYXJhc8SxIG9sc3VuDQoJCQkJJGthY3RhbmUgID0gMTA7IC8vIFNheWZhZGEgS2HDpyBWZXJpIEfDtnrDvGtzw7xuDQoJCQkJJG5lcmVkZW4gID0gJHNsdWcqJGthY3RhbmUtJGthY3RhbmU7IC8vIFZlcmlsZXIgTmVyZGVuIMOHZWtpbG1leWUgQmHFn2xhbmFjYWsNCgkJCQkkdmVyaXNheSAgPSAkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJJHRvcGxhbXNheWZhICA9IGNlaWwoJHZlcmlzYXkvJGthY3RhbmUpOyAvLyBUb3BsYW0gS2HDpyBTYXlmYSBWYXINCgkJCQlpZigkc2x1Zz4kdG9wbGFtc2F5ZmEpe3lvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fb3JkZXJzcy52aWV3JyxbJ3NsdWcnPT4xXSkpO30NCgkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkkc2lwYXJpc2xlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoKSk7DQoJCQkJJHNpcGFyaXNsZXIJPQkkc2lwYXJpc2xlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vb3JkZXJzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcnNzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9hcGktZWtsZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0FQSSBPbHXFn3R1cic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vbmV3X2FwaS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ25ld19hcGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaWxlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdTaXN0ZW1kZWtpIEFQSSBTZXJ2aXNsZXJpJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hcGkudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhcGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaS1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdBUEkgT2x1xZ90dXInOw0KCQkJCQkkYXBpCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBpZD0/Iik7DQoJCQkJCSRhcGktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSRhcGkJPQkkYXBpLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vZWRpdF9hcGkudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdlZGl0X2FwaS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmlsZXInLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknU2lzdGVtZGVraSDDnHLDvG4gS2F0ZWdvcmlsZXJpJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hbGxfY2F0ZWdvcmllcy52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FsbF9jYXRlZ29yaWVzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLWVrbGUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdZZW5pIMOccsO8biBFa2xlJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9uZXdfcHJvZHVjdC52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ25ld19wcm9kdWN0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVubGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlcnI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ8OccsO8bmxlcic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3Byb2R1Y3Qudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhbGxfcHJvZHVjdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXJ1bi1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSfDnHLDvG4gRMO8emVubGUnOw0KCQkJCQkkdXJ1bgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJCQkJJHVydW4tPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSR1cnVuCT0JJHVydW4tPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9lZGl0X3Byb2R1Y3Qudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdlZGl0X3Byb2R1Y3QudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS1hcmEnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknw5x5ZSBBcmEnOw0KCQkJCQkka2VsaW1lCT0gJF9HRVRbImFyYSJdOw0KCQkJCQkkdGlwCT0JJF9HRVRbInRpcCJdOw0KCQkJCQlpZiAoICR0aXAgPT0gJ21haWwnICkgew0KCQkJCQkJJHNvciAgCQk9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgbWFpbCBMSUtFID8gIik7DQoJCQkJCQkkc29yCQkJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJfWVsc2VpZiggJHRpcCA9PSAndGVsZWZvbicgKXsNCgkJCQkJCSRzb3IgIAkJPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb24gTElLRSA/ICIpOw0KCQkJCQkJJHNvcgkJCS0+IGV4ZWN1dGUoYXJyYXkoIiUiLiRrZWxpbWUuIiUiKSk7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ3VzZXJuYW1lJyApew0KCQkJCQkJJHNvciAgCQk9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdXNlcm5hbWUgTElLRSA/JyAiKTsNCgkJCQkJCSRzb3IJCQktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQl9ZWxzZWlmKCAkdGlwID09ICdhZCcgKXsNCgkJCQkJCSRzb3IgIAkJPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIGFkc295YWQgTElLRSA/JyAiKTsNCgkJCQkJCSRzb3IJCQktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQl9DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQlpZiAoICR0aXAgPT0gJ21haWwnICkgew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgbWFpbCBMSUtFID8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCQkJJHV5ZWxlcgktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJfWVsc2VpZiggJHRpcCA9PSAndGVsZWZvbicgKXsNCgkJCQkJCSR1eWVsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb24gTElLRSA/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJCSR1eWVsZXIJPQkkdXllbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ3VzZXJuYW1lJyApew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdXNlcm5hbWUgTElLRSA/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJCSR1eWVsZXIJPQkkdXllbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ2FkJyApew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgYWRzb3lhZCBMSUtFID8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCQkJJHV5ZWxlcgktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJfQ0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2FyYV91c2Vycy52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FyYV91c2Vycy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllbGVyL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknU2lzdGVtZGVraSDDnHllbGVyJzsNCgkJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCQkka2FjdGFuZSAgPSAxMDsgLy8gU2F5ZmFkYSBLYcOnIFZlcmkgR8O2esO8a3PDvG4NCgkJCQkJJG5lcmVkZW4gID0gJHNsdWcqJGthY3RhbmUtJGthY3RhbmU7IC8vIFZlcmlsZXIgTmVyZGVuIMOHZWtpbG1leWUgQmHFn2xhbmFjYWsNCgkJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSB1eWVsZXIiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgLy8gVG9wbGFtIEthw6cgU2F5ZmEgVmFyDQoJCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhbGxfdXNlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQkkdXllbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBPUkRFUiBCWSBpZCBERVNDIExJTUlUICRuZXJlZGVuLCRrYWN0YW5lIik7DQoJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hbGxfdXNlcnMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhbGxfdXNlcnMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS9bKjpzbHVnXS9maXlhdGxhcicsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknw5x5ZXllIMOWemVsIEZpeWF0bGFuZMSxcm1hJzsNCgkJCQkJJHV5ZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJCQkkdXllc29yLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCQkJaWYgKCEkdXllc29yCT0JJHV5ZXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopKSB7DQoJCQkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9tYWluLnZpZXcnKSk7DQoJCQkJCQl9DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vcHJpdmF0ZV9wcmljZS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ3ByaXZhdGVfcHJpY2UudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwka2F0ZWdvcmlsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJCWlmICggJHNsdWcgPT0gIlsqOnNsdWddIikgew0KCQkJCQkJCSRzbHVnCT0JJF9HRVRbInNsdWciXTsNCgkJCQkJCX0NCgkJCQkJJHRpdGxlLj0JJ8OceWUgQmlsZ2lsZXJpJzsNCgkJCQkJJHV5ZWJpbGdpCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCSR1eWViaWxnaQktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSR1eWVzYXkJCT0JJHV5ZWJpbGdpLT5yb3dDb3VudCgpOw0KCQkJCQkkdXllYmlsZ2kJPQkkdXllYmlsZ2ktPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2VkaXRfdXNlci52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2VkaXRfdXNlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvZGVzdGVrLXRhbGVwbGVyaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0Rlc3RlayBUYWxlcGxlcmknOw0KCQkJCQkkdGFsZXBsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJJHRhbGVwbGVyLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9kZXN0ZWstdGFsZXBsZXJpL2Jla2xleWVubGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ0HDp8SxaycpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzX2Jla2xleWVubGVyLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9kZXN0ZWstdGFsZXBsZXJpL3lhbml0bGFubWlzJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ1lhbsSxdGxhbmTEsScpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzX3lhbml0bGFuZGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2Rlc3Rlay10YWxlcGxlcmkva2FwYWxpJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ0thcGFsxLEnKSk7DQoJCQkJCSR0YWxlcGxlcgk9CSR0YWxlcGxlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2FsbF90aWNrZXRzLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fdGlja2V0c19rYXBhbGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2Rlc3Rlay10YWxlcC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcAk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBfY2V2YXAgV0hFUkUgdGFsZXBfaWQ9PyBPUkRFUiBCWSBpZCBBU0MiKTsNCgkJCQkJJHRhbGVwLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCQkkdGFsZXAJPQkkdGFsZXAtPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9yZWFkX3RpY2tldC52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FkbWluX3RpY2tldF9yZWFkLnZpZXcnKTsNCg0KDQoNCgkjIyBTTVMgWW9sbGEgIyMNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3RvcGx1LXNtcycsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCSRtZXNhagk9CSRfUE9TVFsic21zIl07DQoJCQl0b3BsdVNNUygkbWVzYWopOw0KCQkJZXhpdCgpOw0KCX0sJ3RvcGx1X3Ntcy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9zbXMteW9sbGEtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCSR1eWVzb3IgPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvciA9ICR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJJG1lc2FqCT0JJF9QT1NUWyJzbXMiXTsNCgkJCXV5ZXllU01TKCR1eWVzb3ItPnRlbGVmb24sJG1lc2FqKTsNCgkJCWV4aXQoKTsNCgl9LCdzZW5kX3Ntcy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy95ZW5pLWtvZC15b2xsYScsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoNCgkJaWYgKCAkdXllLT5vbmF5ID09IDAgKSB7DQoJCQkkb25heXNvciA9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBvbmF5X2tvZGxhcmkgV0hFUkUgb25heV9zYWhpYmk9PyIpOw0KCQkJJG9uYXlzb3ItPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCAkb25heXNvci0+cm93Q291bnQoKSApIHsNCgkJCQkJJG9uYXlzb3IgPSAkb25heXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQkkdAkJCSA9IGRhdGUoIkhpIik7DQoJCQkJCSR0MgkJCT0gZGF0ZSgiSGkiLCBzdHJ0b3RpbWUoJG9uYXlzb3ItPm9uYXlfdGFyaWhpKSk7DQoJCQkJCQlpZiAoICR0LSR0MiA+IDMgKSB7DQoJCQkJCQkJdGVrcmFya29kU01TKCR1eWUtPnRlbGVmb24sJG9uYXlzb3ItPm9uYXlfa29kdSk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJZZW5pIGtvZCBhbGFiaWxtZWsgacOnaW4gc29uIGtvZCBpc3RlbWVuaXppbiDDvHN0w7xuZGVuIDMgZGFraWthIGdlw6dtZWxpIiwicyI9PiJpbmZvIl07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRrb2QJCQk9IHJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpOw0KCQkJCQkka29kZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gb25heV9rb2RsYXJpIFNFVCBvbmF5X3NhaGliaT0/LCBvbmF5X2tvZHU9Pywgb25heV90YXJpaGk9PyIpOw0KCQkJCQkka29kZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJGtvZCwkdGFyaWgpKTsNCgkJCQkJCWlmICgka29kZWtsZSkgew0KCQkJCQkJCXRla3JhcmtvZFNNUygkdXllLT50ZWxlZm9uLCRrb2QpOw0KCQkJCQkJfWVsc2V7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJLb2QgZ8O2bmRlcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJfQ0KCQkJCX0NCgkJfWVsc2V7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJIZXNhYsSxbsSxeiB6YXRlbiBvbmF5bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfQ0KCQlleGl0KCk7DQoJfSwnb25heV9rb2R1LmFnYWluLnBvc3QnKTsNCg0KCSMjIEFkbWluIFBPU1QgxLDFn2xlbWxlcmkgIyMNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJHNvemxlc21lCQkJCQk9CSRfUE9TVFsiY2tFZGl0b3IiXTsNCgkJJHNpdGVfdXJsCQkJCQk9CSRfUE9TVFsic2l0ZV91cmwiXTsNCgkJJHNpdGVfdGl0bGUJCQkJPQkkX1BPU1RbInNpdGVfdGl0bGUiXTsNCgkJJHNpdGVfZGVzY3JpcHRpb24JPQkkX1BPU1RbInNpdGVfZGVzY3JpcHRpb24iXTsNCgkJJHNpdGVfa2V5d29yZHMJCT0JJF9QT1NUWyJzaXRlX2tleXdvcmRzIl07DQoJCSRzaXRlX2FkbWluCQkJCT0JJF9QT1NUWyJzaXRlX2FkbWluIl07DQoJCSRzbXNfc2FnbGF5aWNpCQk9CSRfUE9TVFsic21zX3NhZ2xheWljaSJdOw0KCQkkc21zX2Jhc2xpawkJCQk9CSRfUE9TVFsic21zX2Jhc2xpayJdOw0KCQkkc21zX2thZGkJCQkJCT0JJF9QT1NUWyJzbXNfa2FkaSJdOw0KCQkkc21zX3NpZnJlCQkJCT0JJF9QT1NUWyJzbXNfc2lmcmUiXTsNCgkJJHNtc19vbmF5CQkJCQk9CSRfUE9TVFsic21zX29uYXkiXTsNCgkJJHBheXdhbnRfYWt0aWYJCT0JJF9QT1NUWyJwYXl3YW50X2FrdGlmIl07DQoJCSRwYXl3YW50X2FwaQkJCT0JJF9QT1NUWyJwYXl3YW50X2FwaSJdOw0KCQkkcGF5d2FudF9zZWNyZXQJCT0JJF9QT1NUWyJwYXl3YW50X3NlY3JldCJdOw0KCQkkbWVyY2hhbnRfaWQJCQk9CSRfUE9TVFsibWVyY2hhbnRfaWQiXTsNCgkJJG1lcmNoYW50X2tleQkJCT0JJF9QT1NUWyJtZXJjaGFudF9rZXkiXTsNCgkJJG1lcmNoYW50X3NhbHQJCT0JJF9QT1NUWyJtZXJjaGFudF9zYWx0Il07DQoJCSRvZGVtZV90aXBpCQkJCT0JJF9QT1NUWyJvZGVtZV90aXBpIl07DQoJCSRidXlwYXllcl9tYWdhemEJCQkJPQkkX1BPU1RbImJ1eXBheWVyX21hZ2F6YSJdOw0KCQkkYnV5cGF5ZXJfbWFpbAkJCQk9CSRfUE9TVFsiYnV5cGF5ZXJfbWFpbCJdOw0KCQkkYnV5cGF5ZXJfZ3V2ZW5saWsJCQkJPQkkX1BPU1RbImJ1eXBheWVyX2d1dmVubGlrIl07DQoNCgkJaWYgKCBlbXB0eSgkc2l0ZV91cmwpIHx8IGVtcHR5KCRzaXRlX3RpdGxlKSB8fCBlbXB0eSgkc2l0ZV9kZXNjcmlwdGlvbikgfHwgZW1wdHkoJHNpdGVfa2V5d29yZHMpICAgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRlZGl0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgc2l0ZWF5YXIgU0VUDQoJCQlidXlwYXllcl9tYWdhemE9PyxidXlwYXllcl9tYWlsPT8sYnV5cGF5ZXJfZ3V2ZW5saWs9PywNCgkJCW1lcmNoYW50X2lkPT8sbWVyY2hhbnRfa2V5PT8sbWVyY2hhbnRfc2FsdD0/LG9kZW1lX3RpcGk9Pyxzb3psZXNtZT0/LCBzaXRlX3VybD0/LCBzaXRlX3RpdGxlPT8sIHNpdGVfZGVzY3JpcHRpb249Pywgc2l0ZV9rZXl3b3Jkcz0/LCBzaXRlX2FkbWluPT8sIHBheXdhbnRfYWt0aWY9PywgcGF5d2FudF9hcGk9PywgcGF5d2FudF9zZWNyZXQ9Pywgc21zX3NhZ2xheWljaT0/LCBzbXNfYmFzbGlrPT8sIHNtc19rYWRpPT8sIHNtc19zaWZyZT0/LCBzbXNfb25heT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkYnV5cGF5ZXJfbWFnYXphLCRidXlwYXllcl9tYWlsLCRidXlwYXllcl9ndXZlbmxpaywkbWVyY2hhbnRfaWQsJG1lcmNoYW50X2tleSwkbWVyY2hhbnRfc2FsdCwkb2RlbWVfdGlwaSwkc296bGVzbWUsJHNpdGVfdXJsLCRzaXRlX3RpdGxlLCRzaXRlX2Rlc2NyaXB0aW9uLCRzaXRlX2tleXdvcmRzLCRzaXRlX2FkbWluLCRwYXl3YW50X2FrdGlmLCRwYXl3YW50X2FwaSwkcGF5d2FudF9zZWNyZXQsJHNtc19zYWdsYXlpY2ksJHNtc19iYXNsaWssJHNtc19rYWRpLCRzbXNfc2lmcmUsJHNtc19vbmF5LDEpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJTaXN0ZW0gYmlsZ2lsZXJpIGfDvG5jZWxsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kc2l0ZV9hZG1pbl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IlNpc3RlbSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9tYWluLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkdXllY2VrCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBpZD0/Iik7DQoJCQkkdXllY2VrLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJJHV5ZWNlawk9CSR1eWVjZWstPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gdXllbGVyIFdIRVJFIGlkPT8iKTsNCgkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCg0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPT8iKTsNCgkJCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZWNlay0+dXNlcm5hbWUpKTsNCgkJCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gcGF5d2FudF9vZGVtZWxlciBXSEVSRSBvZGVtZV9zYWhpYmk9PyIpOw0KCQkJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkdXllY2VrLT51c2VybmFtZSkpOw0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoJCQkJCSRkZWxldGUJPQkkdnQtPnByZXBhcmUoIkRFTEVURSBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyIpOw0KCQkJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkdXllY2VrLT51c2VybmFtZSkpOw0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBkZXN0ZWtfdGFsZXBfY2V2YXAgV0hFUkUgdGFsZXBfdXNlcj0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoJCQkJCSRkZWxldGUJPQkkdnQtPnByZXBhcmUoIkRFTEVURSBGUk9NIGJhbmthX29kZW1lbGVyIFdIRVJFIG9kZW1lX3NhaGliaT0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIHNpc3RlbWRlbiBrYWxkxLFyxLFsZMSxLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfdXNlcnMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iw5x5ZSBrYWxkxLFyxLFya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdkZWxldGVfdXNlci5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2hhYmVyLWR1emVubGUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGhhYmVyX2Jhc2xpawkJPQkkX1BPU1RbImhhYmVyX2Jhc2xpayJdOw0KCQkJJGhhYmVyX2ljZXJpawkJPQkkX1BPU1RbImhhYmVyX2ljZXJpayJdOw0KDQoJCQkJaWYgKCBlbXB0eSgkaGFiZXJfYmFzbGlrKSB8fCBlbXB0eSgkaGFiZXJfaWNlcmlrKSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgaGFiZXJsZXIgU0VUIGhhYmVyX2Jhc2xpaz0/LCBoYWJlcl9pY2VyaWs9PyBXSEVSRSBpZD0/Iik7DQoJCQkJCSRkdXplbHQtPiBleGVjdXRlKGFycmF5KCRoYWJlcl9iYXNsaWssJGhhYmVyX2ljZXJpaywkc2x1ZykpOw0KCQkJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IlllbmkgaGFiZXIgZMO8emVubGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFkbWluX25ldy52aWV3IildOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJIYWJlciBkw7x6ZW5sZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfQ0KDQoJCQkJZXhpdCgpOw0KCX0sJ2FkbWluX25ld3MuZWRpdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2hhYmVyLWVrbGUnLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJCSRoYWJlcl9iYXNsaWsJCT0JJF9QT1NUWyJoYWJlcl9iYXNsaWsiXTsNCgkJCSRoYWJlcl9pY2VyaWsJCT0JJF9QT1NUWyJoYWJlcl9pY2VyaWsiXTsNCgkJCSR0YXJpaAkJCQkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KDQoJCQkJaWYgKCBlbXB0eSgkaGFiZXJfYmFzbGlrKSB8fCBlbXB0eSgkaGFiZXJfaWNlcmlrKSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gaGFiZXJsZXIgU0VUIGhhYmVyX2Jhc2xpaz0/LCBoYWJlcl9pY2VyaWs9PywgaGFiZXJfdGFyaWg9PyIpOw0KCQkJCQkkZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJGhhYmVyX2Jhc2xpaywkaGFiZXJfaWNlcmlrLCR0YXJpaCkpOw0KCQkJCQkJaWYgKCRla2xlKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJZZW5pIGhhYmVyIGVrbGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFkbWluX25ldy52aWV3IildOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJIYWJlciBla2xlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCX0NCgkJCQl9DQoNCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fbmV3cy5uZXcucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9oYWJlci1zaWwvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gaGFiZXJsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQlpZiAoJGRlbGV0ZSkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkhhYmVyIHNpc3RlbWRlbiBrYWxkxLFyxLFsZMSxLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9uZXcudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iSGFiZXIga2FsZMSxcsSxbMSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCg0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLmRlbGV0ZS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL29kZW1lLWR1emVubGUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkb2RlbWVfZHVydW0JCQkJPQkkX1BPU1RbIm9kZW1lX2R1cnVtIl07DQoNCgkJJG9kZW1lCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGJhbmthX29kZW1lbGVyIFdIRVJFIGlkPT8iKTsNCgkJJG9kZW1lLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkkb2RlbWUJPQkkb2RlbWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkc2FoaXAJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHNhaGlwLT4gZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX3NhaGliaSkpOw0KCQkkc2FoaXAJPQkkc2FoaXAtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQlpZiAoICRvZGVtZS0+b2RlbmRpbWkgPT0gMCAgJiYgJG9kZW1lX2R1cnVtID09ICdPbmF5bGFuZMSxJyApIHsNCgkJCSRiYWtpeWUJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1eWVsZXIgU0VUIGJha2l5ZT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCRzYWhpcC0+YmFraXllKyRvZGVtZS0+b2RlbWVfdHV0YXIsJG9kZW1lLT5vZGVtZV9zYWhpYmkpKTsNCgkJCSRvZGVuZGkgPSAkdnQtPnByZXBhcmUoIlVQREFURSBiYW5rYV9vZGVtZWxlciBTRVQgb2RlbmRpbWk9PyBXSEVSRSBpZD0/Iik7DQoJCQkkb2RlbmRpLT4gZXhlY3V0ZShhcnJheSgxLCRzbHVnKSk7DQoJCQkkdGFyaWggID0gZGF0ZSgiWS5tLmQgSDppOnMiKTsNCgkJCSRrYXphbmMJCT0JCSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYmFraXllX2themFuYyBTRVQgdHV0YXI9PywgdGFyaWg9PyIpOw0KCQkJJGthemFuYwkJLT4JZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX3R1dGFyLCR0YXJpaCkpOw0KCQl9DQoNCgkJaWYgKCBlbXB0eSgkb2RlbWVfZHVydW0pICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYmFua2Ffb2RlbWVsZXIgU0VUIG9kZW1lX2R1cnVtPT8gIFdIRVJFIGlkPT8iKTsNCgkJCSRkdXplbHQtPiBleGVjdXRlKGFycmF5KCRvZGVtZV9kdXJ1bSwkc2x1ZykpOw0KCQkJCWlmICgkZHV6ZWx0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIGTDvHplbmxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9vZGVtZWxlci52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiLDlmRlbWUgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9vZGVtZS5lZGl0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAtZWtsZScsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkYWQJCQkJPQkkX1BPU1RbImFkIl07DQoJCSRpYmFuCQkJPQkkX1BPU1RbImliYW4iXTsNCgkJJGhlc2FwCQk9CSRfUE9TVFsiaGVzYXAiXTsNCgkJJHN1YmUJCQk9CSRfUE9TVFsic3ViZSJdOw0KCQkkYWxpY2kJCT0JJF9QT1NUWyJhbGljaSJdOw0KCQkkbG9nbwkJCT0JJF9QT1NUWyJsb2dvIl07DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCRpYmFuKSB8fCBlbXB0eSgkYWxpY2kpIHx8IGVtcHR5KCRsb2dvKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJGVrbGUJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGJhbmthX2hlc2FwbGFyaSBTRVQgYmFua2FfYWQ9PywgYmFua2FfaWJhbj0/LCBiYW5rYV9oZXNhcG5vPT8sIGJhbmthX3N1YmU9PywgYmFua2FfYWxpY2k9PywgYmFua2FfbG9nbz0/Iik7DQoJCQkkZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRpYmFuLCRoZXNhcCwkc3ViZSwkYWxpY2ksJGxvZ28pKTsNCgkJCQlpZiAoJGVrbGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZWtsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnYmFua19hY2NvdW50Lm5ldy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2JhbmthLWhlc2FwL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQkJCT0JJF9QT1NUWyJhZCJdOw0KCQkkaWJhbgkJCT0JJF9QT1NUWyJpYmFuIl07DQoJCSRoZXNhcAkJPQkkX1BPU1RbImhlc2FwIl07DQoJCSRzdWJlCQkJPQkkX1BPU1RbInN1YmUiXTsNCgkJJGFsaWNpCQk9CSRfUE9TVFsiYWxpY2kiXTsNCgkJJGxvZ28JCQk9CSRfUE9TVFsibG9nbyJdOw0KDQoJCWlmICggZW1wdHkoJGFkKSB8fCBlbXB0eSgkaWJhbikgfHwgZW1wdHkoJGFsaWNpKSB8fCBlbXB0eSgkbG9nbykgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJPQkkdnQtPnByZXBhcmUoIlVQREFURSBiYW5rYV9oZXNhcGxhcmkgU0VUIGJhbmthX2FkPT8sIGJhbmthX2liYW49PywgYmFua2FfaGVzYXBubz0/LCBiYW5rYV9zdWJlPT8sIGJhbmthX2FsaWNpPT8sIGJhbmthX2xvZ289PyAgV0hFUkUgaWQ9PyIpOw0KCQkJJGR1emVsdC0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRpYmFuLCRoZXNhcCwkc3ViZSwkYWxpY2ksJGxvZ28sJHNsdWcpKTsNCgkJCQlpZiAoJGR1emVsdCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkJhbmthIGJpbGdpbGVyaSBkw7x6ZW5sZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZWRpdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2JhbmthLWhlc2FwLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYmFua2FfaGVzYXBsYXJpIFNFVCBiYW5rYV9kdXJ1bT0/ICBXSEVSRSBpZD0/Iik7DQoJCQkkZHV6ZWx0LT4gZXhlY3V0ZShhcnJheSgnMCcsJHNsdWcpKTsNCgkJCQlpZiAoJGR1emVsdCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkJhbmthIGJpbGdpbGVyaSBzaXN0ZW1kZW4ga2FsZMSxcsSxbGTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkga2FsZMSxcsSxbMSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCg0KCQkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZGVsZXRlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpcy1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGR1cnVtCQk9CSRfUE9TVFsiZHVydW0iXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIgV0hFUkUgaWQ9PyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCg0KDQoJCWlmICggZW1wdHkoJGR1cnVtKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJGluc2VydAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHNpcGFyaXNsZXIgU0VUIHNpcGFyaXNfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGluc2VydCkgew0KCQkJCQlpZiAoICRzb3ItPnNpcGFyaXNfZHVydW0hPSLEsHB0YWwiICYmICRkdXJ1bSA9PSAixLBwdGFsIiApIHsNCgkJCQkJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8gIik7DQoJCQkJCQkkdXllc29yCS0+IGV4ZWN1dGUoYXJyYXkoJHNvci0+c2lwYXJpc19zYWhpYmkpKTsNCgkJCQkJCSR1eWVzb3IJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCQkkYmFraXllCT0JJHV5ZXNvci0+YmFraXllKyRzb3ItPnNpcGFyaXNfdHV0YXI7DQoJCQkJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXllbGVyIFNFVCBiYWtpeWU9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCQkkdXBkYXRlLT4gZXhlY3V0ZShhcnJheSgkYmFraXllLCRzb3ItPnNpcGFyaXNfc2FoaWJpKSk7DQoJCQkJCX0NCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJTaXBhcmnFnyBiYcWfYXLEsXlsYSBnw7xuY2VsbGVuZGlyLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9vcmRlcnMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iU2lwYXJpxZ8gZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcl9lZGl0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYXBpLW9sdXN0dXInLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQk9CSRfUE9TVFsiYWRpIl07DQoJCSR1cmwJPQkkX1BPU1RbInVybCJdOw0KCQkkYXBpCT0JJF9QT1NUWyJhcGkiXTsNCgkJJHRyY2gJPQkkX1BPU1RbImFwaV90ZXJjaWgiXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBhcGlfdXJsPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkdXJsKSk7DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCR1cmwpIHx8IGVtcHR5KCRhcGkpIHx8IGVtcHR5KCR0cmNoKSkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IEFQSSBVUkwnaSBzaXN0ZW1kZSB6YXRlbiBrYXnEsXRsxLEuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRpbnNlcnQJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGFwaSBTRVQgYXBpX2FkaT0/LCBhcGlfdXJsPT8sIGFwaV9hcGk9PywgYXBpX3RlcmNpaD0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkYWQsJHVybCwkYXBpLCR0cmNoKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJBUEkgc2lzdGVtZSBiYcWfYXLEsXlsYSBla2xlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhcGkudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iQVBJIHNpc3RlbWUgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnbmV3X2FwaS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaS1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQk9CSRfUE9TVFsiYWRpIl07DQoJCSR1cmwJPQkkX1BPU1RbInVybCJdOw0KCQkkYXBpCT0JJF9QT1NUWyJhcGkiXTsNCgkJJHRyY2gJPQkkX1BPU1RbImFwaV90ZXJjaWgiXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBhcGlfdXJsPT8gJiYgaWQhPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkdXJsLCRzbHVnKSk7DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCR1cmwpIHx8IGVtcHR5KCRhcGkpIHx8IGVtcHR5KCR0cmNoKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoICRzb3ItPnJvd0NvdW50KCkgICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCdSBBUEkgVVJMJ2kgc2lzdGVtZGUgemF0ZW4ga2F5xLF0bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYXBpIFNFVCBhcGlfYWRpPT8sIGFwaV91cmw9PywgYXBpX2FwaT0/LCBhcGlfdGVyY2loPT8gV0hFUkUgaWQ9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCR1cmwsJGFwaSwkdHJjaCwkc2x1ZykpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iQVBJIGJpbGdpbGVyaW5peiBkw7x6ZW5sZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYXBpLnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IkFQSSBiaWxnaWxlcmkgZMO8emVubGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2VkaXRfYXBpLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYXBpLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBhcGkgV0hFUkUgaWQ9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQlpZiAoJGRlbGV0ZSkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkFQSSBzZXJ2aXNpIGthbGTEsXLEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFwaS52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJBUEkgc2VydmlzaW5pIGthbGTEsXLEsXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2RlbGV0ZV9hcGkucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9rYXRlZ29yaS1vbHVzdHVyJywgZnVuY3Rpb24oKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhZAkJPQkkX1BPU1RbImFkaSJdOw0KCQkkc2lyYSA9ICRfUE9TVFsic2lyYSJdOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00ga2F0ZWdvcmlsZXIgV0hFUkUga2F0ZWdvcmlfYWRpPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkYWQpKTsNCg0KCQlpZiAoIGVtcHR5KCRhZCkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkc29yLT5yb3dDb3VudCgpICApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUga2F0ZWdvcmkgemF0ZW4gc2lzdGVtZGUga2F5xLF0bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkaW5zZXJ0CT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBrYXRlZ29yaWxlciBTRVQga2F0ZWdvcmlfYWRpPT8sIHNpcmE9PyIpOw0KCQkJJGluc2VydC0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRzaXJhKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJLYXRlZ29yaSBiYcWfYXLEsXlsYSBla2xlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfY2F0ZWdvcmllcy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJLYXRlZ29yaSBzaXN0ZW1lIGVrbGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ25ld19jYXRlZ29yeS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2thdGVnb3JpLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBrYXRlZ29yaWxlciBXSEVSRSBpZD0/Iik7DQoJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCWlmICgkZGVsZXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS2F0ZWdvcmkga2FsZMSxcsSxbGTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX2NhdGVnb3JpZXMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iS2F0ZWdvcmkga2FsZMSxcsSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnZGVsZXRlX2NhdGVnb3J5LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmktZHVydW0vWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGthdAk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBrYXRlZ29yaWxlciBXSEVSRSBpZD0/Iik7DQoJCQkka2F0LT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJJGthdAk9CSRrYXQtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpZiAoICRrYXQtPmR1cnVtID09IDEgKSB7DQoJCQkJCSRkdXJ1bSA9IDAgOw0KCQkJCQkkZXRraSAgPSAncGFzaWYnOw0KCQkJCX1lbHNlew0KCQkJCQkkZHVydW0gPSAxIDsNCgkJCQkJJGV0a2kgID0gJ2FrdGlmJzsNCgkJCQl9DQoJCQkkZWRpdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGthdGVnb3JpbGVyIFNFVCBkdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJLYXRlZ29yaSAiLiRldGtpLiJsZcWfdGlyaWxkaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX2NhdGVnb3JpZXMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iS2F0ZWdvcmkgIi4kZXRraS4ibGXFn3RpcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ3Bhc2lmX2NhdGVnb3J5LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmktZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhZAkJPQkkX1BPU1RbImFkaSJdOw0KCQkkc2lyYSA9ICRfUE9TVFsic2lyYSJdOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00ga2F0ZWdvcmlsZXIgV0hFUkUga2F0ZWdvcmlfYWRpPT8gJiYgaWQhPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkYWQsJHNsdWcpKTsNCgkJJHNvcjIJPQkkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIGthdGVnb3JpbGVyIFdIRVJFIGlkPSckc2x1ZycgIiktPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJaWYgKCBlbXB0eSgkYWQpICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IGthdGVnb3JpIHNpc3RlbWRlIHphdGVuIGthecSxdGzEsS4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHVwZGF0ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGthdGVnb3JpbGVyIFNFVCBrYXRlZ29yaV9hZGk9Pywgc2lyYT0/IFdIRVJFIGlkPT8iKTsNCgkJCSR1cGRhdGUtPiBleGVjdXRlKGFycmF5KCRhZCwkc2lyYSwkc2x1ZykpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS2F0ZWdvcmkgYmlsZ2lsZXJpbml6IGTDvHplbmxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfY2F0ZWdvcmllcy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJLYXRlZ29yaSBiaWxnaWxlcmkgZMO8emVubGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2VkaXRfY2F0ZWdvcnkucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy95ZW5pLXVydW4nLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFwaV9zZXJ2aXMJPQkkX1BPU1RbImFwaV9zZXJ2aXMiXTsNCgkJJGFjaWtsYW1hCQk9CSRfUE9TVFsiYWNpa2xhbWEiXTsNCgkJJGthdGVnb3JpCQk9CSRfUE9TVFsia2F0ZWdvcmkiXTsNCgkJJGZpeWF0CQkJPQkkX1BPU1RbImZpeWF0Il07DQoJCUAkYmlyaW0JCQk9ICRmaXlhdC8xMDAwOw0KCQkkdXJsCQkJCT0JJF9QT1NUWyJiYWdsYW50aSJdOw0KCQkkbWluCQkJCT0JJF9QT1NUWyJtaW4iXTsNCgkJJG1hawkJCQk9CSRfUE9TVFsibWFrIl07DQoJCSRhcGkJCQkJPQkkX1BPU1RbImFwaSJdOw0KCQkkYWQJCQkJCT0JJF9QT1NUWyJhZGkiXTsNCg0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXJ1bmxlciBXSEVSRSB1cnVuX2FwaT0/ICYmIHVydW5fYXBpX3NlcnZpcz0/IFdIRVJFIGR1cnVtPScxJyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCRhcGksJGFwaV9zZXJ2aXMpKTsNCg0KCQlpZiAoIGVtcHR5KCRhZCkgfHwgZW1wdHkoJGFwaSkgfHwgZW1wdHkoJG1haykgfHwgZW1wdHkoJG1pbikgfHwgZW1wdHkoJHVybCkJfHwgZW1wdHkoJGZpeWF0KQl8fCBlbXB0eSgka2F0ZWdvcmkpCXx8IGVtcHR5KCRhcGlfc2VydmlzKSAgICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkbWFrPCRtaW4pew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iTWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuxLF6IG1pbmltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIHVmYWsgb2xhbWF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IEFQSSB2ZSBzZXJ2aXMgaWxlIGthecSxdGzEsSDDvHLDvG4gemF0ZW4gdmFyLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkaW5zZXJ0CT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyB1cnVubGVyIFNFVCB1cnVuX2FkaT0/LCB1cnVuX2FjaWtsYW1hPT8sIHVydW5fZml5YXQ9PywgdXJ1bl9iaXJpbT0/LCB1cnVuX3NlY2VuZWdpPT8sIHVydW5fa2F0ZWdvcmk9PywgdXJ1bl9taW49PywgdXJ1bl9tYXg9PywgdXJ1bl9hcGk9PywgdXJ1bl9hcGlfc2VydmlzPT8iKTsNCgkJCSRpbnNlcnQtPiBleGVjdXRlKGFycmF5KCRhZCwkYWNpa2xhbWEsJGZpeWF0LCRiaXJpbSwkdXJsLCRrYXRlZ29yaSwkbWluLCRtYWssJGFwaSwkYXBpX3NlcnZpcykpOw0KCQkJCWlmICgkaW5zZXJ0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5xyw7xuIHNpc3RlbWUgYmHFn2FyxLF5bGEgZWtsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX3Byb2R1Y3QudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iw5xyw7xuIHNpc3RlbWUgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnbmV3X3Byb2R1Y3QucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXJ1bmxlciBTRVQgZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgwLCRzbHVnKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gaGl6bWV0dGVuIGthbGTEsXLEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biBoaXptZXR0ZW4ga2FsZMSxcsSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnZGVsZXRlX3Byb2R1Y3QucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLWR1cnVtL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJCSR1cnVuCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyIpOw0KCQkJJHVydW4tPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkkdXJ1bgk9CSR1cnVuLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJaWYgKCAkdXJ1bi0+ZHVydW0gPT0gMSApIHsNCgkJCQkJJGR1cnVtID0gMiA7DQoJCQkJCSRldGtpICA9ICdwYXNpZic7DQoJCQkJfWVsc2VpZiggJHVydW4tPmR1cnVtID09IDIgKXsNCgkJCQkJJGR1cnVtID0gMSA7DQoJCQkJCSRldGtpICA9ICdha3RpZic7DQoJCQkJfQ0KCQkJJGVkaXQJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1cnVubGVyIFNFVCBkdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gIi4kZXRraS4ibGXFn3RpcmlsZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biAiLiRldGtpLiJsZcWfdGlyaWxpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwncGFzaWZfcHJvZHVjdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3VydW4tZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhcGlfc2VydmlzCT0JJF9QT1NUWyJhcGlfc2VydmlzIl07DQoJCSRhY2lrbGFtYQkJPQkkX1BPU1RbImFjaWtsYW1hIl07DQoJCSRrYXRlZ29yaQkJPQkkX1BPU1RbImthdGVnb3JpIl07DQoJCSRmaXlhdAkJCT0JJF9QT1NUWyJmaXlhdCJdOw0KCQkkYmlyaW0JCQk9ICRmaXlhdC8xMDAwOw0KCQkkdXJsCQkJCT0JJF9QT1NUWyJiYWdsYW50aSJdOw0KCQkkbWluCQkJCT0JJF9QT1NUWyJtaW4iXTsNCgkJJG1hawkJCQk9CSRfUE9TVFsibWFrIl07DQoJCSRhcGkJCQkJPQkkX1BPU1RbImFwaSJdOw0KCQkkYWQJCQkJCT0JJF9QT1NUWyJhZGkiXTsNCg0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXJ1bmxlciBXSEVSRSB1cnVuX2FwaT0/ICYmIHVydW5fYXBpX3NlcnZpcz0/ICYmIGlkIT0/ICIpOw0KCQkkc29yCS0+IGV4ZWN1dGUoYXJyYXkoJGFwaSwkYXBpX3NlcnZpcywkc2x1ZykpOw0KDQoJCWlmICggZW1wdHkoJGFkKSB8fCBlbXB0eSgkYXBpKSB8fCBlbXB0eSgkbWFrKSB8fCBlbXB0eSgkbWluKSB8fCBlbXB0eSgkdXJsKQl8fCBlbXB0eSgkZml5YXQpCXx8IGVtcHR5KCRrYXRlZ29yaSkJfHwgZW1wdHkoJGFwaV9zZXJ2aXMpICAgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRtYWs8JG1pbil7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJNYWtzaW11bSBzaXBhcmnFnyBtaWt0YXLEsW7EsXogbWluaW11bSBzaXBhcmnFnyBtaWt0YXLEsW5kYW4gdWZhayBvbGFtYXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkc29yLT5yb3dDb3VudCgpICApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUgQVBJIHZlIHNlcnZpcyBpbGUga2F5xLF0bMSxIMO8csO8biB6YXRlbiB2YXIuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSR1cGRhdGUJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1cnVubGVyIFNFVCB1cnVuX2FkaT0/LCB1cnVuX2FjaWtsYW1hPT8sIHVydW5fZml5YXQ9PywgdXJ1bl9iaXJpbT0/LCB1cnVuX3NlY2VuZWdpPT8sIHVydW5fa2F0ZWdvcmk9PywgdXJ1bl9taW49PywgdXJ1bl9tYXg9PywgdXJ1bl9hcGk9PywgdXJ1bl9hcGlfc2VydmlzPT8gV0hFUkUgaWQ9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRhY2lrbGFtYSwkZml5YXQsJGJpcmltLCR1cmwsJGthdGVnb3JpLCRtaW4sJG1haywkYXBpLCRhcGlfc2VydmlzLCRzbHVnKSk7DQoJCQkJaWYgKCR1cGRhdGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gYmHFn2FyxLF5bGEgZMO8emVubGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biBkw7x6ZW5sZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnZWRpdF9wcm9kdWN0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdGFsZWJlLWNldmFwLXZlci1bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRpZAkJCT0JJHNsdWc7DQoJCSRpY2VyaWsJPQkkX1BPU1RbImljZXJpayJdOw0KCQkkdGFyaWgJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KDQoJCSRzb3JndQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgaWQ9PyIpOw0KCQkkc29yZ3UtPiAgZXhlY3V0ZShhcnJheSgkaWQpKTsNCg0KCQlpZiAoIGVtcHR5KCRpY2VyaWspICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkc29yZ3UtPnJvd0NvdW50KCk8MCl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCw7Z5bGUgYmlyIGRlc3RlayB0YWxlYmkgeW9rLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkdGFsZXBpCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBfY2V2YXAgU0VUIHRhbGVwX2lkPT8sIHRhbGVwX3RhcmloaT0/LCB0YWxlcF9pY2VyaWs9PywgdGFsZXBfdXNlcj0/ICIpOw0KCQkJJHRhbGVwaS0+IGV4ZWN1dGUoYXJyYXkoJGlkLCR0YXJpaCwkaWNlcmlrLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCR0YWxlcGkpIHsNCgkJCQkJJGVkaXQJCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZGVzdGVrX3RhbGVwbGVyIFNFVCB0YWxlcF9kdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCQkJJGVkaXQJCS0+IGV4ZWN1dGUoYXJyYXkoJ1lhbsSxdGxhbmTEsScsJGlkKSk7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iRGVzdGVrIHRhbGViaW5lIGNldmFwIHZlcmRpbml6LCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl90aWNrZXRzX2Jla2xleWVubGVyLnZpZXcnKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iRGVzdGVrIHRhbGViaW5lIGRlc3RlayB2ZXJpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KDQoJCWV4aXQoKTsNCgl9LCduZXdfcmVwbHlfYWRtaW4ucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4ndGFsZXAtZHVydW0tYWMtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSBpZD0/Iik7DQoJCSRzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQlpZiAoICRzb3ItPnRhbGVwX2R1cnVtID09ICJBw6fEsWsiICkgew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iVGFsZXAgemF0ZW4gYcOnxLFrIGR1cnVtZGEuIiwicyI9PiJlcnJvciJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCgkJCQkkZWRpdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGRlc3Rla190YWxlcGxlciBTRVQgdGFsZXBfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkJJGVkaXQtPiBleGVjdXRlKGFycmF5KCJBw6fEsWsiLCRzbHVnKSk7DQoJCQkJCWlmICgkZWRpdCkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxkaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxlbWVkaS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwgJ3RhbGVwX2FjLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJ3RhbGVwLWR1cnVtLWthcGEtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSBpZD0/Iik7DQoJCSRzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQlpZiAoICRzb3ItPnRhbGVwX2R1cnVtID09ICJLYXBhbMSxIiApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IlRhbGVwIHphdGVuIGthcGFsxLEgZHVydW1kYS4iLCJzIj0+ImVycm9yIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlew0KCQkJCSRlZGl0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZGVzdGVrX3RhbGVwbGVyIFNFVCB0YWxlcF9kdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCQkkZWRpdC0+IGV4ZWN1dGUoYXJyYXkoIkthcGFsxLEiLCRzbHVnKSk7DQoJCQkJCWlmICgkZWRpdCkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxkaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxlbWVkaS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwgJ3RhbGVwX2thcGF0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllL1sqOnNsdWddL2Jha2l5ZScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvcgk9CSR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkdGFyaWgJCT0JZGF0ZSgiWS5tLmQgSDppOnMiKTsNCgkJJG1pa3RhcgkJPQkkX1BPU1RbIm1pa3RhciJdOw0KCQkkaXNsZW0JCT0JJF9QT1NUWyJpc2xlbSJdOw0KDQoJCWlmICggJGlzbGVtID09ICdla2xlJyApIHsNCgkJCSRiYWtpeWUJCT0JJHV5ZXNvci0+YmFraXllKyRtaWt0YXI7DQoJCQkkZHVydW0JCT0JJ2VrbGVtZSc7DQoJCX1lbHNlaWYgKCAkaXNsZW0gPT0gJ2Vrc2lsdCcgKSB7DQoJCQkkYmFraXllCQk9CSR1eWVzb3ItPmJha2l5ZS0kbWlrdGFyOw0KCQkJJGR1cnVtCQk9CSdla3NpbHRtZSc7DQoJCX1lbHNlew0KCQkJJGR1cnVtCQk9CSdib3MnOw0KCQl9DQoNCgkJaWYgKCBlbXB0eSgkbWlrdGFyKSB8fCBlbXB0eSgkaXNsZW0pICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJGR1cnVtID09ICJib3MiICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiLEsMWfbGVtIMWfdWFuIGnDp2luIGdlcsOnZWtsZcWfdGlyaWxlbWl5b3IuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYmFraXllPT8gV0hFUkUgdXNlcm5hbWU9PyIpOw0KCQkJJGR1emVsdAkJLT4JZXhlY3V0ZShhcnJheSgkYmFraXllLCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiRtaWt0YXIuIiBUTCB0dXRhcsSxbmRhIGJha2l5ZSAiLiRkdXJ1bS4iIGnFn2xlbWkgZ2Vyw6dla2xlxZ90aXJpbGRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJaWYgKCAkaXNsZW0gPT0gJ2VrbGUnICkgew0KCQkJCQkJCSRrYXphbmMJCT0JCSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYmFraXllX2themFuYyBTRVQgdHV0YXI9PywgdGFyaWg9PyIpOw0KCQkJCQkJCSRrYXphbmMJCS0+CWV4ZWN1dGUoYXJyYXkoJG1pa3RhciwkdGFyaWgpKTsNCgkJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDnHllIGJha2l5ZSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ2FkZF9iYWxhbmNlX3VzZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUvWyo6c2x1Z10vZml5YXRsYXIvWyo6c2x1ZzJdJywgZnVuY3Rpb24oJHNsdWcsJHNsdWcyKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIGlkPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvcgk9CSR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkdXJ1bnNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJJHVydW5zb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnMikpOw0KCQkkdXJ1bnNvcgk9CSR1cnVuc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJJGZpeWF0CT0JJF9QT1NUWyJmaXlhdCJdOw0KDQoNCgkJJHNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/ICYmIGZpeWF0X3NlcnZpcz0/ICIpOw0KCQkkc29yCS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZXNvci0+dXNlcm5hbWUsJHNsdWcyKSk7DQoNCgkJaWYgKCBlbXB0eSgkZml5YXQpICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iRml5YXQgYWxhbsSxbsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoJHNvci0+cm93Q291bnQoKSl7DQoJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZml5YXRsYW5kaXJtYSBTRVQgZml5YXRfZml5YXQ9PyBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGZpeWF0LCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5x5ZXllIMO2emVsIGZpeWF0bGFuZMSxcm1hIGnFn2xlbWkgYmHFn2FyxLFsxLEuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOceWV5ZSDDtnplbCBmaXlhdGxhbmTEsXJtYSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9ZWxzZXsNCgkJCSRpbnNlcnQJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGZpeWF0bGFuZGlybWEgU0VUIGZpeWF0X2ZpeWF0PT8sIGZpeWF0X3NhaGliaT0/LCBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJGluc2VydC0+IGV4ZWN1dGUoYXJyYXkoJGZpeWF0LCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KCQkJCWlmICgkaW5zZXJ0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5x5ZXllIMO2emVsIGZpeWF0bGFuZMSxcm1hIGnFn2xlbWkgYmHFn2FyxLFsxLEuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOceWV5ZSDDtnplbCBmaXlhdGxhbmTEsXJtYSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdwcml2YXRlX3ByaWNlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllL1sqOnNsdWddL2ZpeWF0LXNpbC9bKjpzbHVnMl0nLCBmdW5jdGlvbigkc2x1Zywkc2x1ZzIpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJHV5ZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkkdXllc29yLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkkdXllc29yCT0JJHV5ZXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZml5YXRsYW5kaXJtYSBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KDQoJCWlmKCRzb3ItPnJvd0NvdW50KCkpew0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gZml5YXRsYW5kaXJtYSBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZXNvci0+dXNlcm5hbWUsJHNsdWcyKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHlleWUgw7Z6ZWwgZml5YXRsYW5kxLFybWEgacWfbGVtaSBzaWxpbmRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiLDnHlleWUgw7Z6ZWwgZml5YXRsYW5kxLFybWEgc2lsaW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwncHJpdmF0ZV9wcmljZV9kZWxldGUucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkdXllc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCSR1eWVzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSR1eWVzb3IJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJJHRlbGVmb24JCT0Jc3RyX3JlcGxhY2UoIiAiLCIiLCRfUE9TVFsidGVsZWZvbiJdKTsNCgkJJGFkc295YWQJCT0JaWxrSGFyZigkX1BPU1RbImFkc295YWQiXSk7DQoJCSR5ZXRraQkJCT0JJF9QT1NUWyJ5ZXRraSJdOw0KCQkkbWFpbAkJCQk9CSRfUE9TVFsibWFpbCJdOw0KCQkkb25heQkJCQk9CSRfUE9TVFsib25heSJdOw0KDQoJCWlmICggZW1wdHkoJGFkc295YWQpIHx8IGVtcHR5KCRtYWlsKSB8fCBlbXB0eSgkeWV0a2kpIHx8IGVtcHR5KCR0ZWxlZm9uKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoIWZpbHRlcl92YXIoJG1haWwsRklMVEVSX1ZBTElEQVRFX0VNQUlMKSl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIG1haWwgZm9ybWF0xLEgeWFubMSxxZ8uIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYWRzb3lhZD0/LCBtYWlsPT8sIHRlbGVmb249PywgeWV0a2k9Pywgb25heT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCSRkdXplbHQJCS0+CWV4ZWN1dGUoYXJyYXkoJGFkc295YWQsJG1haWwsJHRlbGVmb24sJHlldGtpLCRvbmF5LCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIGJpbGdpbGVyaSBnw7xuY2VsbGVuZGkuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iw5x5ZSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdlZGl0X3VzZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUtcGFzcy9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRwYXNzCQkJCT0JJF9QT1NUWyJwYXNzIl07DQoNCg0KCQlpZiAoIGVtcHR5KCRwYXNzKSB8fCBzdHJsZW4oJHBhc3MpIDwgNiApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYSA2IGthcmFrdGVyZGVuIGvEsXNhIG9sYW1hei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHBhc3MJCT0JbWQ1KCRfUE9TVFsicGFzcyJdKTsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgcGFzc3dvcmQ9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkkZHV6ZWx0CQktPglleGVjdXRlKGFycmF5KCRwYXNzLCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIMWfaWZyZXNpIGfDvG5jZWxsZW5kaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDnHllIMWfaWZyZXNpIGfDvG5jZWxsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2VkaXRfdXNlcl9wYXNzLnBvc3QnKTsNCg0KDQoJJG1hdGNoID0gJHJvdXRlci0+bWF0Y2goKTsNCglpZiggJG1hdGNoICYmIGlzX2NhbGxhYmxlKCAkbWF0Y2hbJ3RhcmdldCddICkgKSB7DQoJCWNhbGxfdXNlcl9mdW5jX2FycmF5KCAkbWF0Y2hbJ3RhcmdldCddLCAkbWF0Y2hbJ3BhcmFtcyddICk7DQoJfSBlbHNlIHsNCgkJaGVhZGVyKCAkX1NFUlZFUlsiU0VSVkVSX1BST1RPQ09MIl0gLiAnIDQwNCBOb3QgRm91bmQnKTsNCgl9DQogPz4=")); ?>
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 1ff2e0f81052c0b38af8f74bd9b80198 |
| Eval Count | 1 |
| Decode Time | 202 ms |