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 \'%CANAIS |%\' OR c.nome like \'%CANAIS @%\' OR c.nome like \'%24 H%\')";
    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 \'%CANAIS |%\' OR c.nome like \'%CANAIS @%\' OR c.nome like \'%24 H%\')";

    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[\'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("live");


?>
            <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" >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"
            },
            {
                //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">&times;</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">
                            <input type="hidden" 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">&times;</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">&times;</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>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, categoria) {
        $(\'#idE\').val(id);
        $(\'#nomeE\').val(nome);
        $(\'#logoE\').val(logo);
        $(\'#linkE\').val(link);
        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+ICdub21lJw0KICAgICAgICBdOw0KICAgIC8vIFF1ZXJ5IHBhcmEgY29udGFyIG8gbsO6bWVybyBkZSByZWdpc3Ryb3MNCiAgICAkcXVlcnlfY291bnQgPSAiU0VMRUNUIENPVU5UKGwuaWRfbGluaykgQVMgcW50X2xpbmsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBsaW5rIGwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBjYXRlZ29yaWEgYyBPTiBjLmlkID0gbC5pZF9jYXRlZ29yaWENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAoYy5ub21lIGxpa2UgJyVDQU5BSVMgfCUnIE9SIGMubm9tZSBsaWtlICclQ0FOQUlTIEAlJyBPUiBjLm5vbWUgbGlrZSAnJTI0IEglJykiOw0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkcXVlcnlfY291bnQgLj0gIiBBTkQgKG5vbWVfbGluayBMSUtFIDpub21lX2xpbmspIjsNCiAgICB9DQoNCiAgICAkcXVlcnlfY291bnQgPSAkY29uZXhhbzItPnByZXBhcmUoJHF1ZXJ5X2NvdW50KTsNCiAgICBpZiAoIWVtcHR5KCRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSkpIHsNCiAgICAgICAgJHZhbG9yX3Blc3EgPSAiJSIgLiAkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10gLiAiJSI7DQogICAgICAgICRxdWVyeV9jb3VudC0+YmluZFZhbHVlKCc6bm9tZV9saW5rJywgJHZhbG9yX3Blc3EpOw0KICAgIH0NCiAgICAkcXVlcnlfY291bnQtPmV4ZWN1dGUoKTsNCiAgICAkcmVzdWx0X2NvdW50ID0gJHF1ZXJ5X2NvdW50LT5mZXRjaChQRE86OkZFVENIX0FTU09DKTsNCg0KICAgICRpbmljaW8gPSAoaW50KSRkYWRvc19yZXF1aXNpY2FvWydzdGFydCddOw0KICAgICRxdWFudGlkYWRlID0gKGludCkkZGFkb3NfcmVxdWlzaWNhb1snbGVuZ3RoJ107DQoNCiAgICAvLyBRdWVyeSBwYXJhIGxpc3RhciBvcyByZWdpc3Ryb3MgY29tIHBhZ2luYcOnw6NvDQogICAgJGxpc3RfcXVlcnkgPSAiU0VMRUNUIGwuKiwgYy5ub21lIGFzIG5vbWUgDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGxpbmsgbCAgDQogICAgICAgICAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGNhdGVnb3JpYSBjIE9OIGMuaWQgPSBsLmlkX2NhdGVnb3JpYSANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIChjLm5vbWUgbGlrZSAnJUNBTkFJUyB8JScgT1IgYy5ub21lIGxpa2UgJyVDQU5BSVMgQCUnIE9SIGMubm9tZSBsaWtlICclMjQgSCUnKSI7DQoNCiAgICBpZiAoIWVtcHR5KCRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSkpIHsNCiAgICAgICAgJGxpc3RfcXVlcnkgLj0gIiBBTkQgKG5vbWVfbGluayBMSUtFIDpub21lX2xpbmspICI7DQogICAgfQ0KDQogICAgJGxpc3RfcXVlcnkgLj0gIiBPUkRFUiBCWSAiIC4gJGNvbHVuYXNbJGRhZG9zX3JlcXVpc2ljYW9bJ29yZGVyJ11bMF1bJ2NvbHVtbiddXSAuICIgIiAuICRkYWRvc19yZXF1aXNpY2FvWydvcmRlciddWzBdWydkaXInXSAuICIgTElNSVQgOnF1YW50aWRhZGUgT0ZGU0VUIDppbmljaW8iOw0KDQogICAgJGxpc3RfcXVlcnkgPSAkY29uZXhhbzItPnByZXBhcmUoJGxpc3RfcXVlcnkpOw0KICAgICRsaXN0X3F1ZXJ5LT5iaW5kVmFsdWUoJzppbmljaW8nLCAkaW5pY2lvLCBQRE86OlBBUkFNX0lOVCk7DQogICAgJGxpc3RfcXVlcnktPmJpbmRWYWx1ZSgnOnF1YW50aWRhZGUnLCAkcXVhbnRpZGFkZSwgUERPOjpQQVJBTV9JTlQpOw0KDQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICR2YWxvcl9wZXNxID0gIiUiIC4gJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddIC4gIiUiOw0KICAgICAgICAkbGlzdF9xdWVyeS0+YmluZFZhbHVlKCc6bm9tZV9saW5rJywgJHZhbG9yX3Blc3EpOw0KICAgIH0NCg0KICAgIC8vIEV4ZWN1dGEgYSBjb25zdWx0YQ0KICAgICRsaXN0X3F1ZXJ5LT5leGVjdXRlKCk7DQoNCiAgICAvLyBQcmVwYXJhIG9zIGRhZG9zIHBhcmEgbyBmb3JtYXRvIEpTT04NCiAgICAkZGFkb3MgPSBbXTsNCiAgICB3aGlsZSAoJHJvdyA9ICRsaXN0X3F1ZXJ5LT5mZXRjaChQRE86OkZFVENIX0FTU09DKSkgew0KICAgICAgICAvLyBSZWdpc3Ryb3MgcGFyYSB0YWJlbGEgY29tIENoaWxkIHJvd3MNCiAgICAgICAgJHJlZ2lzdHJvc19jb21fY2hpbGRzX3Jvd3MgPSBbDQogICAgICAgICAgICAiSUQiICAgICAgID0+ICRyb3dbJ2lkX2xpbmsnXSwNCiAgICAgICAgICAgICJMb2dvIiAgICAgID0+ICc8aW1nIHNyYz0nLiciJy4kcm93Wydsb2dvJ10uJyInLidzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgd2lkdGg6NDVweDsgaGVpZ2h0OjQ1cHg7IiAvPicsDQogICAgICAgICAgICAiVGl0dWxvIiA9PiAkcm93Wydub21lX2xpbmsnXSwNCiAgICAgICAgICAgICJTaW5vcHNlIiA9PiAkcm93WydzaW5vcHNlJ10sDQogICAgICAgICAgICAiQ2F0ZWdvcmlhIiA9PiAkcm93Wydub21lJ10sDQogICAgICAgICAgICAiTGluayIgICAgICA9PiAkcm93WydsaW5rX2xpbmsnXSwNCiAgICAgICAgICAgICJFeGMiICAgICAgPT4gJzxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZS1kYW5nZXIiIG9uY2xpY2s9InJlbW92ZXJDb25maXJtYSgnLiInIi4kcm93WydpZF9saW5rJ10uIiciLicsJy4iJyIuJHJvd1snbm9tZV9saW5rJ10uIiciLicpIj48aSBjbGFzcz0iZmFyIGZhLXRyYXNoLWFsdCI+PC9pPjwvYnV0dG9uPicsDQogICAgICAgICAgICAiQWx0IiAgICAgID0+ICc8dGQ+PGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgb25jbGljaz0iZWRpdGFyQ29uZmlybWEoJy4iJyIuJHJvd1snaWRfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ25vbWVfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ2xvZ28nXS4iJyIuJywnLiInIi4kcm93WydsaW5rX2xpbmsnXS4iJyIuJywnLiInIi4kcm93WydpZF9jYXRlZ29yaWEnXS4iJyIuJykiPjxpIGNsYXNzPSJmYXMgZmEtZWRpdCI+PC9pPjwvYnV0dG9uPicNCiAgICAgICAgXTsNCiAgICAgICAgJGRhZG9zW10gPSAkcmVnaXN0cm9zX2NvbV9jaGlsZHNfcm93czsNCiAgICB9DQoNCiAgICAkcmVzdWx0YWRvID0gWw0KICAgICAgICAiZHJhdyIgICAgICAgICAgICA9PiBpbnR2YWwoJGRhZG9zX3JlcXVpc2ljYW9bJ2RyYXcnXSksDQogICAgICAgICJyZWNvcmRzVG90YWwiICAgID0+IGludHZhbCgkcmVzdWx0X2NvdW50WydxbnRfbGluayddKSwNCiAgICAgICAgInJlY29yZHNGaWx0ZXJlZCIgPT4gaW50dmFsKCRyZXN1bHRfY291bnRbJ3FudF9saW5rJ10pLA0KICAgICAgICAiZGF0YSIgICAgICAgICAgICA9PiAkZGFkb3MNCiAgICBdOw0KDQogICAgZWNobyBqc29uX2VuY29kZSgkcmVzdWx0YWRvKTsNCiAgICBleGl0KCk7DQp9DQogPz4NCg0KPD9waHANCiAgICBzZXNzaW9uX3N0YXJ0KCk7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvdXN1YXJpb3MucGhwIik7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvbGlua3MucGhwIik7DQogICAgcmVxdWlyZV9vbmNlKCJjb250cm9sZXMvY2F0ZWdvcmlhcy5waHAiKTsNCiAgICAvL2luY2x1ZGUgJ3BhZ2luYXRpb24uY2xhc3MucGhwJzsNCiAgICBpZiAoY2hlY2FyVXN1YXJpbygpKSB7DQogICAgICAgIHJlcXVpcmVfb25jZSgiY2FiZWNhbGhvLnBocCIpOw0KICAgICAgICBpZigkX1NFU1NJT05bJ2FkbWluJ10pew0KICAgICAgICB9DQogICAgICAgIC8vJGxpbmtzID0gbGlzdGFybGlua3MoKTsNCiAgICAgICAgJGNhdGVnb3JpYXMgPSBsaXN0YXJDYXRlZ29yaWFzdGlwbygibGl2ZSIpOw0KDQoNCj8+DQogICAgICAgICAgICA8c3R5bGUgaWQ9ImNoZWNrbWUiPg0KICAgICAgICAgICAgICAgIC5wYWdlLTJjb250ZW50IHsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAyNDBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNDBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDwvc3R5bGU+DQogICAgICAgICAgICA8ZGl2IGlkPSJjb250ZXVkby1wYWluZWwiIGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgIDx0YWJsZSBpZD0iZGF0YV90YWJsZSIgY2xhc3M9ImRpc3BsYXkgb3ZlcmZsb3ctYXV0byB0YWJsZSIgc3R5bGU9IndpZHRoOiAxMDAlOyI+DQogICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9InRhYmxlLWRhcmsiPg0KICAgICAgICAgICAgICAgICAgICA8dHI+PCEtLTx0aD48L3RoPiBkZXNjb21lbnRhciBwYXJhIHVzYXIgY2hpbGRzIC0tPg0KICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCIgPiM8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIiA+TG9nbzwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogMjAlIiBzY29wZT0iY29sIiA+VMOtdHVsbzwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogMjAlIiBzY29wZT0iY29sIiA+Q2F0ZWdvcmlhPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc2NvcGU9ImNvbCIgPkxpbms8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIj5FeGM8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDUlIiBzY29wZT0iY29sIj5BbHQ8L3RoPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgPC90aGVhZD4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvbWFpbj4NCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii8vY2RuLmRhdGF0YWJsZXMubmV0LzIuMC43L2Nzcy9kYXRhVGFibGVzLmRhdGFUYWJsZXMuY3NzIj4NCjxzY3JpcHQgc3JjPSIvL2Nkbi5kYXRhdGFibGVzLm5ldC8yLjAuNy9qcy9kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgLm92ZXJmbG93LWF1dG8gew0KICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPHNjcmlwdCA+DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgIC8vIEZ1bsOnw6NvIHBhcmEgYWRpY2lvbmFyIGEgY2xhc3NlICdvdmVyZmxvdy1hdXRvJyDDoCBkaXYgJ2R0LWxheW91dC1jZWxsJw0KICAgIGZ1bmN0aW9uIGFkZE92ZXJmbG93QXV0bygpIHsNCiAgICAgICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGF0YV90YWJsZV93cmFwcGVyIik7DQogICAgICAgIGlmICh3cmFwcGVyKSB7DQogICAgICAgICAgICB2YXIgbGF5b3V0Q2VsbCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiLmR0LWxheW91dC10YWJsZSIpOw0KICAgICAgICAgICAgdmFyIGR0X2NvbnRyb2wgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIi5kdC1jb250cm9sIik7DQogICAgICAgICAgICBpZiAobGF5b3V0Q2VsbCkgew0KICAgICAgICAgICAgICAgIGxheW91dENlbGwuY2xhc3NMaXN0LmFkZCgib3ZlcmZsb3ctYXV0byIpOw0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIkNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgYWRpY2lvbmFkYSDDoCBkaXYgY29tIGEgY2xhc3NlICdkdC1sYXlvdXQtY2VsbCciKTsNCiAgICAgICAgICAgIH1pZiAoZHRfY29udHJvbCkgew0KICAgICAgICAgICAgICAgIGR0X2NvbnRyb2wuY2xhc3NMaXN0LnJlbW92ZSgiZHQtb3JkZXJpbmctZGVzYyIpOw0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIkNsYXNzZSAnZHQtb3JkZXJpbmctZGVzYycgcmVtb3ZpZGEgZGEgdGQgY29tIGEgY2xhc3NlICdkdC1jb250cm9sJyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICAvLyBDcmlhIHVtIE11dGF0aW9uT2JzZXJ2ZXIgcGFyYSBvYnNlcnZhciBhcyBtdWRhbsOnYXMgbm8gRE9NDQogICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obXV0YXRpb25zKSB7DQogICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uKSB7DQogICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBob3V2ZSB1bWEgbXVkYW7Dp2Egbm8gZWxlbWVudG8gY29tIG8gaWQgJ2RhdGFfdGFibGVfd3JhcHBlcicNCiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50YXJnZXQuaWQgPT09ICJkYXRhX3RhYmxlX3dyYXBwZXIiKSB7DQogICAgICAgICAgICAgICAgYWRkT3ZlcmZsb3dBdXRvKCk7IC8vIEFkaWNpb25hIGEgY2xhc3NlICdvdmVyZmxvdy1hdXRvJw0KICAgICAgICAgICAgICAgIC8vZHRfc2VhcmNoKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgLy8gQ29uZmlndXJhIG8gTXV0YXRpb25PYnNlcnZlciBwYXJhIG9ic2VydmFyIG11ZGFuw6dhcyBubyBET00NCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KDQogICAgLy8gVmVyaWZpY2EgZSBhZGljaW9uYSBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgaW1lZGlhdGFtZW50ZSBhcMOzcyBvIERPTSBzZXIgY2FycmVnYWRvDQogICAgYWRkT3ZlcmZsb3dBdXRvKCk7DQp9KTsNCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KICAgIGZ1bmN0aW9uIGR0X3NlYXJjaCgpIHsNCiAgICAgICAgJCgnI2R0LXNlYXJjaC0wJykuYWRkQ2xhc3MoJ2NvbCBjb2wtbWQtNiBkdC1pbnB1dCBmbG9hdC1sZWZ0IGZvcm0tY29udHJvbCBmb3JtLXJvdycpLmF0dHIoJ3BsYWNlaG9sZGVyJywgJ1Blc3F1aXNhci4uLicpOw0KICAgICAgICAkKCcuZHQtc2VhcmNoJykuYWRkQ2xhc3MoJ2Zvcm0tcm93IGQtYmxvY2snKTsNCiAgICAgICAgdmFyIGxhYmVsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj0iZHQtc2VhcmNoLTAiXScpOw0KICAgICAgICBpZiAobGFiZWxFbGVtZW50KSB7DQogICAgICAgICAgICBsYWJlbEVsZW1lbnQucmVtb3ZlKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBTZWxlY2lvbmEgdG9kb3Mgb3MgZWxlbWVudG9zIGNvbSBhIGNsYXNzZSAnLmR0LXNlYXJjaCcNCiAgICAgICAgdmFyIGR0U2VhcmNoRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHQtc2VhcmNoJyk7DQogICAgICAgIGNvbnN0IG5vdm9fY2FuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm92b19jYW5hbCcpOw0KDQogICAgICAgIGlmICghbm92b19jYW5hbCkgew0KDQogICAgICAgICAgICAvLyBJdGVyYSBzb2JyZSBjYWRhIGVsZW1lbnRvIGVuY29udHJhZG8NCiAgICAgICAgICAgIGR0U2VhcmNoRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihkdFNlYXJjaEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAvLyBTZWxlY2lvbmEgbyBpbnB1dCBkZW50cm8gZGUgY2FkYSBlbGVtZW50byAnLmR0LXNlYXJjaCcNCiAgICAgICAgICAgICAgICB2YXIgaW5wdXRFbGVtZW50ID0gZHRTZWFyY2hFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7DQoNCiAgICAgICAgICAgICAgICAvLyBBZGljaW9uYSBhIGNsYXNzZSAnZm9ybS1yb3cnIGFvIGlucHV0DQogICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybS1yb3cnKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBDcmlhIG8gZWxlbWVudG8gPGk+IGNvbSBvcyBhdHJpYnV0b3MgZXNwZWNpZmljYWRvcw0KICAgICAgICAgICAgICAgICAgICB2YXIgbm92b0VsZW1lbnRvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uaW5uZXJIVE1MID0gJyBOb3ZvJzsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLmNsYXNzTmFtZSA9ICdidG4gYnRuLW91dGxpbmUtaW5mbyBjb2wgY29sLW1kLTIgZmEtdXNlci1wbHVzIGZhcyBmbG9hdC1yaWdodCB0ZXh0LWRhcmsnOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25vdm9fY2FuYWwnKTsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLnNldEF0dHJpYnV0ZSgnb25jbGljaycsICIkKCcjY2FkYXN0cm8nKS5tb2RhbCgpIik7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJlIG8gbm92byBlbGVtZW50byBhcMOzcyBvIGlucHV0DQogICAgICAgICAgICAgICAgICAgIGlucHV0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub3ZvRWxlbWVudG8sIGlucHV0RWxlbWVudC5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHRhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoew0KICAgICAgICBhamF4OiAnP2xpc3Rhcl9saW5rcycsDQogICAgICAgIHByb2Nlc3Npbmc6IHRydWUsDQogICAgICAgIHNlcnZlclNpZGU6IHRydWUsDQogICAgICAgIGxhbmd1YWdlOiB7DQogICAgICAgIHVybDogJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMTMvaTE4bi9Qb3J0dWd1ZXNlLUJyYXNpbC5qc29uJw0KICAgIH0sDQogICAgICAgIHNlYXJjaDogew0KICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogIlBlc3F1aXNhci4uLiIgLy8gUGxhY2Vob2xkZXIgcGFyYSBvIGNhbXBvIGRlIHBlc3F1aXNhDQogICAgICAgIH0sICAgICAgICANCiAgICBsYXlvdXQ6IHsNCiAgICAgICAgdG9wU3RhcnQ6IG51bGwsDQogICAgICAgIGJvdHRvbTogJ3BhZ2luZycsDQogICAgICAgIGJvdHRvbVN0YXJ0OiAiaW5mbyIsDQogICAgICAgIGJvdHRvbUVuZDogbnVsbA0KICAgIH0sDQogICAgICAgIGNvbHVtbnM6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBkYXRhOiAiSUQiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwgLy8gSUQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJMb2dvIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sIC8vIFVSTA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiVGl0dWxvIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy9vcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJDYXRlZ29yaWEiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJMaW5rIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiRXhjIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciBhY2FvIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJBbHQiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIGFjYW8iDQogICAgICAgICAgICB9LCAvLyBMb2dvIFVSTA0KICAgICAgICAgICAgLyp7IG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICBkYXRhOiBudWxsLCAvLyBBw6fDtWVzIChuZW5odW1hIGRhdGEgYXNzb2NpYWRhKQ0KICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsNCiAgICAgICAgICAgICAgYm90YW9fZWRpdGFyID0gJzxhIGlkPSInICsgcm93LmlkICsgJyIgY2xhc3M9ImJ0biBidG4taW5mbyBidG4tc20iPkVESVRBUjwvYT4nOw0KICAgICAgICAgICAgICBib3Rhb19leGNsdWlyID0gJzxhIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4tc20iPkV4Y2x1aXI8L2E+JzsNCiAgICAgICAgICAgIHJldHVybiBib3Rhb19lZGl0YXIgKyBib3Rhb19leGNsdWlyOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSovDQogICAgICAgIF0sDQogICAgb3JkZXI6IFtbMiwgJ2FzYyddXSwNCiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgLy8gQ2FsbGJhY2sgY2hhbWFkbyBhcMOzcyBjYWRhIGRlc2VuaG8gZGEgdGFiZWxhIChpbmNsdXNpdmUgaW5pY2lhbGl6YcOnw6NvKQ0KICAgICAgICAgICAgZHRfc2VhcmNoKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICB9KTsNCiAvLyBBZGljaW9uYSBhIGNsYXNzZSAnZm9ybS1jb250cm9sJyBhbyBjYW1wbyBkZSBwZXNxdWlzYQ0KDQo8L3NjcmlwdD4NCiAgICA8IS0tIHBhZ2UtY29udGVudCIgLS0+DQo8L2Rpdj4NCjwhLS0gQ2FkYXN0cm8gSW5pY2lvIC0tPg0KPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNhZGFzdHJvIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkFkaWNpb25hciBDb250ZcO6ZG88L2g1Pg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkZlY2hhciI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBzdHlsZT0ibWF4LWhlaWdodDo0NjBweDsgb3ZlcmZsb3cteTphdXRvOyI+DQogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImNhZGFzdHJvLWZvcm0iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vbWU6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ibm9tZSIgcGxhY2Vob2xkZXI9Ik5vbWUgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TG9nbzo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJsb2dvIiBwbGFjZWhvbGRlcj0iTGluayBkYSBJbWFnZW0iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlVybDo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJsaW5rIiBwbGFjZWhvbGRlcj0iVXJsIGRvIExpbmsiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ic2lub3BzZSIgcGxhY2Vob2xkZXI9IlNpbm9wc2UgZG8gQ29udGXDumRvIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DYXRlZ29yw61hOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWwtMCByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJzZWxlY3RwaWNrZXIiIHRpdGxlPSJDYXRlZ29yaWEiIG5hbWU9ImNhdGVnb3JpYSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRjYXRlZ29yaWFzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkY2F0ZWdvcmlhcyBhcyAkY2F0ZWdvcmlhKSB7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD89ICRjYXRlZ29yaWFbJ2lkJ10/PiIgPiA8Pz0gJGNhdGVnb3JpYVsnbm9tZSddPz4gPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPg0KCQkJCTxidXR0b24gdHlwZT0ic3VibWl0IiBmb3JtPSJjYWRhc3Ryby1mb3JtIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5BZGljaW9uYXI8L2J1dHRvbj4NCgkJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5GZWNoYXI8L2J1dHRvbj4NCgkJCTwvZGl2PiAgICAgICAgICAgIA0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KPCEtLSBDYWRhc3RybyBGaW0tLT4NCjwhLS0gUmVtb3ZlIEluaWNpbyAtLT4NCjxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJyZW1vdmVyIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPlRlbSBjZXJ0ZXphPzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgaWQ9InJlbW92ZXItY29udGV1ZG8iIGNsYXNzPSJtb2RhbC1ib2R5Ij48L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQo8L2Rpdj4NCjwhLS0gUmVtb3ZlIEZpbS0tPg0KPCEtLSBFZGl0YSBJbmljaW8gLS0+DQo8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZWRpdGFyIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDYWRhc3RyYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBkYXRhLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEta2V5Ym9hcmQ9ImZhbHNlIj4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkVkaXRhciBDb250ZcO6ZG88L2g1Pg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkZlY2hhciI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBzdHlsZT0ibWF4LWhlaWdodDo0NjBweDsgb3ZlcmZsb3cteTphdXRvOyI+DQogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImVkaXRhci1mb3JtIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkIiBpZD0iaWRFIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Ob21lOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJub21lRSIgbmFtZT0ibm9tZSIgcGxhY2Vob2xkZXI9Ik5vbWUgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TG9nbzo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0ibG9nb0UiIG5hbWU9ImxvZ28iIHBsYWNlaG9sZGVyPSJMaW5rIGRhIEltYWdlbSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VXJsOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJsaW5rRSIgbmFtZT0ibGluayIgcGxhY2Vob2xkZXI9IlVybCBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DYXRlZ29yw61hOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWwtMCByb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJzZWxlY3RwaWNrZXIiIHRpdGxlPSJDYXRlZ29yw61hIiBpZD0iY2F0ZWdvcmlhRSIgbmFtZT0iY2F0ZWdvcmlhIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCAgaWYgKCRjYXRlZ29yaWFzKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGNhdGVnb3JpYXMgYXMgJGNhdGVnb3JpYSkgez8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/PSAkY2F0ZWdvcmlhWydpZCddPz4iID4gPD89ICRjYXRlZ29yaWFbJ25vbWUnXT8+IDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4NCgkJCQk8YnV0dG9uIHR5cGU9InN1Ym1pdCIgZm9ybT0iZWRpdGFyLWZvcm0iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkVkaXRhcjwvYnV0dG9uPg0KCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPg0KCQkJPC9kaXY+ICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KPC9kaXY+DQo8IS0tIEVkaXRhIEZpbS0tPg0KPC9ib2R5Pg0KPHNjcmlwdD4NCiAgICBmdW5jdGlvbiByZW1vdmVyQ29uZmlybWEoaWQsbm9tZSkgew0KICAgICAgICAkKCcjcmVtb3Zlci1jb250ZXVkbycpLmh0bWwoJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRhbmdlciIgcm9sZT0iYWxlcnQiPjxzdHJvbmc+IFJlbW92ZXIgPC9zdHJvbmc+JyArIG5vbWUgKyAnPzwvZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgZmxvYXQtcmlnaHQiIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5GZWNoYXI8L2J1dHRvbj48YnV0dG9uIG9uY2xpY2s9InJlbW92ZXIoJyArIGlkICsgJykiIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGZsb2F0LXJpZ2h0Ij5SZW1vdmVyPC9idXR0b24+Jyk7DQogICAgICAgICQoJyNyZW1vdmVyJykubW9kYWwoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gZWRpdGFyQ29uZmlybWEoaWQsbm9tZSwgbG9nbywgbGluaywgY2F0ZWdvcmlhKSB7DQogICAgICAgICQoJyNpZEUnKS52YWwoaWQpOw0KICAgICAgICAkKCcjbm9tZUUnKS52YWwobm9tZSk7DQogICAgICAgICQoJyNsb2dvRScpLnZhbChsb2dvKTsNCiAgICAgICAgJCgnI2xpbmtFJykudmFsKGxpbmspOw0KICAgICAgICBpZiAoY2F0ZWdvcmlhICE9PSAiIikgew0KICAgICAgICAgICQoJyNjYXRlZ29yaWFFJykudmFsKGNhdGVnb3JpYSk7DQogICAgICAgICAgJCgnI2NhdGVnb3JpYUUnKS5zZWxlY3RwaWNrZXIoJ3JlbmRlcicpOw0KICAgICAgICB9DQogICAgICAgICQoJyNlZGl0YXInKS5tb2RhbCgpOw0KICAgIH0NCiAgICBmdW5jdGlvbiByZW1vdmVyKGlkKSB7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICB1cmw6ICJjb250cm9sZXMvcmVtb3Zlci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiB7aWQ6IGlkfSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjcmVtb3ZlciIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KICAgICQoICIjY2FkYXN0cm8tZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2FkaWNpb25hci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjY2FkYXN0cm8tZm9ybSIpLnNlcmlhbGl6ZSgpLA0KICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICAgICAgICAgICQoIiNjYWRhc3RybyIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsNCiAgICAgICAgICAgICAgcmVzdWx0YWRvKGRhdGEucmVzcG9uc2VUZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgfSk7DQogICAgJCggIiNlZGl0YXItZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2VkaXRhci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjZWRpdGFyLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjZWRpdGFyIikubW9kYWwoJ2hpZGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhX3RhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2luYV9hdHVhbCA9IGRhdGFfdGFibGUucGFnZSgpOyAvLyBBcm1hemVuYSBhIHDDoWdpbmEgYXR1YWwNCiAgICAgICAgICAgICAgICAgICAgLy8gQXR1YWxpemEgYSB0YWJlbGENCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5kcmF3KCk7DQogICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhdXJhIGEgcMOhZ2luYSBhcMOzcyBhIGF0dWFsaXphw6fDo28NCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5wYWdlKHBhZ2luYV9hdHVhbCkuZHJhdygncGFnZScpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICByZXN1bHRhZG8oZGF0YS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICB9KTsNCiAgICBzcGVlZF90b190b3AgPSAxMDAwOyAgIA0KICAgICQoJyN0b3RvcCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7DQogICAgICAgICAgICBzY3JvbGxUb3A6IDANCiAgICAgICAgfSwgc3BlZWRfdG9fdG9wKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0pOw0KICAgICQoJyN0b3RvcCcpLmhpZGUoKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKCQodGhpcykuc2Nyb2xsVG9wKCkgPiA1MCkgew0KICAgICAgICAgICAgJCgnI3RvdG9wJykuZmFkZUluKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkKCcjdG90b3AnKS5mYWRlT3V0KCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KPC9zY3JpcHQ+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

Variables

None

Stats

MD5 8eb6d5b700c9de9e619440c1fab8823a
Eval Count 1
Decode Time 347 ms