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("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew..
Decoded Output download
?>b'<?php
if (isset($_GET[\'listar_links\'])) {
require_once("controles/conexao.php");
header(\'Content-Type: application/json; charset=utf-8\');
// Recebe os dados da requisio
$dados_requisicao = $_GET;
$colunas = [
0 => \'ID\',
1 => \'logo\',
2 => \'nome_link\',
3 => \'Sinopse\',
4 => \'nome\'
];
// Query para contar o nmero de registros
$query_count = "SELECT COUNT(l.id_link) AS qnt_link
FROM link l
INNER JOIN categoria c ON c.id = l.id_categoria
WHERE (c.nome like \'%FILMES |%\' OR c.nome like \'%COLETNEA%\' OR c.nome like \'%FILMES @%\' OR c.nome like \'Documentarios\' OR c.nome like \'%SHOW%\' and c.nome not like \'%Canais |%\' and c.nome not like \'%Canais @%\' and c.nome not like \'%SERIES%\')";
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$query_count .= " AND (nome_link LIKE :nome_link)";
}
$query_count = $conexao2->prepare($query_count);
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
$query_count->bindValue(\':nome_link\', $valor_pesq);
}
$query_count->execute();
$result_count = $query_count->fetch(PDO::FETCH_ASSOC);
$inicio = (int)$dados_requisicao[\'start\'];
$quantidade = (int)$dados_requisicao[\'length\'];
// Query para listar os registros com paginao
$list_query = "SELECT l.*, c.nome as nome
FROM link l
INNER JOIN categoria c ON c.id = l.id_categoria
WHERE (c.nome like \'%FILMES |%\' OR c.nome like \'%COLETNEA%\' OR c.nome like \'%FILMES @%\' OR c.nome like \'Documentarios\' OR c.nome like \'%SHOW%\' and c.nome not like \'%Canais |%\' and c.nome not like \'%Canais @%\' and c.nome not like \'%SERIES%\')";
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$list_query .= " AND (nome_link LIKE :nome_link) ";
}
$list_query .= " ORDER BY " . $colunas[$dados_requisicao[\'order\'][0][\'column\']] . " " . $dados_requisicao[\'order\'][0][\'dir\'] . " LIMIT :quantidade OFFSET :inicio";
$list_query = $conexao2->prepare($list_query);
$list_query->bindValue(\':inicio\', $inicio, PDO::PARAM_INT);
$list_query->bindValue(\':quantidade\', $quantidade, PDO::PARAM_INT);
if (!empty($dados_requisicao[\'search\'][\'value\'])) {
$valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
$list_query->bindValue(\':nome_link\', $valor_pesq);
}
// Executa a consulta
$list_query->execute();
// Prepara os dados para o formato JSON
$dados = [];
while ($row = $list_query->fetch(PDO::FETCH_ASSOC)) {
// Registros para tabela com Child rows
$registros_com_childs_rows = [
"ID" => $row[\'id_link\'],
"Logo" => \'<img src=\'.\'"\'.$row[\'logo\'].\'"\'.\'style="text-align:center; vertical-align:middle; width:45px; height:45px;" />\',
"Titulo" => $row[\'nome_link\'],
"Sinopse" => $row[\'sinopse\'],
"Categoria" => $row[\'nome\'],
"Link" => $row[\'link_link\'],
"Exc" => \'<button class="btn btn-outline-danger" onclick="removerConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\')"><i class="far fa-trash-alt"></i></button>\',
"Alt" => \'<td><button class="btn btn-outline-secondary" onclick="editarConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\',\'."\'".$row[\'logo\']."\'".\',\'."\'".$row[\'link_link\']."\'".\',\'."\'".$row[\'sinopse\']."\'".\',\'."\'".$row[\'id_categoria\']."\'".\')"><i class="fas fa-edit"></i></button>\'
];
$dados[] = $registros_com_childs_rows;
}
$resultado = [
"draw" => intval($dados_requisicao[\'draw\']),
"recordsTotal" => intval($result_count[\'qnt_link\']),
"recordsFiltered" => intval($result_count[\'qnt_link\']),
"data" => $dados
];
echo json_encode($resultado);
exit();
}
?>
<?php
session_start();
require_once("controles/usuarios.php");
require_once("controles/links.php");
require_once("controles/categorias.php");
//include \'pagination.class.php\';
if (checarUsuario()) {
require_once("cabecalho.php");
if($_SESSION[\'admin\']){
}
//$links = listarlinks();
$categorias = listarCategoriastipo("filmes");
?>
<style id="checkme">
.page-2content {
padding-left: 240px !important;
padding-right: 240px !important;
}
</style>
<div id="conteudo-painel" class="container">
<table id="data_table" class="display overflow-auto table" style="width: 100%;">
<thead class="table-dark">
<tr><!--<th></th> descomentar para usar childs -->
<th class=\'nomecol\' style="width: 5%" scope="col" >#</th>
<th class=\'nomecol\' style="width: 5%" scope="col" >Logo</th>
<th class=\'nomecol\' style="width: 20%" scope="col" >Ttulo</th>
<th class=\'nomecol\' style="width: 20%" scope="col" >Sinopse</th>
<th class=\'nomecol\' style="width: 20%" scope="col" >Categoria</th>
<th class=\'nomecol\' scope="col" >Link</th>
<th class=\'nomecol\' style="width: 5%" scope="col">Exc</th>
<th class=\'nomecol\' style="width: 5%" scope="col">Alt</th>
</tr>
</thead>
</table>
</div>
</div>
</main>
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/2.0.7/css/dataTables.dataTables.css">
<script src="//cdn.datatables.net/2.0.7/js/dataTables.js"></script>
<style type="text/css">
.overflow-auto {
overflow: auto !important;
}
</style>
<script >
document.addEventListener("DOMContentLoaded", function() {
// Funo para adicionar a classe \'overflow-auto\' div \'dt-layout-cell\'
function addOverflowAuto() {
var wrapper = document.getElementById("data_table_wrapper");
if (wrapper) {
var layoutCell = wrapper.querySelector(".dt-layout-table");
var dt_control = wrapper.querySelector(".dt-control");
if (layoutCell) {
layoutCell.classList.add("overflow-auto");
//console.log("Classe \'overflow-auto\' adicionada div com a classe \'dt-layout-cell\'");
}if (dt_control) {
dt_control.classList.remove("dt-ordering-desc");
//console.log("Classe \'dt-ordering-desc\' removida da td com a classe \'dt-control\'");
}
}
}
// Cria um MutationObserver para observar as mudanas no DOM
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// Verifica se houve uma mudana no elemento com o id \'data_table_wrapper\'
if (mutation.target.id === "data_table_wrapper") {
addOverflowAuto(); // Adiciona a classe \'overflow-auto\'
//dt_search();
}
});
});
// Configura o MutationObserver para observar mudanas no DOM
observer.observe(document.body, { childList: true, subtree: true });
// Verifica e adiciona a classe \'overflow-auto\' imediatamente aps o DOM ser carregado
addOverflowAuto();
});
$(document).ready(function() {
function dt_search() {
$(\'#dt-search-0\').addClass(\'col col-md-6 dt-input float-left form-control form-row\').attr(\'placeholder\', \'Pesquisar...\');
$(\'.dt-search\').addClass(\'form-row d-block\');
var labelElement = document.querySelector(\'label[for="dt-search-0"]\');
if (labelElement) {
labelElement.remove();
}
// Seleciona todos os elementos com a classe \'.dt-search\'
var dtSearchElements = document.querySelectorAll(\'.dt-search\');
const novo_canal = document.getElementById(\'novo_canal\');
if (!novo_canal) {
// Itera sobre cada elemento encontrado
dtSearchElements.forEach(function(dtSearchElement) {
// Seleciona o input dentro de cada elemento \'.dt-search\'
var inputElement = dtSearchElement.querySelector(\'input\');
// Adiciona a classe \'form-row\' ao input
if (inputElement) {
inputElement.classList.add(\'form-row\');
// Cria o elemento <i> com os atributos especificados
var novoElemento = document.createElement(\'i\');
novoElemento.innerHTML = \' Novo\';
novoElemento.className = \'btn btn-outline-info col col-md-2 fa-user-plus fas float-right text-dark\';
novoElemento.setAttribute(\'aria-hidden\', \'true\');
novoElemento.setAttribute(\'id\', \'novo_canal\');
novoElemento.setAttribute(\'onclick\', "$(\'#cadastro\').modal()");
// Insere o novo elemento aps o input
inputElement.parentNode.insertBefore(novoElemento, inputElement.nextSibling);
}
});
}
}
var table = $(\'#data_table\').DataTable({
ajax: \'?listar_links\',
processing: true,
serverSide: true,
language: {
url: \'//cdn.datatables.net/plug-ins/1.10.13/i18n/Portuguese-Brasil.json\'
},
search: {
searchPlaceholder: "Pesquisar..." // Placeholder para o campo de pesquisa
},
layout: {
topStart: null,
bottom: \'paging\',
bottomStart: "info",
bottomEnd: null
},
columns: [
{
data: "ID",
className: "text-center"
}, // ID
{
orderable: false,
data: "Logo",
className: "text-center"
}, // URL
{
//orderable: false,
data: "Titulo",
className: "text-center"
}, // Logo URL
{
orderable: false,
data: "Sinopse",
className: "text-center"
},
{
//orderable: false,
data: "Categoria",
className: "text-center"
},
{
orderable: false,
data: "Link",
className: "text-center"
},
{
orderable: false,
data: "Exc",
className: "text-center acao"
},
{
orderable: false,
data: "Alt",
className: "text-center acao"
}, // Logo URL
/*{ orderable: false,
data: null, // Aes (nenhuma data associada)
render: function(data, type, row) {
botao_editar = \'<a id="\' + row.id + \'" class="btn btn-info btn-sm">EDITAR</a>\';
botao_excluir = \'<a class="btn btn-danger btn-sm">Excluir</a>\';
return botao_editar + botao_excluir;
}
}*/
],
order: [[2, \'asc\']],
drawCallback: function() {
// Callback chamado aps cada desenho da tabela (inclusive inicializao)
dt_search();
}
});
});
// Adiciona a classe \'form-control\' ao campo de pesquisa
</script>
<!-- page-content" -->
</div>
<!-- Cadastro Inicio -->
<div class="modal fade" id="cadastro" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Adicionar Contedo</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="max-height:460px; overflow-y:auto;">
<form id="cadastro-form">
<div class="container">
<div class="form-group">
<label>Nome:</label>
<input type="text" class="form-control" name="nome" placeholder="Nome do Link" required autofocus>
</div>
<div class="form-group">
<label>Logo:</label>
<input type="text" class="form-control" name="logo" placeholder="Link da Imagem" required autofocus>
</div>
<div class="form-group">
<label>Url:</label>
<input type="text" class="form-control" name="link" placeholder="Url do Link" required autofocus>
</div>
<div class="form-group">
<label>Sinopse:</label>
<input type="text" class="form-control" name="sinopse" placeholder="Sinopse do Contedo" required autofocus>
</div>
<div class="form-group">
<label>Categora:</label>
<div class="ml-0 row">
<select class="selectpicker" title="Categoria" name="categoria" required autofocus>
<?php if ($categorias) {
foreach($categorias as $categoria) {?>
<option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
<?php } } ?>
</select>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="submit" form="cadastro-form" class="btn btn-primary">Adicionar</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
</div>
</div>
</div>
</div>
<!-- Cadastro Fim-->
<!-- Remove Inicio -->
<div class="modal fade" id="remover" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tem certeza?</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div id="remover-conteudo" class="modal-body"></div>
</div>
</div>
</div>
<!-- Remove Fim-->
<!-- Edita Inicio -->
<div class="modal fade" id="editar" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Editar Contedo</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="max-height:460px; overflow-y:auto;">
<form id="editar-form">
<div class="container">
<input type="hidden" name="id" id="idE">
<div class="form-group">
<label>Nome:</label>
<input type="text" class="form-control" id="nomeE" name="nome" placeholder="Nome do Link" required autofocus>
</div>
<div class="form-group">
<label>Logo:</label>
<input type="text" class="form-control" id="logoE" name="logo" placeholder="Link da Imagem" required autofocus>
</div>
<div class="form-group">
<label>Url:</label>
<input type="text" class="form-control" id="linkE" name="link" placeholder="Url do Link" required autofocus>
</div>
<div class="form-group">
<label>Sinopse:</label>
<input type="text" class="form-control" id="sinopseE" name="sinopse" placeholder="Sinopse do Contedo" required autofocus>
</div>
<div class="form-group">
<label>Categora:</label>
<div class="ml-0 row">
<select class="selectpicker" title="Categora" id="categoriaE" name="categoria" required autofocus>
<?php if ($categorias) {
foreach($categorias as $categoria) {?>
<option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
<?php } } ?>
</select>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="submit" form="editar-form" class="btn btn-primary">Editar</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
</div>
</div>
</div>
</div>
<!-- Edita Fim-->
</body>
<script>
function removerConfirma(id,nome) {
$(\'#remover-conteudo\').html(\'<div class="alert alert-danger" role="alert"><strong> Remover </strong>\' + nome + \'?</div><button type="button" class="btn btn-secondary float-right" style="margin-left:10px" data-dismiss="modal">Fechar</button><button onclick="remover(\' + id + \')" type="submit" class="btn btn-danger float-right">Remover</button>\');
$(\'#remover\').modal();
}
function editarConfirma(id,nome, logo, link, sinopse, categoria) {
$(\'#idE\').val(id);
$(\'#nomeE\').val(nome);
$(\'#logoE\').val(logo);
$(\'#linkE\').val(link);
$(\'#sinopseE\').val(sinopse);
if (categoria !== "") {
$(\'#categoriaE\').val(categoria);
$(\'#categoriaE\').selectpicker(\'render\');
}
$(\'#editar\').modal();
}
function remover(id) {
$.ajax({
type: "POST",
url: "controles/remover-link.php",
data: {id: id},
success: function(data) {
$("#remover").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
}
});
}
$( "#cadastro-form" ).submit(function( event ) {
$.ajax({
type: "POST",
url: "controles/adicionar-link.php",
data: $("#cadastro-form").serialize(),
success: function(data) {
$("#cadastro").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
},
error: function (data) {
resultado(data.responseText);
}
});
event.preventDefault();
});
$( "#editar-form" ).submit(function( event ) {
$.ajax({
type: "POST",
url: "controles/editar-link.php",
data: $("#editar-form").serialize(),
success: function(data) {
$("#editar").modal(\'hide\');
data_table = $(\'#data_table\').DataTable();
var pagina_atual = data_table.page(); // Armazena a pgina atual
// Atualiza a tabela
data_table.draw();
// Restaura a pgina aps a atualizao
data_table.page(pagina_atual).draw(\'page\');
},
error: function (data) {
resultado(data.responseText);
}
});
event.preventDefault();
});
speed_to_top = 1000;
$(\'#totop\').click(function () {
$(\'body,html\').animate({
scrollTop: 0
}, speed_to_top);
return false;
});
$(\'#totop\').hide();
$(window).scroll(function () {
if ($(this).scrollTop() > 50) {
$(\'#totop\').fadeIn();
} else {
$(\'#totop\').fadeOut();
}
});
</script>
<?php
require_once("comum.php");
require_once("alerta.php");
?>
</html>
<?php
} else {
header("Location: login");
die();
}
?>'
Did this file decode correctly?
Original Code
<?php @eval("?>".base64_decode("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew0KICAgIHJlcXVpcmVfb25jZSgiY29udHJvbGVzL2NvbmV4YW8ucGhwIik7DQogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsNCg0KICAgIC8vIFJlY2ViZSBvcyBkYWRvcyBkYSByZXF1aXNpw6fDo28NCiAgICAkZGFkb3NfcmVxdWlzaWNhbyA9ICRfR0VUOw0KICAgICRjb2x1bmFzID0gWw0KICAgICAgICAgICAgMCA9PiAnSUQnLA0KICAgICAgICAgICAgMSA9PiAnbG9nbycsDQogICAgICAgICAgICAyID0+ICdub21lX2xpbmsnLA0KICAgICAgICAgICAgMyA9PiAnU2lub3BzZScsDQogICAgICAgICAgICA0ID0+ICdub21lJw0KICAgICAgICBdOw0KICAgIC8vIFF1ZXJ5IHBhcmEgY29udGFyIG8gbsO6bWVybyBkZSByZWdpc3Ryb3MNCiAgICAkcXVlcnlfY291bnQgPSAiU0VMRUNUIENPVU5UKGwuaWRfbGluaykgQVMgcW50X2xpbmsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBsaW5rIGwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBjYXRlZ29yaWEgYyBPTiBjLmlkID0gbC5pZF9jYXRlZ29yaWENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAoYy5ub21lIGxpa2UgJyVGSUxNRVMgfCUnIE9SIGMubm9tZSBsaWtlICclQ09MRVTDgk5FQSUnIE9SIGMubm9tZSBsaWtlICclRklMTUVTIEAlJyBPUiBjLm5vbWUgbGlrZSAnRG9jdW1lbnRhcmlvcycgT1IgYy5ub21lIGxpa2UgJyVTSE9XJScgYW5kIGMubm9tZSBub3QgbGlrZSAnJUNhbmFpcyB8JScgYW5kIGMubm9tZSBub3QgbGlrZSAnJUNhbmFpcyBAJScgYW5kIGMubm9tZSBub3QgbGlrZSAnJVNFUklFUyUnKSI7DQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICRxdWVyeV9jb3VudCAuPSAiIEFORCAobm9tZV9saW5rIExJS0UgOm5vbWVfbGluaykiOw0KICAgIH0NCg0KICAgICRxdWVyeV9jb3VudCA9ICRjb25leGFvMi0+cHJlcGFyZSgkcXVlcnlfY291bnQpOw0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkdmFsb3JfcGVzcSA9ICIlIiAuICRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSAuICIlIjsNCiAgICAgICAgJHF1ZXJ5X2NvdW50LT5iaW5kVmFsdWUoJzpub21lX2xpbmsnLCAkdmFsb3JfcGVzcSk7DQogICAgfQ0KICAgICRxdWVyeV9jb3VudC0+ZXhlY3V0ZSgpOw0KICAgICRyZXN1bHRfY291bnQgPSAkcXVlcnlfY291bnQtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpOw0KDQogICAgJGluaWNpbyA9IChpbnQpJGRhZG9zX3JlcXVpc2ljYW9bJ3N0YXJ0J107DQogICAgJHF1YW50aWRhZGUgPSAoaW50KSRkYWRvc19yZXF1aXNpY2FvWydsZW5ndGgnXTsNCg0KICAgIC8vIFF1ZXJ5IHBhcmEgbGlzdGFyIG9zIHJlZ2lzdHJvcyBjb20gcGFnaW5hw6fDo28NCiAgICAkbGlzdF9xdWVyeSA9ICJTRUxFQ1QgbC4qLCBjLm5vbWUgYXMgbm9tZSANCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gbGluayBsICANCiAgICAgICAgICAgICAgICAgICAgICAgIElOTkVSIEpPSU4gY2F0ZWdvcmlhIGMgT04gYy5pZCA9IGwuaWRfY2F0ZWdvcmlhIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgKGMubm9tZSBsaWtlICclRklMTUVTIHwlJyBPUiBjLm5vbWUgbGlrZSAnJUNPTEVUw4JORUElJyBPUiBjLm5vbWUgbGlrZSAnJUZJTE1FUyBAJScgT1IgYy5ub21lIGxpa2UgJ0RvY3VtZW50YXJpb3MnIE9SIGMubm9tZSBsaWtlICclU0hPVyUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVDYW5haXMgfCUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVDYW5haXMgQCUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVTRVJJRVMlJykiOw0KDQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICRsaXN0X3F1ZXJ5IC49ICIgQU5EIChub21lX2xpbmsgTElLRSA6bm9tZV9saW5rKSAiOw0KICAgIH0NCg0KICAgICRsaXN0X3F1ZXJ5IC49ICIgT1JERVIgQlkgIiAuICRjb2x1bmFzWyRkYWRvc19yZXF1aXNpY2FvWydvcmRlciddWzBdWydjb2x1bW4nXV0gLiAiICIgLiAkZGFkb3NfcmVxdWlzaWNhb1snb3JkZXInXVswXVsnZGlyJ10gLiAiIExJTUlUIDpxdWFudGlkYWRlIE9GRlNFVCA6aW5pY2lvIjsNCg0KICAgICRsaXN0X3F1ZXJ5ID0gJGNvbmV4YW8yLT5wcmVwYXJlKCRsaXN0X3F1ZXJ5KTsNCiAgICAkbGlzdF9xdWVyeS0+YmluZFZhbHVlKCc6aW5pY2lvJywgJGluaWNpbywgUERPOjpQQVJBTV9JTlQpOw0KICAgICRsaXN0X3F1ZXJ5LT5iaW5kVmFsdWUoJzpxdWFudGlkYWRlJywgJHF1YW50aWRhZGUsIFBETzo6UEFSQU1fSU5UKTsNCg0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkdmFsb3JfcGVzcSA9ICIlIiAuICRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSAuICIlIjsNCiAgICAgICAgJGxpc3RfcXVlcnktPmJpbmRWYWx1ZSgnOm5vbWVfbGluaycsICR2YWxvcl9wZXNxKTsNCiAgICB9DQoNCiAgICAvLyBFeGVjdXRhIGEgY29uc3VsdGENCiAgICAkbGlzdF9xdWVyeS0+ZXhlY3V0ZSgpOw0KDQogICAgLy8gUHJlcGFyYSBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byBKU09ODQogICAgJGRhZG9zID0gW107DQogICAgd2hpbGUgKCRyb3cgPSAkbGlzdF9xdWVyeS0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQykpIHsNCiAgICAgICAgLy8gUmVnaXN0cm9zIHBhcmEgdGFiZWxhIGNvbSBDaGlsZCByb3dzDQogICAgICAgICRyZWdpc3Ryb3NfY29tX2NoaWxkc19yb3dzID0gWw0KICAgICAgICAgICAgIklEIiAgICAgICA9PiAkcm93WydpZF9saW5rJ10sDQogICAgICAgICAgICAiTG9nbyIgICAgICA9PiAnPGltZyBzcmM9Jy4nIicuJHJvd1snbG9nbyddLiciJy4nc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHdpZHRoOjQ1cHg7IGhlaWdodDo0NXB4OyIgLz4nLA0KICAgICAgICAgICAgIlRpdHVsbyIgPT4gJHJvd1snbm9tZV9saW5rJ10sDQogICAgICAgICAgICAiU2lub3BzZSIgPT4gJHJvd1snc2lub3BzZSddLA0KICAgICAgICAgICAgIkNhdGVnb3JpYSIgPT4gJHJvd1snbm9tZSddLA0KICAgICAgICAgICAgIkxpbmsiICAgICAgPT4gJHJvd1snbGlua19saW5rJ10sDQogICAgICAgICAgICAiRXhjIiAgICAgID0+ICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtZGFuZ2VyIiBvbmNsaWNrPSJyZW1vdmVyQ29uZmlybWEoJy4iJyIuJHJvd1snaWRfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ25vbWVfbGluayddLiInIi4nKSI+PGkgY2xhc3M9ImZhciBmYS10cmFzaC1hbHQiPjwvaT48L2J1dHRvbj4nLA0KICAgICAgICAgICAgIkFsdCIgICAgICA9PiAnPHRkPjxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkiIG9uY2xpY2s9ImVkaXRhckNvbmZpcm1hKCcuIiciLiRyb3dbJ2lkX2xpbmsnXS4iJyIuJywnLiInIi4kcm93Wydub21lX2xpbmsnXS4iJyIuJywnLiInIi4kcm93Wydsb2dvJ10uIiciLicsJy4iJyIuJHJvd1snbGlua19saW5rJ10uIiciLicsJy4iJyIuJHJvd1snc2lub3BzZSddLiInIi4nLCcuIiciLiRyb3dbJ2lkX2NhdGVnb3JpYSddLiInIi4nKSI+PGkgY2xhc3M9ImZhcyBmYS1lZGl0Ij48L2k+PC9idXR0b24+Jw0KICAgICAgICBdOw0KICAgICAgICAkZGFkb3NbXSA9ICRyZWdpc3Ryb3NfY29tX2NoaWxkc19yb3dzOw0KICAgIH0NCg0KICAgICRyZXN1bHRhZG8gPSBbDQogICAgICAgICJkcmF3IiAgICAgICAgICAgID0+IGludHZhbCgkZGFkb3NfcmVxdWlzaWNhb1snZHJhdyddKSwNCiAgICAgICAgInJlY29yZHNUb3RhbCIgICAgPT4gaW50dmFsKCRyZXN1bHRfY291bnRbJ3FudF9saW5rJ10pLA0KICAgICAgICAicmVjb3Jkc0ZpbHRlcmVkIiA9PiBpbnR2YWwoJHJlc3VsdF9jb3VudFsncW50X2xpbmsnXSksDQogICAgICAgICJkYXRhIiAgICAgICAgICAgID0+ICRkYWRvcw0KICAgIF07DQoNCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXN1bHRhZG8pOw0KICAgIGV4aXQoKTsNCn0NCiA/Pg0KDQo8P3BocA0KICAgIHNlc3Npb25fc3RhcnQoKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy91c3Vhcmlvcy5waHAiKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy9saW5rcy5waHAiKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy9jYXRlZ29yaWFzLnBocCIpOw0KICAgIC8vaW5jbHVkZSAncGFnaW5hdGlvbi5jbGFzcy5waHAnOw0KICAgIGlmIChjaGVjYXJVc3VhcmlvKCkpIHsNCiAgICAgICAgcmVxdWlyZV9vbmNlKCJjYWJlY2FsaG8ucGhwIik7DQogICAgICAgIGlmKCRfU0VTU0lPTlsnYWRtaW4nXSl7DQogICAgICAgIH0NCiAgICAgICAgLy8kbGlua3MgPSBsaXN0YXJsaW5rcygpOw0KICAgICAgICAkY2F0ZWdvcmlhcyA9IGxpc3RhckNhdGVnb3JpYXN0aXBvKCJmaWxtZXMiKTsNCg0KDQo/Pg0KICAgICAgICAgICAgPHN0eWxlIGlkPSJjaGVja21lIj4NCiAgICAgICAgICAgICAgICAucGFnZS0yY29udGVudCB7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMjQwcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMjQwcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICA8L3N0eWxlPg0KICAgICAgICAgICAgPGRpdiBpZD0iY29udGV1ZG8tcGFpbmVsIiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICA8dGFibGUgaWQ9ImRhdGFfdGFibGUiIGNsYXNzPSJkaXNwbGF5IG92ZXJmbG93LWF1dG8gdGFibGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPg0KICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ0YWJsZS1kYXJrIj4NCiAgICAgICAgICAgICAgICAgICAgPHRyPjwhLS08dGg+PC90aD4gZGVzY29tZW50YXIgcGFyYSB1c2FyIGNoaWxkcyAtLT4NCiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogNSUiIHNjb3BlPSJjb2wiID4jPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCIgPkxvZ288L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPlTDrXR1bG88L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPlNpbm9wc2U8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPkNhdGVnb3JpYTwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHNjb3BlPSJjb2wiID5MaW5rPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCI+RXhjPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCI+QWx0PC90aD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+DQogICAgICAgICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L21haW4+DQo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvL2Nkbi5kYXRhdGFibGVzLm5ldC8yLjAuNy9jc3MvZGF0YVRhYmxlcy5kYXRhVGFibGVzLmNzcyI+DQo8c2NyaXB0IHNyYz0iLy9jZG4uZGF0YXRhYmxlcy5uZXQvMi4wLjcvanMvZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIC5vdmVyZmxvdy1hdXRvIHsNCiAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50Ow0KfQ0KPC9zdHlsZT4NCjxzY3JpcHQgPg0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsNCiAgICAvLyBGdW7Dp8OjbyBwYXJhIGFkaWNpb25hciBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgw6AgZGl2ICdkdC1sYXlvdXQtY2VsbCcNCiAgICBmdW5jdGlvbiBhZGRPdmVyZmxvd0F1dG8oKSB7DQogICAgICAgIHZhciB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGFfdGFibGVfd3JhcHBlciIpOw0KICAgICAgICBpZiAod3JhcHBlcikgew0KICAgICAgICAgICAgdmFyIGxheW91dENlbGwgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIi5kdC1sYXlvdXQtdGFibGUiKTsNCiAgICAgICAgICAgIHZhciBkdF9jb250cm9sID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCIuZHQtY29udHJvbCIpOw0KICAgICAgICAgICAgaWYgKGxheW91dENlbGwpIHsNCiAgICAgICAgICAgICAgICBsYXlvdXRDZWxsLmNsYXNzTGlzdC5hZGQoIm92ZXJmbG93LWF1dG8iKTsNCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJDbGFzc2UgJ292ZXJmbG93LWF1dG8nIGFkaWNpb25hZGEgw6AgZGl2IGNvbSBhIGNsYXNzZSAnZHQtbGF5b3V0LWNlbGwnIik7DQogICAgICAgICAgICB9aWYgKGR0X2NvbnRyb2wpIHsNCiAgICAgICAgICAgICAgICBkdF9jb250cm9sLmNsYXNzTGlzdC5yZW1vdmUoImR0LW9yZGVyaW5nLWRlc2MiKTsNCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJDbGFzc2UgJ2R0LW9yZGVyaW5nLWRlc2MnIHJlbW92aWRhIGRhIHRkIGNvbSBhIGNsYXNzZSAnZHQtY29udHJvbCciKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgLy8gQ3JpYSB1bSBNdXRhdGlvbk9ic2VydmVyIHBhcmEgb2JzZXJ2YXIgYXMgbXVkYW7Dp2FzIG5vIERPTQ0KICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgew0KICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikgew0KICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgaG91dmUgdW1hIG11ZGFuw6dhIG5vIGVsZW1lbnRvIGNvbSBvIGlkICdkYXRhX3RhYmxlX3dyYXBwZXInDQogICAgICAgICAgICBpZiAobXV0YXRpb24udGFyZ2V0LmlkID09PSAiZGF0YV90YWJsZV93cmFwcGVyIikgew0KICAgICAgICAgICAgICAgIGFkZE92ZXJmbG93QXV0bygpOyAvLyBBZGljaW9uYSBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycNCiAgICAgICAgICAgICAgICAvL2R0X3NlYXJjaCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCg0KICAgIC8vIENvbmZpZ3VyYSBvIE11dGF0aW9uT2JzZXJ2ZXIgcGFyYSBvYnNlcnZhciBtdWRhbsOnYXMgbm8gRE9NDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCg0KICAgIC8vIFZlcmlmaWNhIGUgYWRpY2lvbmEgYSBjbGFzc2UgJ292ZXJmbG93LWF1dG8nIGltZWRpYXRhbWVudGUgYXDDs3MgbyBET00gc2VyIGNhcnJlZ2Fkbw0KICAgIGFkZE92ZXJmbG93QXV0bygpOw0KfSk7DQokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsNCiAgICBmdW5jdGlvbiBkdF9zZWFyY2goKSB7DQogICAgICAgICQoJyNkdC1zZWFyY2gtMCcpLmFkZENsYXNzKCdjb2wgY29sLW1kLTYgZHQtaW5wdXQgZmxvYXQtbGVmdCBmb3JtLWNvbnRyb2wgZm9ybS1yb3cnKS5hdHRyKCdwbGFjZWhvbGRlcicsICdQZXNxdWlzYXIuLi4nKTsNCiAgICAgICAgJCgnLmR0LXNlYXJjaCcpLmFkZENsYXNzKCdmb3JtLXJvdyBkLWJsb2NrJyk7DQogICAgICAgIHZhciBsYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9ImR0LXNlYXJjaC0wIl0nKTsNCiAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgbGFiZWxFbGVtZW50LnJlbW92ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU2VsZWNpb25hIHRvZG9zIG9zIGVsZW1lbnRvcyBjb20gYSBjbGFzc2UgJy5kdC1zZWFyY2gnDQogICAgICAgIHZhciBkdFNlYXJjaEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmR0LXNlYXJjaCcpOw0KICAgICAgICBjb25zdCBub3ZvX2NhbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdm9fY2FuYWwnKTsNCg0KICAgICAgICBpZiAoIW5vdm9fY2FuYWwpIHsNCg0KICAgICAgICAgICAgLy8gSXRlcmEgc29icmUgY2FkYSBlbGVtZW50byBlbmNvbnRyYWRvDQogICAgICAgICAgICBkdFNlYXJjaEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZHRTZWFyY2hFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgLy8gU2VsZWNpb25hIG8gaW5wdXQgZGVudHJvIGRlIGNhZGEgZWxlbWVudG8gJy5kdC1zZWFyY2gnDQogICAgICAgICAgICAgICAgdmFyIGlucHV0RWxlbWVudCA9IGR0U2VhcmNoRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOw0KDQogICAgICAgICAgICAgICAgLy8gQWRpY2lvbmEgYSBjbGFzc2UgJ2Zvcm0tcm93JyBhbyBpbnB1dA0KICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0tcm93Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JpYSBvIGVsZW1lbnRvIDxpPiBjb20gb3MgYXRyaWJ1dG9zIGVzcGVjaWZpY2Fkb3MNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdm9FbGVtZW50byA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLmlubmVySFRNTCA9ICcgTm92byc7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5jbGFzc05hbWUgPSAnYnRuIGJ0bi1vdXRsaW5lLWluZm8gY29sIGNvbC1tZC0yIGZhLXVzZXItcGx1cyBmYXMgZmxvYXQtcmlnaHQgdGV4dC1kYXJrJzsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uc2V0QXR0cmlidXRlKCdpZCcsICdub3ZvX2NhbmFsJyk7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAiJCgnI2NhZGFzdHJvJykubW9kYWwoKSIpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIEluc2VyZSBvIG5vdm8gZWxlbWVudG8gYXDDs3MgbyBpbnB1dA0KICAgICAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm92b0VsZW1lbnRvLCBpbnB1dEVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfQ0KICAgIHZhciB0YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKHsNCiAgICAgICAgYWpheDogJz9saXN0YXJfbGlua3MnLA0KICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLA0KICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLA0KICAgICAgICBsYW5ndWFnZTogew0KICAgICAgICB1cmw6ICcvL2Nkbi5kYXRhdGFibGVzLm5ldC9wbHVnLWlucy8xLjEwLjEzL2kxOG4vUG9ydHVndWVzZS1CcmFzaWwuanNvbicNCiAgICB9LA0KICAgICAgICBzZWFyY2g6IHsNCiAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6ICJQZXNxdWlzYXIuLi4iIC8vIFBsYWNlaG9sZGVyIHBhcmEgbyBjYW1wbyBkZSBwZXNxdWlzYQ0KICAgICAgICB9LCAgICAgICAgDQogICAgbGF5b3V0OiB7DQogICAgICAgIHRvcFN0YXJ0OiBudWxsLA0KICAgICAgICBib3R0b206ICdwYWdpbmcnLA0KICAgICAgICBib3R0b21TdGFydDogImluZm8iLA0KICAgICAgICBib3R0b21FbmQ6IG51bGwNCiAgICB9LA0KICAgICAgICBjb2x1bW5zOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGF0YTogIklEIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sIC8vIElEDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiTG9nbyIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LCAvLyBVUkwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvL29yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIlRpdHVsbyIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LCAvLyBMb2dvIFVSTA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIlNpbm9wc2UiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvL29yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkNhdGVnb3JpYSIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkxpbmsiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJFeGMiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIGFjYW8iDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkFsdCIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIgYWNhbyINCiAgICAgICAgICAgIH0sIC8vIExvZ28gVVJMDQogICAgICAgICAgICAvKnsgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIGRhdGE6IG51bGwsIC8vIEHDp8O1ZXMgKG5lbmh1bWEgZGF0YSBhc3NvY2lhZGEpDQogICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgew0KICAgICAgICAgICAgICBib3Rhb19lZGl0YXIgPSAnPGEgaWQ9IicgKyByb3cuaWQgKyAnIiBjbGFzcz0iYnRuIGJ0bi1pbmZvIGJ0bi1zbSI+RURJVEFSPC9hPic7DQogICAgICAgICAgICAgIGJvdGFvX2V4Y2x1aXIgPSAnPGEgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi1zbSI+RXhjbHVpcjwvYT4nOw0KICAgICAgICAgICAgcmV0dXJuIGJvdGFvX2VkaXRhciArIGJvdGFvX2V4Y2x1aXI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9Ki8NCiAgICAgICAgXSwNCiAgICBvcmRlcjogW1syLCAnYXNjJ11dLA0KICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAvLyBDYWxsYmFjayBjaGFtYWRvIGFww7NzIGNhZGEgZGVzZW5obyBkYSB0YWJlbGEgKGluY2x1c2l2ZSBpbmljaWFsaXphw6fDo28pDQogICAgICAgICAgICBkdF9zZWFyY2goKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogIH0pOw0KIC8vIEFkaWNpb25hIGEgY2xhc3NlICdmb3JtLWNvbnRyb2wnIGFvIGNhbXBvIGRlIHBlc3F1aXNhDQoNCjwvc2NyaXB0Pg0KICAgIDwhLS0gcGFnZS1jb250ZW50IiAtLT4NCjwvZGl2Pg0KPCEtLSBDYWRhc3RybyBJbmljaW8gLS0+DQo8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY2FkYXN0cm8iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+QWRpY2lvbmFyIENvbnRlw7pkbzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiIHN0eWxlPSJtYXgtaGVpZ2h0OjQ2MHB4OyBvdmVyZmxvdy15OmF1dG87Ij4NCiAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iY2FkYXN0cm8tZm9ybSI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm9tZTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJub21lIiBwbGFjZWhvbGRlcj0iTm9tZSBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Mb2dvOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9ImxvZ28iIHBsYWNlaG9sZGVyPSJMaW5rIGRhIEltYWdlbSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VXJsOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9ImxpbmsiIHBsYWNlaG9sZGVyPSJVcmwgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2lub3BzZTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJzaW5vcHNlIiBwbGFjZWhvbGRlcj0iU2lub3BzZSBkbyBDb250ZcO6ZG8iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkNhdGVnb3LDrWE6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtbC0wIHJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InNlbGVjdHBpY2tlciIgdGl0bGU9IkNhdGVnb3JpYSIgbmFtZT0iY2F0ZWdvcmlhIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJGNhdGVnb3JpYXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRjYXRlZ29yaWFzIGFzICRjYXRlZ29yaWEpIHs/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8Pz0gJGNhdGVnb3JpYVsnaWQnXT8+IiA+IDw/PSAkY2F0ZWdvcmlhWydub21lJ10/PiA8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gfSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NCgkJCTxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+DQoJCQkJPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGZvcm09ImNhZGFzdHJvLWZvcm0iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkFkaWNpb25hcjwvYnV0dG9uPg0KCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPg0KCQkJPC9kaXY+ICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KPC9kaXY+DQo8IS0tIENhZGFzdHJvIEZpbS0tPg0KPCEtLSBSZW1vdmUgSW5pY2lvIC0tPg0KPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlbW92ZXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+VGVtIGNlcnRlemE/PC9oNT4NCiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJGZWNoYXIiPg0KICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBpZD0icmVtb3Zlci1jb250ZXVkbyIgY2xhc3M9Im1vZGFsLWJvZHkiPjwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KPCEtLSBSZW1vdmUgRmltLS0+DQo8IS0tIEVkaXRhIEluaWNpbyAtLT4NCjxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJlZGl0YXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+RWRpdGFyIENvbnRlw7pkbzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiIHN0eWxlPSJtYXgtaGVpZ2h0OjQ2MHB4OyBvdmVyZmxvdy15OmF1dG87Ij4NCiAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iZWRpdGFyLWZvcm0iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiIGlkPSJpZEUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vbWU6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9Im5vbWVFIiBuYW1lPSJub21lIiBwbGFjZWhvbGRlcj0iTm9tZSBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Mb2dvOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJsb2dvRSIgbmFtZT0ibG9nbyIgcGxhY2Vob2xkZXI9IkxpbmsgZGEgSW1hZ2VtIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Vcmw6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImxpbmtFIiBuYW1lPSJsaW5rIiBwbGFjZWhvbGRlcj0iVXJsIGRvIExpbmsiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNpbm9wc2U6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9InNpbm9wc2VFIiBuYW1lPSJzaW5vcHNlIiBwbGFjZWhvbGRlcj0iU2lub3BzZSBkbyBDb250ZcO6ZG8iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkNhdGVnb3LDrWE6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtbC0wIHJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InNlbGVjdHBpY2tlciIgdGl0bGU9IkNhdGVnb3LDrWEiIGlkPSJjYXRlZ29yaWFFIiBuYW1lPSJjYXRlZ29yaWEiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwICBpZiAoJGNhdGVnb3JpYXMpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkY2F0ZWdvcmlhcyBhcyAkY2F0ZWdvcmlhKSB7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD89ICRjYXRlZ29yaWFbJ2lkJ10/PiIgPiA8Pz0gJGNhdGVnb3JpYVsnbm9tZSddPz4gPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPg0KCQkJCTxidXR0b24gdHlwZT0ic3VibWl0IiBmb3JtPSJlZGl0YXItZm9ybSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+RWRpdGFyPC9idXR0b24+DQoJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+RmVjaGFyPC9idXR0b24+DQoJCQk8L2Rpdj4gICAgICAgICAgICANCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQo8L2Rpdj4NCjwhLS0gRWRpdGEgRmltLS0+DQo8L2JvZHk+DQo8c2NyaXB0Pg0KICAgIGZ1bmN0aW9uIHJlbW92ZXJDb25maXJtYShpZCxub21lKSB7DQogICAgICAgICQoJyNyZW1vdmVyLWNvbnRldWRvJykuaHRtbCgnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZGFuZ2VyIiByb2xlPSJhbGVydCI+PHN0cm9uZz4gUmVtb3ZlciA8L3N0cm9uZz4nICsgbm9tZSArICc/PC9kaXY+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBmbG9hdC1yaWdodCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHgiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icmVtb3ZlcignICsgaWQgKyAnKSIgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgZmxvYXQtcmlnaHQiPlJlbW92ZXI8L2J1dHRvbj4nKTsNCiAgICAgICAgJCgnI3JlbW92ZXInKS5tb2RhbCgpOw0KICAgIH0NCiAgICBmdW5jdGlvbiBlZGl0YXJDb25maXJtYShpZCxub21lLCBsb2dvLCBsaW5rLCBzaW5vcHNlLCBjYXRlZ29yaWEpIHsNCiAgICAgICAgJCgnI2lkRScpLnZhbChpZCk7DQogICAgICAgICQoJyNub21lRScpLnZhbChub21lKTsNCiAgICAgICAgJCgnI2xvZ29FJykudmFsKGxvZ28pOw0KICAgICAgICAkKCcjbGlua0UnKS52YWwobGluayk7DQogICAgICAgICQoJyNzaW5vcHNlRScpLnZhbChzaW5vcHNlKTsNCiAgICAgICAgaWYgKGNhdGVnb3JpYSAhPT0gIiIpIHsNCiAgICAgICAgICAkKCcjY2F0ZWdvcmlhRScpLnZhbChjYXRlZ29yaWEpOw0KICAgICAgICAgICQoJyNjYXRlZ29yaWFFJykuc2VsZWN0cGlja2VyKCdyZW5kZXInKTsNCiAgICAgICAgfQ0KICAgICAgICAkKCcjZWRpdGFyJykubW9kYWwoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gcmVtb3ZlcihpZCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL3JlbW92ZXItbGluay5waHAiLA0KICAgICAgICAgICAgZGF0YToge2lkOiBpZH0sDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgICAgICAgICAgJCgiI3JlbW92ZXIiKS5tb2RhbCgnaGlkZScpOw0KICAgICAgICAgICAgICAgIGRhdGFfdGFibGUgPSAkKCcjZGF0YV90YWJsZScpLkRhdGFUYWJsZSgpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFnaW5hX2F0dWFsID0gZGF0YV90YWJsZS5wYWdlKCk7IC8vIEFybWF6ZW5hIGEgcMOhZ2luYSBhdHVhbA0KICAgICAgICAgICAgICAgICAgICAvLyBBdHVhbGl6YSBhIHRhYmVsYQ0KICAgICAgICAgICAgICAgICAgICBkYXRhX3RhYmxlLmRyYXcoKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzdGF1cmEgYSBww6FnaW5hIGFww7NzIGEgYXR1YWxpemHDp8Ojbw0KICAgICAgICAgICAgICAgICAgICBkYXRhX3RhYmxlLnBhZ2UocGFnaW5hX2F0dWFsKS5kcmF3KCdwYWdlJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCiAgICAkKCAiI2NhZGFzdHJvLWZvcm0iICkuc3VibWl0KGZ1bmN0aW9uKCBldmVudCApIHsNCiAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgIHVybDogImNvbnRyb2xlcy9hZGljaW9uYXItbGluay5waHAiLA0KICAgICAgICAgICAgZGF0YTogJCgiI2NhZGFzdHJvLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICQoIiNjYWRhc3RybyIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsNCiAgICAgICAgICAgICAgcmVzdWx0YWRvKGRhdGEucmVzcG9uc2VUZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgfSk7DQogICAgJCggIiNlZGl0YXItZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2VkaXRhci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjZWRpdGFyLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjZWRpdGFyIikubW9kYWwoJ2hpZGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhX3RhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2luYV9hdHVhbCA9IGRhdGFfdGFibGUucGFnZSgpOyAvLyBBcm1hemVuYSBhIHDDoWdpbmEgYXR1YWwNCiAgICAgICAgICAgICAgICAgICAgLy8gQXR1YWxpemEgYSB0YWJlbGENCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5kcmF3KCk7DQogICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhdXJhIGEgcMOhZ2luYSBhcMOzcyBhIGF0dWFsaXphw6fDo28NCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5wYWdlKHBhZ2luYV9hdHVhbCkuZHJhdygncGFnZScpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICByZXN1bHRhZG8oZGF0YS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICB9KTsNCiAgICBzcGVlZF90b190b3AgPSAxMDAwOyAgIA0KICAgICQoJyN0b3RvcCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7DQogICAgICAgICAgICBzY3JvbGxUb3A6IDANCiAgICAgICAgfSwgc3BlZWRfdG9fdG9wKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0pOw0KICAgICQoJyN0b3RvcCcpLmhpZGUoKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKCQodGhpcykuc2Nyb2xsVG9wKCkgPiA1MCkgew0KICAgICAgICAgICAgJCgnI3RvdG9wJykuZmFkZUluKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkKCcjdG90b3AnKS5mYWRlT3V0KCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KPC9zY3JpcHQ+DQo8P3BocCANCiAgICByZXF1aXJlX29uY2UoImNvbXVtLnBocCIpOw0KICAgIHJlcXVpcmVfb25jZSgiYWxlcnRhLnBocCIpOyANCj8+DQo8L2h0bWw+DQo8P3BocCANCn0gZWxzZSB7DQogICAgaGVhZGVyKCJMb2NhdGlvbjogbG9naW4iKTsNCiAgICBkaWUoKTsNCn0NCj8+"));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program
Function Calls
base64_decode | 1 |
Stats
MD5 | 749616e2c34bf12034e11a0da1eeb458 |
Eval Count | 1 |
Decode Time | 84 ms |