<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>Elasticsearch-FAQ</Name>
    <Version>11.0.3</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.de/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-24 09:44:26" Version="11.0.3">Fix ES-CustomerSearch. Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2026-02-05 10:02:30" Version="11.0.2">Activate also for the customer interface. Update to OTOBO 11.0.15.</ChangeLog>
    <ChangeLog Date="2025-09-11 07:58:04" Version="11.0.1">Initial Release.</ChangeLog>
    <Description Lang="en">The OTOBO FAQ Package enhanced with Elasticsearch.</Description>
    <Framework>11.0.x</Framework>
    <IntroInstall Lang="en" Title="Initial FAQ items indexation" Type="post">

        &lt;br/&gt;
        Please execute the console command &quot;bin/otobo.Console.pl Maint::Elasticsearch::Migration --target f&quot;&lt;br/&gt;

    </IntroInstall>
    <PackageRequired Version="11.0.1">FAQ</PackageRequired>
    <CodeInstall Type="post">

        # create the package name
        my $CodeModule = 'var::packagesetup::ElasticsearchFAQ';

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeInstall();
    </CodeInstall>
    <CodeUninstall Type="pre">

        # create the package name
        my $CodeModule = 'var::packagesetup::ElasticsearchFAQ';

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildCommitID>4776d97a699ee9b6a9211b82db3630ac27ccde47</BuildCommitID>
    <BuildDate>2026-04-24 09:44:30</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AgentElasticsearchQuickResult.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRFbGFzdGljc2VhcmNoUXVpY2tSZXN1bHQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0OwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UT0JPOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0IC0gdGlja2V0IHNlYXJjaCB2aWEgRWxhc3RpY3NlYXJjaAoKPWhlYWQxIERFU0NSSVBUSU9OCgpBZ2VudEVsYXN0aWNzZWFyY2hRdWlja1Jlc3VsdCByZXR1cm5zIG4tbnVtYmVyIG9mIHRpY2tldHMsIGN1c3RvbWVyLCBhbmQgY3VzdG9tZXIgdXNlciAoZGVmaW5lZCBieSB0aGUgc3lzY29uZmlnKSBmcm9tIHRoZSBFUy1xdWVyeSBzb3J0ZWQgYnkgZGVzY2VuZGluZyBhZ2UKCj1oZWFkMiBuZXcoKQoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKUXVpY2tzZWFyY2ggcmVzdWx0IGlzIHVwZGF0ZWQgdmlhIEFKQVguCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgbXkgJEVTT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJyk7CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaFVwZGF0ZScgKSB7CgogICAgICAgIG15ICRTZWFyY2hPYmplY3RzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpRdWlja1NlYXJjaFNob3cnKTsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICMgY2hlY2sgbW9kdWxlIHBlcm1pc3Npb25zIHRvIGRldGVybWluZSB3aGV0aGVyIHJlc3VsdHMgY2FuIGJlIHNob3duCiAgICAgICAgbXkgJVBlcm1pc3Npb247CiAgICAgICAgTU9EVUxFOgojIFJvdGhlciBPU1MgLyBFbGFzdGljc2VhcmNoLUZBUQojICAgICAgICBmb3IgbXkgJE1vZHVsZSAocXcvQWdlbnRUaWNrZXRab29tIEFnZW50Q3VzdG9tZXJJbmZvcm1hdGlvbkNlbnRlciBBZ2VudEN1c3RvbWVyVXNlckluZm9ybWF0aW9uQ2VudGVyIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLykgewogICAgICAgIGZvciBteSAkTW9kdWxlIChxdy9BZ2VudFRpY2tldFpvb20gQWdlbnRDdXN0b21lckluZm9ybWF0aW9uQ2VudGVyIEFnZW50Q3VzdG9tZXJVc2VySW5mb3JtYXRpb25DZW50ZXIgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gQWdlbnRGQVFab29tLykgewojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgICAgIG15ICRNb2R1bGVSZWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRNb2R1bGV9OwoKICAgICAgICAgICAgIyBtb2R1bGUgaXMgbm90IGNvbmZpZ3VyZWQKICAgICAgICAgICAgaWYgKCAhJE1vZHVsZVJlZyApIHsKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9ueyRNb2R1bGV9ID0gMDsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHJlZiAkTW9kdWxlUmVnLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkTW9kdWxlUmVnLT57R3JvdXBSb30gfQogICAgICAgICAgICAgICAgJiYgcmVmICRNb2R1bGVSZWctPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkTW9kdWxlUmVnLT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBlcm1pc3Npb257JE1vZHVsZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJEFjY2Vzc1JvOwogICAgICAgICAgICAgICAgbXkgJEFjY2Vzc1J3OwogICAgICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICAgICAgICAgUEVSTUlTU0lPTjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRHcm91cCAgICA9ICRNb2R1bGVSZWctPnskUGVybWlzc2lvbn07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQRVJNSVNTSU9OIGlmICEkR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCByZWYgJEdyb3VwIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIElOTkVSOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoIEB7JEdyb3VwfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSU5ORVIgaWYgISRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IElOTkVSIGlmICEkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2Vzc09rID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgSU5ORVI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2Vzc09rID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIGVxICdHcm91cCcgJiYgJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzUm8gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzUncgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyAmJiAkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3NSbyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAoICEkQWNjZXNzUm8gJiYgISRBY2Nlc3NSdyApIHx8ICggISRBY2Nlc3NSbyAmJiAkQWNjZXNzUncgKSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGVybWlzc2lvbnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9iamVjdHMKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKIyAgICAgICAgbXkgKCBAVGlja2V0SURzLCBAQ3VzdG9tZXJLZXlzLCBAQ3VzdG9tZXJVc2VyS2V5cywgQENvbmZpZ0l0ZW1zICk7CiAgICAgICAgbXkgKCBAVGlja2V0SURzLCBAQ3VzdG9tZXJLZXlzLCBAQ3VzdG9tZXJVc2VyS2V5cywgQENvbmZpZ0l0ZW1zLCBARkFRcyApOwojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgaWYgKCAkU2VhcmNoT2JqZWN0cy0+e1RpY2tldH0gJiYgJFNlYXJjaE9iamVjdHMtPntUaWNrZXR9e0NvdW50fSAmJiAkUGVybWlzc2lvbntBZ2VudFRpY2tldFpvb219ICkgewoKICAgICAgICAgICAgIyBTZWFyY2ggdGlja2V0IGJ5IEVTIHNvcnQgYnkgYWdlLiBTaG93ICRTaXplIHJlc3VsdHMgKGRlZmF1bHQgdG8gMTAgaW4gU3lzQ29uZmlnKQogICAgICAgICAgICBAVGlja2V0SURzID0gJEVTT2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBGdWxsdGV4dCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRnVsbHRleHRFUycgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExpbWl0ICAgID0+ICRTZWFyY2hPYmplY3RzLT57VGlja2V0fXtDb3VudH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICA9PiAnRlVMTCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWFyY2hPYmplY3RzLT57Q3VzdG9tZXJDb21wYW55fQogICAgICAgICAgICAmJiAkU2VhcmNoT2JqZWN0cy0+e0N1c3RvbWVyQ29tcGFueX17Q291bnR9CiAgICAgICAgICAgICYmICRQZXJtaXNzaW9ue0FnZW50Q3VzdG9tZXJJbmZvcm1hdGlvbkNlbnRlcn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBTZWFyY2ggY3VzdG9tZXIgYnkgRVMuCiAgICAgICAgICAgIEBDdXN0b21lcktleXMgPSAkRVNPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNlYXJjaCgKICAgICAgICAgICAgICAgIEZ1bGx0ZXh0ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGdWxsdGV4dEVTJyApLAogICAgICAgICAgICAgICAgTGltaXQgICAgPT4gJFNlYXJjaE9iamVjdHMtPntDdXN0b21lckNvbXBhbnl9e0NvdW50fSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWFyY2hPYmplY3RzLT57Q3VzdG9tZXJVc2VyfSAmJiAkU2VhcmNoT2JqZWN0cy0+e0N1c3RvbWVyVXNlcn17Q291bnR9ICYmICRQZXJtaXNzaW9ue0FnZW50Q3VzdG9tZXJVc2VySW5mb3JtYXRpb25DZW50ZXJ9ICkKICAgICAgICB7CiAgICAgICAgICAgICMgU2VhcmNoIGN1c3RvbWVyIHVzZXIgYnkgRVMuCiAgICAgICAgICAgIEBDdXN0b21lclVzZXJLZXlzID0gJEVTT2JqZWN0LT5DdXN0b21lclVzZXJTZWFyY2goCiAgICAgICAgICAgICAgICBGdWxsdGV4dCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRnVsbHRleHRFUycgKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgID0+ICRTZWFyY2hPYmplY3RzLT57Q3VzdG9tZXJVc2VyfXtDb3VudH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VhcmNoT2JqZWN0cy0+e0NvbmZpZ0l0ZW19ICYmICRTZWFyY2hPYmplY3RzLT57Q29uZmlnSXRlbX17Q291bnR9ICYmICRQZXJtaXNzaW9ue0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tfSApCiAgICAgICAgewogICAgICAgICAgICAjIFNlYXJjaCBjdXN0b21lciB1c2VyIGJ5IEVTLgogICAgICAgICAgICBAQ29uZmlnSXRlbXMgPSAkRVNPYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICAgICBGdWxsdGV4dCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRnVsbHRleHRFUycgKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgID0+ICRTZWFyY2hPYmplY3RzLT57Q29uZmlnSXRlbX17Q291bnR9LAogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0ZVTEwnLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICAgICBpZiAoICRTZWFyY2hPYmplY3RzLT57RkFRfSAmJiAkU2VhcmNoT2JqZWN0cy0+e0ZBUX17Q291bnR9ICYmICRQZXJtaXNzaW9ue0FnZW50RkFRWm9vbX0gKQogICAgICAgIHsKICAgICAgICAgICAgIyBTZWFyY2ggRkFRIGJ5IEVTLgogICAgICAgICAgICBARkFRcyA9ICRFU09iamVjdC0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgRnVsbHRleHQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Z1bGx0ZXh0RVMnICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICA9PiAkU2VhcmNoT2JqZWN0cy0+e0ZBUX17Q291bnR9LAogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0ZVTEwnLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBFbGFzdGljc2VhcmNoLUZBUQoKICAgICAgICAjIFN0YXJ0IHRvIGZpbGwgdGhlIGJsb2NrZGF0YSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAgaWYgKEBUaWNrZXRJRHMpIHsKICAgICAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICAgICAgICAgIG15ICVRdWV1ZXMgICAgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAwICk7CgogICAgICAgICAgICBmb3IgbXkgJEF0dHIgKCBAeyAkU2VhcmNoT2JqZWN0cy0+e1RpY2tldH17QXR0cmlidXRlc30gfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciA9PiAkU2VhcmNoT2JqZWN0cy0+e1RpY2tldH17QXR0cmlidXRlSGVhZGVyfXskQXR0cn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQmxvY2sgdGlja2V0IGRhdGEKICAgICAgICAgICAgZm9yIG15ICRUaWNrZXQgKEBUaWNrZXRJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAoICRUaWNrZXRJRCwgJFRpY2tldFBhcmFtICkgPSAoICV7JFRpY2tldH0gKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmRUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0ciAoIEB7ICRTZWFyY2hPYmplY3RzLT57VGlja2V0fXtBdHRyaWJ1dGVzfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHByZXBhcmUgc3BlY2lhbCBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXR0ciBlcSAnQWdlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFtLT57QWdlfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldFBhcmFtLT57QWdlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQXR0ciBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDcmVhdGVkRm9ybWF0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpRdWlja1NlYXJjaENyZWF0ZWRGb3JtYXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRDcmVhdGVkRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW0tPntDcmVhdGVkfSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFRpY2tldFBhcmFtLT57Q3JlYXRlZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKS0+Rm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAkQ3JlYXRlZEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQXR0ciBlcSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW0tPntRdWV1ZX0gPSAkVGlja2V0UGFyYW0tPntRdWV1ZX0gLy8gJFF1ZXVlc3sgJFRpY2tldFBhcmFtLT57UXVldWVJRH0gfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYmxvY2sgZW50cnkKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RW50cnknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRQYXJhbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5ICAgID0+ICRUaWNrZXRQYXJhbS0+eyRBdHRyfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoQEN1c3RvbWVyS2V5cykgewogICAgICAgICAgICBmb3IgbXkgJEF0dHIgKCBAeyAkU2VhcmNoT2JqZWN0cy0+e0N1c3RvbWVyQ29tcGFueX17QXR0cmlidXRlc30gfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbXBhbnlIZWFkZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgPT4gJFNlYXJjaE9iamVjdHMtPntDdXN0b21lckNvbXBhbnl9e0F0dHJpYnV0ZUhlYWRlcn17JEF0dHJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJsb2NrIGN1c3RvbWVyCiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJLZXkgKEBDdXN0b21lcktleXMpIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lckNvbXBhbnlEYXRhID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmRDdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRyICggQHsgJFNlYXJjaE9iamVjdHMtPntDdXN0b21lckNvbXBhbnl9e0F0dHJpYnV0ZXN9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgYmxvY2sgZW50cnkKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29tcGFueUVudHJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSAgICAgICA9PiAkQ3VzdG9tZXJDb21wYW55RGF0YXskQXR0cn0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKEBDdXN0b21lclVzZXJLZXlzKSB7CiAgICAgICAgICAgIGZvciBteSAkQXR0ciAoIEB7ICRTZWFyY2hPYmplY3RzLT57Q3VzdG9tZXJVc2VyfXtBdHRyaWJ1dGVzfSB9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJVc2VySGVhZGVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyID0+ICRTZWFyY2hPYmplY3RzLT57Q3VzdG9tZXJVc2VyfXtBdHRyaWJ1dGVIZWFkZXJ9eyRBdHRyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBCbG9jayBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyS2V5IChAQ3VzdG9tZXJVc2VyS2V5cykgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlcktleSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dHIgKCBAeyAkU2VhcmNoT2JqZWN0cy0+e0N1c3RvbWVyVXNlcn17QXR0cmlidXRlc30gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBibG9jayBlbnRyeQogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclVzZXJFbnRyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyS2V5ID0+ICRDdXN0b21lclVzZXJLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSAgICAgICAgICAgPT4gJEN1c3RvbWVyVXNlckRhdGF7JEF0dHJ9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChAQ29uZmlnSXRlbXMpIHsKICAgICAgICAgICAgZm9yIG15ICRBdHRyICggQHsgJFNlYXJjaE9iamVjdHMtPntDb25maWdJdGVtfXtBdHRyaWJ1dGVzfSB9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlnSXRlbUhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciA9PiAkU2VhcmNoT2JqZWN0cy0+e0NvbmZpZ0l0ZW19e0F0dHJpYnV0ZUhlYWRlcn17JEF0dHJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJsb2NrIHRpY2tldCBkYXRhCiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbSAoQENvbmZpZ0l0ZW1zKSB7CgogICAgICAgICAgICAgICAgbXkgKCAkQ29uZmlnSXRlbUlELCAkQ29uZmlnSXRlbVBhcmFtICkgPSAoICV7JENvbmZpZ0l0ZW19ICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBibG9jayBlbnRyaWVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dHIgKCBAeyAkU2VhcmNoT2JqZWN0cy0+e0NvbmZpZ0l0ZW19e0F0dHJpYnV0ZXN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZ0l0ZW1FbnRyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJENvbmZpZ0l0ZW1QYXJhbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5ICAgICAgICA9PiAkQ29uZmlnSXRlbVBhcmFtLT57JEF0dHJ9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgaWYgKEBGQVFzKSB7CiAgICAgICAgICAgIGZvciBteSAkQXR0ciAoIEB7ICRTZWFyY2hPYmplY3RzLT57RkFRfXtBdHRyaWJ1dGVzfSB9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRSGVhZGVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyID0+ICRTZWFyY2hPYmplY3RzLT57RkFRfXtBdHRyaWJ1dGVIZWFkZXJ9eyRBdHRyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBCbG9jayBGQVEgZGF0YQogICAgICAgICAgICBmb3IgbXkgJEZBUSAoQEZBUXMpIHsKCiAgICAgICAgICAgICAgICBteSAoICRGQVFJdGVtSUQsICRGQVFQYXJhbSApID0gKCAleyRGQVF9ICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkRkFRJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGJsb2NrIGVudHJpZXMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0ciAoIEB7ICRTZWFyY2hPYmplY3RzLT57RkFRfXtBdHRyaWJ1dGVzfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFFbnRyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRGQVFJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgPT4gJEZBUVBhcmFtLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgID0+ICRGQVFQYXJhbS0+eyRBdHRyfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCgogICAgICAgICMgQ3JlYXRlIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRFbGFzdGljc2VhcmNoUXVpY2tSZXN1bHQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0cyAgICAgICA9PiBzY2FsYXIgQFRpY2tldElEcywKICAgICAgICAgICAgICAgIENvbXBhbmllcyAgICAgPT4gc2NhbGFyIEBDdXN0b21lcktleXMsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJzID0+IHNjYWxhciBAQ3VzdG9tZXJVc2VyS2V5cywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1zICAgPT4gc2NhbGFyIEBDb25maWdJdGVtcywKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICAgICAgICAgICAgIEZBUXMgICAgICAgICAgPT4gc2NhbGFyIEBGQVFzLAojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICAjUmV0dXJuIEhUTUwtb3V0cHV0IGJhY2sgdG8gY2FsbGJhY2sgZnVuY3Rpb24gaW4gQ29yZS5VSS5FbGFzdGljc2VhcmNoLmpzCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdi8+JywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/CustomerElasticsearchQuickResult.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJFbGFzdGljc2VhcmNoUXVpY2tSZXN1bHQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0OwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UT0JPOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0IC0gdGlja2V0IHNlYXJjaCB2aWEgRWxhc3RpY3NlYXJjaAoKPWhlYWQxIERFU0NSSVBUSU9OCgpDdXN0b21lckVsYXN0aWNzZWFyY2hRdWlja1Jlc3VsdCByZXR1cm5zIG4tbnVtYmVyIG9mIHRpY2tldHMgKGRlZmluZWQgYnkgdGhlIHN5c2NvbmZpZykgZnJvbSB0aGUgRVMtcXVlcnkgc29ydGVkIGJ5IGRlc2NlbmRpbmcgYWdlCgo9aGVhZDIgbmV3KCkKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKClF1aWNrc2VhcmNoIHJlc3VsdCBpcyB1cGRhdGVkIHZpYSBBSkFYLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRFU09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RWxhc3RpY3NlYXJjaCcpOwogICAgbXkgJERpc2FibGVDb21wYW55VGlja2V0cyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJEaXNhYmxlQ29tcGFueVRpY2tldEFjY2VzcycpOwoKICAgIG15ICRTZWFyY2hPYmplY3RzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpRdWlja1NlYXJjaFNob3cnKTsKICAgIG15ICRDb3VudCAgICAgICAgID0gJFNlYXJjaE9iamVjdHMtPntUaWNrZXR9ID8gJFNlYXJjaE9iamVjdHMtPntUaWNrZXR9e0NvdW50fSA6IDA7CiAgICBteSAkRVNTdHJMZW5ndGggICA9IGxlbmd0aCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRnVsbHRleHRFUycgKTsKCiAgICAjIFN1YmFjdGlvbiBlcSBTZWFyY2hVcGRhdGUgaXMgcmV0dXJuZWQgYnkgb24gY2xpY2sgYW5kIG9uIGlucHV0IGV2ZW50cyBvZiB0aGUgRVNmdWxsdGV4dC1maWVsZC4gU2VlIENvcmUuVUkuRWxhc3RpY3NlYXJjaC5qcwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaFVwZGF0ZScgJiYgJEVTU3RyTGVuZ3RoID4gMSAmJiAkQ291bnQgKSB7CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgbXkgJFVybCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdVUkwnCiAgICAgICAgKTsKICAgICAgICBpZiAoICRVcmwgPX4gL0FjdGlvbj1DdXN0b21lckZBUS8gKSB7CgogICAgICAgICAgICAjIFNlYXJjaCBGQVEgYnkgRVMgc29ydCBieSBOdW1iZXIuIFNob3cgJFNpemUgcmVzdWx0cy4KICAgICAgICAgICAgbXkgQEZBUUlEcyA9ICRFU09iamVjdC0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgRnVsbHRleHQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGdWxsdGV4dEVTJyApLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgUmVzdWx0ICAgID0+ICdGVUxMJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFIZWFkZXInLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEZBUSAoQEZBUUlEcykgewogICAgICAgICAgICAgICAgbXkgKCAkRkFRSUQsICRGQVFQYXJhbSApID0gKCAleyRGQVF9ICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRUmVjb3JkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRkFRSUQgPT4gJEZBUUlELAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZEZBUU51bWJlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZBUUlEICAgICA9PiAkRkFRSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEZBUU51bWJlciA9PiAkRkFRUGFyYW0tPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkRkFRVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBGQVFJRCAgICA9PiAkRkFRSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEZBUVRpdGxlID0+ICRGQVFQYXJhbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDcmVhdGUgb3V0cHV0CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyRWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgI1JldHVybiBIVE1MLW91dHB1dCBiYWNrIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGluIENvcmUuVUkuRWxhc3RpY3NlYXJjaC5qcwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0IHx8ICcnLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICk7CgogICAgICAgIH0KIyBFTyBFbGFzdGljc2VhcmNoLUZBUQoKICAgICAgICAjIEFkZCBmaWx0ZXIgZm9yIGN1c3RvbWVyIGNvbXBhbnkgaWYgdGhlIGNvbXBhbnkgdGlja2V0cyBhcmUgbm90IGRpc2FibGVkLgogICAgICAgIG15ICVTZWxlY3Rpb247CiAgICAgICAgaWYgKCAhJERpc2FibGVDb21wYW55VGlja2V0cyApIHsKICAgICAgICAgICAgbXkgJUFjY2Vzc2libGVDdXN0b21lcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpLT5Hcm91cENvbnRleHRDdXN0b21lcnMoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxlY3Rpb257Q3VzdG9tZXJJRFJhd30gPSBbIGtleXMgJUFjY2Vzc2libGVDdXN0b21lcnMgXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxlY3Rpb257Q3VzdG9tZXJVc2VyTG9naW5SYXd9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIH0KCiAgICAgICAgIyBTZWFyY2ggdGlja2V0IGJ5IEVTIHNvcnQgYnkgYWdlLiBTaG93ICRTaXplIHJlc3VsdHMuCiAgICAgICAgbXkgQFRpY2tldElEcyA9ICRFU09iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAlU2VsZWN0aW9uLAogICAgICAgICAgICBGdWxsdGV4dCAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRnVsbHRleHRFUycgKSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gICAgID0+ICdybycsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdGVUxMJywKICAgICAgICApOwoKICAgICAgICAjIEJsb2NrIHRpY2tldCBkYXRhCiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEhlYWRlcicsCiAgICAgICAgKTsKIyBFTyBFbGFzdGljc2VhcmNoLUZBUQogICAgICAgIGZvciBteSAkVGlja2V0IChAVGlja2V0SURzKSB7CgogICAgICAgICAgICAjIHdlIG9ubHkgaGF2ZSBvbmUga2V5IGFuZCBvbmUgdmFsdWUgaW4gZWFjaCBhcnJheSBlbGVtZW50CiAgICAgICAgICAgIG15ICggJFRpY2tldElELCAkVGlja2V0UGFyYW0gKSA9ICggJXskVGlja2V0fSApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBZ2UgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXRQYXJhbS0+e0FnZX0sCiAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZFRpY2tldEFnZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFRpY2tldEFnZSA9PiAkQWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkVGlja2V0TnVtYmVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXRQYXJhbS0+e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZFRpY2tldFRpdGxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaXRsZSA9PiAkVGlja2V0UGFyYW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckVsYXN0aWNzZWFyY2hRdWlja1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICNSZXR1cm4gSFRNTC1vdXRwdXQgYmFjayB0byBjYWxsYmFjayBmdW5jdGlvbiBpbiBDb3JlLlVJLkVsYXN0aWNzZWFyY2guanMKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQgfHwgJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICc8ZGl2Lz4nLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentElasticsearchQuickResult.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudEVsYXN0aWNzZWFyY2hRdWlja1Jlc3VsdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgo8ZGl2IGNsYXNzPSJJbm5lckNvbnRlbnQiPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJFbGFzdGljc2VhcmNoUXVpY2tSZXN1bHQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZWRpcmVjdCIvPgoKWyUgSUYgRGF0YS5UaWNrZXRzICVdCiAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiVGlja2V0cyIpIHwgaHRtbCAgJV08L2gzPgogICAgICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCBOb0NlbGxzcGFjaW5nIj4KICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBuYW1lPSJPdmVydmlld0NvbnRyb2wiICB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuSGVhZGVyKSB8IGh0bWwgICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFRpY2tldCIpICVdCiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEVudHJ5IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgRGF0YS5FbnRyeSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEVudHJ5IikgJV0KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRUaWNrZXQiKSAlXQogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+ClslIEVORCAlXQoKWyUgSUYgRGF0YS5Db21wYW5pZXMgJV0KICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJDdXN0b21lcnMiKSB8IGh0bWwgICVdPC9oMz4KICAgICAgICA8dGFibGUgY2xhc3M9IlRhYmxlU21hbGwgTm9DZWxsc3BhY2luZyI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29tcGFueUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkhlYWRlcikgfCBodG1sICAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29tcGFueUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1c3RvbWVyIikgJV0KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29tcGFueUVudHJ5IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEN1c3RvbWVySW5mb3JtYXRpb25DZW50ZXI7Q3VzdG9tZXJJRD1bJSBEYXRhLkN1c3RvbWVyS2V5IHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lcktleSB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj5bJSBEYXRhLkVudHJ5IHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29tcGFueUVudHJ5IikgJV0KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXN0b21lciIpICVdCiAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgPC90YWJsZT4KWyUgRU5EICVdCgpbJSBJRiBEYXRhLkN1c3RvbWVyVXNlcnMgJV0KICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBVc2VycyIpIHwgaHRtbCAgJV08L2gzPgogICAgICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCBOb0NlbGxzcGFjaW5nIj4KICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lclVzZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBuYW1lPSJPdmVydmlld0NvbnRyb2wiICB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuSGVhZGVyKSB8IGh0bWwgICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyVXNlckhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEN1c3RvbWVyVXNlciIpICVdCiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyVXNlckVudHJ5IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEN1c3RvbWVyVXNlckluZm9ybWF0aW9uQ2VudGVyO0N1c3RvbWVyVXNlcklEPVslIERhdGEuQ3VzdG9tZXJVc2VyS2V5IHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lclVzZXJLZXkgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgRGF0YS5FbnRyeSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyVXNlckVudHJ5IikgJV0KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDdXN0b21lclVzZXIiKSAlXQogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+ClslIEVORCAlXQoKWyUgSUYgRGF0YS5Db25maWdJdGVtcyAlXQogICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIkNvbmZpZ0l0ZW1zIikgfCBodG1sICAlXTwvaDM+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJUYWJsZVNtYWxsIE5vQ2VsbHNwYWNpbmciPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbmZpZ0l0ZW1IZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBuYW1lPSJPdmVydmlld0NvbnRyb2wiICB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuSGVhZGVyKSB8IGh0bWwgICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbmZpZ0l0ZW1IZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDb25maWdJdGVtIikgJV0KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29uZmlnSXRlbUVudHJ5IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIERhdGEuRW50cnkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJDb25maWdJdGVtRW50cnkiKSAlXQogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENvbmZpZ0l0ZW0iKSAlXQogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+ClslIEVORCAlXQojIFJvdGhlciBPU1MgLyBFbGFzdGljc2VhcmNoLUZBUQpbJSBJRiBEYXRhLkZBUXMgJV0KICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJGQVFzIikgfCBodG1sICAlXTwvaDM+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJUYWJsZVNtYWxsIE5vQ2VsbHNwYWNpbmciPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkhlYWRlcikgfCBodG1sICAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkRkFRIikgJV0KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRRW50cnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50RkFRWm9vbTtJdGVtSUQ9WyUgRGF0YS5JdGVtSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIERhdGEuRW50cnkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFFbnRyeSIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRkFRIikgJV0KICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICA8L3RhYmxlPgpbJSBFTkQgJV0KIyBFTyBFbGFzdGljc2VhcmNoLUZBUQogICAgPC9mb3JtPgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerElasticsearchQuickResult.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lckVsYXN0aWNzZWFyY2hRdWlja1Jlc3VsdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgo8ZGl2IGNsYXNzPSJJbm5lckNvbnRlbnQiPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJFbGFzdGljc2VhcmNoUXVpY2tSZXN1bHQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZWRpcmVjdCIvPgogICAgICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCBOb0NlbGxzcGFjaW5nIj4KICAgICAgICAgICAgPHRoZWFkPgojIFJvdGhlck9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEhlYWRlciIpICVdCiMgRU8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIFRpY2tldE51bWJlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJUaWNrZXROdW1tZXIiPlRpY2tldCM8L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIFRpY2tldEFnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJUaWNrZXRBZ2UiPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciBUaWNrZXRUaXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJUaWNrZXRUaXRsZSI+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+CiMgUm90aGVyT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZBUUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciBGQVFOdW1iZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiICB0aXRsZT0iRkFRTnVtYmVyIj5bJSBUcmFuc2xhdGUoIkZBUSMiKSB8IGh0bWwgICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciBGQVFUaXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgIHRpdGxlPSJGQVFUaXRsZSI+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJGQVFIZWFkZXIiKSAlXQojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZCIpICVdCiAgICAgICAgICAgICAgICA8dHIgaWQ9IlRpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFRpY2tldE51bWJlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVGlja2V0TnVtYmVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFRpY2tldEFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSAgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj5bJSBEYXRhLlRpY2tldEFnZSAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVGlja2V0QWdlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFRpY2tldFRpdGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXSIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgRGF0YS5UaWNrZXRUaXRsZSAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVGlja2V0VGl0bGUiKSAlXQogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZCIpICVdCiMgUm90aGVyT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKWyUgUmVuZGVyQmxvY2tTdGFydCgiRkFRUmVjb3JkIikgJV0KICAgICAgICAgICAgICAgIDx0ciBpZD0iRkFRSURfWyUgRGF0YS5GQVFJRCB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkRkFRTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckZBUVpvb207SXRlbUlEPVslIERhdGEuRkFRSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIERhdGEuRkFRTnVtYmVyIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRkFRTnVtYmVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEZBUVRpdGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lckZBUVpvb207SXRlbUlEPVslIERhdGEuRkFRSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSAgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj5bJSBEYXRhLkZBUVRpdGxlICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRGQVFUaXRsZSIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRkFRUmVjb3JkIikgJV0KIyBFTyBFbGFzdGljc2VhcmNoLUZBUQogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+CiAgICA8L2Zvcm0+CjwvZGl2Pgo=</File>
        <File Location="Custom/Kernel/System/Console/Command/Maint/Elasticsearch/Migration.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNmEyNTZhMDAyOTA1NGJhY2M5NDZkMjdlMGRiZTUwOGYwMGU2NzQ2IC0gS2VybmVsL1N5c3RlbS9Db25zb2xlL0NvbW1hbmQvTWFpbnQvRWxhc3RpY3NlYXJjaC9NaWdyYXRpb24ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OkVsYXN0aWNzZWFyY2g6Ok1pZ3JhdGlvbjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIFRpbWU6OkhpUmVzKCk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkZvcmVhY2hUb0ZvcikKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJywKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICdLZXJuZWw6OlN5c3RlbTo6RkFRJywKIyBFTyBFbGFzdGljc2VhcmNoLUZBUQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UGFja2FnZScsCik7CgojIEluZm9ybSB0aGUgQ29kZVBvbGljeSBhYm91dCB0aGUgc29mdCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgaW50ZW50aW9uYWxseSBub3QgaW4gQE9iamVjdERlcGVuZGVuY2llcy4KIyBTb2Z0IGRlcGVuZGVuY2llcyBhcmUgbW9kdWxlcyB0aGF0IHVzZWQgYnkgdGhpcyBvYmplY3QsIGJ1dCB3aG8gZG9uJ3QgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGlzIG9iamVjdC4KIyBUaGVyZSBpcyBubyBuZWVkIHRvIGRpc2NhcmQgdGhpcyBtb2R1bGUgd2hlbiBvbmUgb2YgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIGlzIGRpc2NhcmRlZC4Kb3VyIEBTb2Z0T2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ01pZ3JhdGUgZXhpc3RpbmcgdGlja2V0cywgY3VzdG9tZXJzIGFuZCBjdXN0b21lciB1c2VycyB0byBFbGFzdGljc2VhcmNoLicpOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAndGFyZ2V0JywKICAgICAgICBEZXNjcmlwdGlvbiA9PgojIFJvdGhlciBPU1MgLyBFbGFzdGljc2VhcmNoLUZBUQojICAgICAgICAgICAgIlNwZWNpZnkgd2hpY2ggb2JqZWN0cyB3aWxsIGJlIG1pZ3JhdGVkLiB0OiBUaWNrZXRzOyB1OiBDdXN0b21lclVzZXJzOyBjOiBDdXN0b21lckNvbXBhbmllczsgaTogSVRTTUNvbmZpZ0l0ZW1zOyBmOiBGQVFzO0lmIG5vdCBzcGVjaWZpZWQsICd0dWNpJyAoYWxsIGZvdXIpIHdpbGwgYmUgaGFuZGxlZC4iLAogICAgICAgICAgICAiU3BlY2lmeSB3aGljaCBvYmplY3RzIHdpbGwgYmUgbWlncmF0ZWQuIHQ6IFRpY2tldHM7IHU6IEN1c3RvbWVyVXNlcnM7IGM6IEN1c3RvbWVyQ29tcGFuaWVzOyBpOiBJVFNNQ29uZmlnSXRlbXM7IGY6IEZBUXM7SWYgbm90IHNwZWNpZmllZCwgJ3R1Y2lmJyAoYWxsIGZpdmUpIHdpbGwgYmUgaGFuZGxlZC4iLAojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgUmVxdWlyZWQgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgPT4gMSwKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKIyAgICAgICAgVmFsdWVSZWdleCA9PiBxci9eW3R1Y2ldKyQvc214LAogICAgICAgIFZhbHVlUmVnZXggPT4gcXIvXlt0dWNpZl0rJC9zbXgsCiMgRU8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdtaWNyby1zbGVlcCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNwZWNpZnkgbWljcm9zZWNvbmRzIHRvIHNsZWVwIGFmdGVyIGV2ZXJ5IHRpY2tldCB0byByZWR1Y2Ugc3lzdGVtIGxvYWQgKGUuZy4gMTAwMCkuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvXlxkKyQvc214LAogICAgKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3VzZS1jdXN0b21lci1iYXRjaGVzJywKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAiU29tZSBMREFQIG9yIEFEIHNlcnZlcnMgbGltaXQgdGhlIHJldHVybiBvZiByZXN1bHRzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHN0aWxsIGdldCBhbGwgdGhlIHJlc3VsdHMgYnkgc3BsaXR0aW5nIHRoZSBxdWVyaWVzLiAxOiBzcGxpdHMgdGhlIHF1ZXJpZXMgaW50byBzZWFyY2hlcyBmb3IgYS16LCBhMC16OSwgMC05LiAyOiBhYS16eiwgYTAtejkgYW5kIDAtOS4iLAogICAgICAgIFJlcXVpcmVkICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCA9PiBxci9eXGQkL3NteCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGV0aGVyIGVsYXN0aWMgc2VhcmNoIHdlYiBzZXJ2aWNlIGlzIGVuYWJsZWQgYW5kIGlmIG5vdCwgYWN0aXZhdGUgaXQKICAgIG15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKCiAgICBteSAkRVNXZWJzZXJ2aWNlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VHZXQoCiAgICAgICAgTmFtZSA9PiAnRWxhc3RpY3NlYXJjaCcsCiAgICApOwoKICAgIGlmICggISRFU1dlYnNlcnZpY2UgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSBub3QgZm91bmQhIFVuYWJsZSB0byBjb250aW51ZS48L3JlZD5cbiIpOwogICAgICAgIGRpZTsKICAgIH0KCiAgICBpZiAoICRFU1dlYnNlcnZpY2UtPntWYWxpZElEfSAhPSAxICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+RWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlIGlzIG5vdyBhY3RpdmF0ZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIGtlZXAgaXQgZW5hYmxlZCwgcGxlYXNlIGRpc2FibGUgaXQgbWFudWFsbHkgaW4gdGhlIGFkbWluIGludGVyZmFjZSwgYWZ0ZXIgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgICAgIG15ICRTdWNjZXNzID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgICV7JEVTV2Vic2VydmljZX0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+RWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlIGNvdWxkIG5vdCBiZSBhY3RpdmF0ZWQhIFVuYWJsZSB0byBjb250aW51ZS48L3JlZD5cbiIpOwogICAgICAgICAgICBkaWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRFU09iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2gnKTsKICAgIG15ICRDb25maWcgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpBcnRpY2xlSW5kZXhDcmVhdGlvblNldHRpbmdzJyk7CiAgICBteSAkQ29uZmlnSW5kZXhTZXR0aW5ncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6SW5kZXhTZXR0aW5ncycpOwogICAgbXkgJEluZGV4VGVtcGxhdGVzICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkluZGV4VGVtcGxhdGUnKTsKCiAgICAjIHByZWZlciBFbGFzdGljc2VhcmNoOjpJbmRleFNldHRpbmdzIyMjRGVmYXVsdCBvdmVyIEVsYXN0aWNzZWFyY2g6OkFydGljbGVJbmRleENyZWF0aW9uU2V0dGluZ3MKICAgIGlmICggJENvbmZpZ0luZGV4U2V0dGluZ3MgJiYgJENvbmZpZ0luZGV4U2V0dGluZ3MtPntEZWZhdWx0fSApIHsKICAgICAgICAkQ29uZmlnID0gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntEZWZhdWx0fTsKICAgIH0KCiAgICAjIHRlc3QgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlcgogICAgaWYgKCAhJEVTT2JqZWN0LT5UZXN0Q29ubmVjdGlvbigpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5Db25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiMgICAgbXkgJFRhcmdldHMgICAgICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ3RhcmdldCcpIHx8ICd0dWNpJzsKICAgIG15ICRUYXJnZXRzICAgICAgICAgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCd0YXJnZXQnKSB8fCAndHVjaWYnOwojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICBteSAkTWljcm9TbGVlcCAgICAgICAgID0gJFNlbGYtPkdldE9wdGlvbignbWljcm8tc2xlZXAnKTsKICAgIG15ICRDdXN0b21lckxpbWl0TGV2ZWwgPSAkU2VsZi0+R2V0T3B0aW9uKCd1c2UtY3VzdG9tZXItYmF0Y2hlcycpIHx8ICcwJzsKCiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiMgICAgaWYgKCAkVGFyZ2V0cyA9fiBtL3R8aS8gKSB7CiAgICBpZiAoICRUYXJnZXRzID1+IG0vdHxpfGYvICkgewojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgJFNlbGYtPkNyZWF0ZUF0dGFjaG1lbnRQaXBlbGluZSgKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkNyZWF0ZVRtcEF0dGFjaG1lbnRzSW5kZXgoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntUbXBBdHRhY2htZW50c30gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57VG1wQXR0YWNobWVudHN9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRUYXJnZXRzID1+IG0vYy8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDb21wYW5pZXMoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntDdXN0b21lcn0gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57Q3VzdG9tZXJ9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvdS8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDdXN0b21lclVzZXJzKAogICAgICAgICAgICBFU09iamVjdCAgID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e0N1c3RvbWVyVXNlcn0gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgICA9PiAkSW5kZXhUZW1wbGF0ZXMtPntDdXN0b21lclVzZXJ9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgICAgPT4gJE1pY3JvU2xlZXAsCiAgICAgICAgICAgIExpbWl0TGV2ZWwgPT4gJEN1c3RvbWVyTGltaXRMZXZlbAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvdC8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVUaWNrZXRzKAogICAgICAgICAgICBFU09iamVjdCA9PiAkRVNPYmplY3QsCiAgICAgICAgICAgIENvbmZpZyAgID0+ICRDb25maWdJbmRleFNldHRpbmdzLT57VGlja2V0fSAvLyAkQ29uZmlnLAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZXMtPntUaWNrZXR9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvaS8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDb25maWdJdGVtcygKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICAgICBDb25maWcgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e0NvbmZpZ0l0ZW19IC8vICRDb25maWcsCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlcy0+e0NvbmZpZ0l0ZW19ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICBpZiAoICRUYXJnZXRzID1+IC9mLyApIHsKICAgICAgICAkU2VsZi0+TWlncmF0ZUZBUXMoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntGQVF9ICAgLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57Q29uZmlnSXRlbX0gLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgRU8gRWxhc3RpY3NlYXJjaC1GQVEKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgpzdWIgQ3JlYXRlQXR0YWNobWVudFBpcGVsaW5lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXR1cCB0aGUgYXR0YWNobWVudCBwaXBlbGluZQogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5EZWxldGVQaXBlbGluZSgpOwoKICAgIG15ICVQaXBlbGluZSA9ICgKICAgICAgICBkZXNjcmlwdGlvbiA9PiAiRXh0cmFjdCBleHRlcm5hbCBhdHRhY2htZW50IGluZm9ybWF0aW9uIiwKICAgICAgICBwcm9jZXNzb3JzICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggPT4gewogICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICA9PiAiQXR0YWNobWVudHMiLAogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2ZpZWxkID0+ICJfaW5nZXN0Ll92YWx1ZS5hdHRhY2htZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICAgICA9PiAiX2luZ2VzdC5fdmFsdWUuZGF0YSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgID0+ICJBdHRhY2htZW50cyIsCiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0+ICJfaW5nZXN0Ll92YWx1ZS5kYXRhIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZVBpcGVsaW5lKAogICAgICAgIFJlcXVlc3QgPT4gXCVQaXBlbGluZSwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+QXR0YWNobWVudCBwaXBlbGluZSBzZXQgdXAuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkF0dGFjaG1lbnQgcGlwZWxpbmUgY291bGQgbm90IGJlIHNldCB1cCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIENyZWF0ZVRtcEF0dGFjaG1lbnRzSW5kZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgIGluZGV4ID0+ICd0bXBhdHRhY2htZW50cycsCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+VGhlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlRlbXBvcmFyeSBhdHRhY2htZW50cyBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5UZW1wb3JhcnkgYXR0YWNobWVudHMgaW5kZXggY291bGQgbm90IGJlIGNyZWF0ZWQhPC9yZWQ+XG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIE1pZ3JhdGVDb21wYW5pZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgbXkgJUN1c3RvbWVyQ29tcGFueUxpc3QgICA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgTGltaXQgPT4gMCwKICAgICk7CgogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAnY3VzdG9tZXInLAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlRoZSBwcmV2aW91cyBlcnJvciBtZXNzYWdlcyBhcmUgbGlrZWx5IHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIGRyb3AgYSBub25leGlzdGVudCBpbmRleCBhbmQgY2FuIHRoZW4gYmUgaWdub3JlZC48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRJbmRleFNldHRpbmdzID0gJFBhcmFte0VTT2JqZWN0fS0+SW5kZXhTZXR0aW5nc0dldCglUGFyYW0pOwogICAgaWYgKCAhJEluZGV4U2V0dGluZ3MgKSB7CgogICAgICAgICMgRXJyb3IgaXMgc2hvd24gaW4gSW5kZXhTZXR0aW5nc0dldAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgIHNldHRpbmdzID0+ICRJbmRleFNldHRpbmdzLAogICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0LAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5DdXN0b21lciBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5DdXN0b21lciBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkN1c3RvbWVyQ29tcGFueVN0b3JlRmllbGRzJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93Pk5vIEN1c3RvbWVyQ29tcGFueVN0b3JlRmllbGRzIGFyZSBkZWZpbmVkLjwveWVsbG93PlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRDb3VudCAgICAgICAgID0gMDsKICAgIG15ICRDdXN0b21lckNvdW50ID0gc2NhbGFyIGtleXMgJUN1c3RvbWVyQ29tcGFueUxpc3Q7CgogICAgbXkgJEVycm9ycyA9IDA7CiAgICBDVVNUT01FUklEOgogICAgZm9yIG15ICRDdXN0b21lcklEICggc29ydCBrZXlzICVDdXN0b21lckNvbXBhbnlMaXN0ICkgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGNvbXBhbnkgaW4gRWxhc3RpY3NlYXJjaAogICAgICAgIGlmICggISRQYXJhbXtFU09iamVjdH0tPkN1c3RvbWVyQ29tcGFueUFkZCggQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCApICkgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSA1MDAgPT0gMCApIHsKICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSBpbnQoICRDb3VudCAvICggJEN1c3RvbWVyQ291bnQgLyAxMDAgKSApOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAiPHllbGxvdz4kQ291bnQ8L3llbGxvdz4gb2YgPHllbGxvdz4kQ3VzdG9tZXJDb3VudDwveWVsbG93PiBwcm9jZXNzZWQgKDx5ZWxsb3c+JFBlcmNlbnQgJTwveWVsbG93PiBkb25lKS5cbiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIFRpbWU6OkhpUmVzOjp1c2xlZXAoICRQYXJhbXtTbGVlcH0gKSBpZiAkUGFyYW17U2xlZXB9OwogICAgfQoKICAgIGlmICgkRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkN1c3RvbWVyQ29tcGFueSB0cmFuc2ZlciBjb21wbGV0ZS4gJEVycm9ycyBlcnJvcihzKSBvY2N1cnJlZCE8L3llbGxvdz5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q3VzdG9tZXJDb21wYW55IHRyYW5zZmVyIGNvbXBsZXRlLiBUcmFuc2ZlcnJlZCAkQ291bnQgY29tcGFuaWVzLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIE1pZ3JhdGVDdXN0b21lclVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgbXkgJEN1c3RvbWVyTGltaXRMZXZlbCA9ICRQYXJhbXtMaW1pdExldmVsfTsKCiAgICAjIE5vIHNwZWNpYWwgc2VhcmNoLCBzZWFyY2ggYWxsIGN1c3RvbWVycyB0b2dldGhlcgogICAgaWYgKCAkQ3VzdG9tZXJMaW1pdExldmVsID09IDAgKSB7CiAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICcqJywKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgIExpbWl0ICA9PiA0XzAwMF8wMDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJEN1c3RvbWVyTGltaXRMZXZlbCA+PSAxICkgewoKICAgICAgICAjIFNlYXJjaCB3aXRoIEN1c3RvbWVyVXNlckxpbWl0IHggYS4uegogICAgICAgIGZvciBteSAkTGV0dGVyICggImEiIHggJEN1c3RvbWVyTGltaXRMZXZlbCAuLiAieiIgeCAkQ3VzdG9tZXJMaW1pdExldmVsLCAnYTAnIC4uICd6OScsICcwJyAuLiAnOScgKSB7CgogICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAiPGdyZWVuPlNlYXJjaCBmb3IgYWxsIGN1c3RvbWVydXNlciBsaWtlOiAkTGV0dGVyKi48L2dyZWVuPlxuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3ROZXcgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkTGV0dGVyIC4gJyonLAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICAgICBMaW1pdCAgPT4gNF8wMDBfMDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAoICVDdXN0b21lclVzZXJMaXN0LCAlQ3VzdG9tZXJVc2VyTGlzdE5ldyApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgIGluZGV4ID0+ICdjdXN0b21lcnVzZXInLAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZQogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+UHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkN1c3RvbWVyVXNlciBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5DdXN0b21lclVzZXIgaW5kZXggY291bGQgbm90IGJlIGNyZWF0ZWQhPC9yZWQ+XG4iKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyByZXR1cm4gaWYgbm8gU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJVc2VyU3RvcmVGaWVsZHMnKSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gQ3VzdG9tZXJVc2VyU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQuPC95ZWxsb3c+XG4iKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkQ291bnQgICAgICAgICAgICAgPSAwOwogICAgbXkgJEN1c3RvbWVyVXNlckNvdW50ID0gc2NhbGFyIGtleXMgJUN1c3RvbWVyVXNlckxpc3Q7CgogICAgbXkgJEVycm9ycyA9IDA7CiAgICBDVVNUT01FUlVTRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CgogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGNyZWF0ZSB0aGUgY3VzdG9tZXIgdXNlciBpbiBFbGFzdGljc2VhcmNoCiAgICAgICAgaWYgKCAhJFBhcmFte0VTT2JqZWN0fS0+Q3VzdG9tZXJVc2VyQWRkKCBVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcklEICkgKSB7CiAgICAgICAgICAgICRFcnJvcnMrKzsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsbHkgc2xlZXAKICAgICAgICBpZiAoICRDb3VudCAlIDUwMCA9PSAwICkgewogICAgICAgICAgICBteSAkUGVyY2VudCA9IGludCggJENvdW50IC8gKCAkQ3VzdG9tZXJVc2VyQ291bnQgLyAxMDAgKSApOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAiPHllbGxvdz4kQ291bnQ8L3llbGxvdz4gb2YgPHllbGxvdz4kQ3VzdG9tZXJVc2VyQ291bnQ8L3llbGxvdz4gcHJvY2Vzc2VkICg8eWVsbG93PiRQZXJjZW50ICU8L3llbGxvdz4gZG9uZSkuXG4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBUaW1lOjpIaVJlczo6dXNsZWVwKCAkUGFyYW17U2xlZXB9ICkgaWYgJFBhcmFte1NsZWVwfTsKICAgIH0KCiAgICBpZiAoJEVycm9ycykgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5DdXN0b21lclVzZXIgdHJhbnNmZXIgY29tcGxldGUuICRFcnJvcnMgZXJyb3Iocykgb2NjdXJyZWQhPC95ZWxsb3c+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkN1c3RvbWVyVXNlciB0cmFuc2ZlciBjb21wbGV0ZS4gVHJhbnNmZXJyZWQgJENvdW50IGN1c3RvbWVyIHVzZXJzLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIE1pZ3JhdGVUaWNrZXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICBteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICApOwoKICAgICMgRHJvcCBleGlzdGluZyB0aWNrZXQgaW5kZXgKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ3RpY2tldCcsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlRpY2tldCBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5UaWNrZXQgaW5kZXggY291bGQgbm90IGJlIGNyZWF0ZWQhPC9yZWQ+XG4iKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyByZXR1cm4gaWYgbm8gU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6VGlja2V0U3RvcmVGaWVsZHMnKSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gVGlja2V0U3RvcmVGaWVsZHMgYXJlIGRlZmluZWQuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJENvdW50ICAgICA9IDA7CiAgICBteSAkUGVyY2VudDEwID0gKCBzb3J0IHsgJGEgPD0+ICRiIH0gKCAxMCwgaW50KCAkI1RpY2tldElEcyAvIDEwICkgKSApWzFdOwogICAgbXkgJFBlcmNlbnQxICA9ICggc29ydCB7ICRhIDw9PiAkYiB9ICggMSwgIGludCggJCNUaWNrZXRJRHMgLyAxMDAgKSApIClbMV07CgogICAgaWYgKCAkI1RpY2tldElEcyA+IDEwMCApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlRpY2tldHMgYXJlIHRyYW5zZmVyZWQuIFRoaXMgY2FuIHRha2Ugc2V2ZXJhbCBob3VycywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdGlja2V0cy48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CgogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGNyZWF0ZSB0aGUgdGlja2V0CiAgICAgICAgaWYgKCAhJFBhcmFte0VTT2JqZWN0fS0+VGlja2V0Q3JlYXRlKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKSApIHsKICAgICAgICAgICAgJEVycm9ycysrOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgdGhlIGFydGljbGVzCiAgICAgICAgbXkgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlTGlzdCkgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVycm9ycysrIGlmICEkU3VjY2VzczsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsbHkgc2xlZXAKICAgICAgICBpZiAoICRDb3VudCAlICRQZXJjZW50MTAgPT0gMCApIHsKICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSBpbnQoICRDb3VudCAvICggJCNUaWNrZXRJRHMgLyAxMDAgKSApOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICAgICAiPHllbGxvdz4kQ291bnQ8L3llbGxvdz4gb2YgPHllbGxvdz4kI1RpY2tldElEczwveWVsbG93PiBwcm9jZXNzZWQgKDx5ZWxsb3c+JFBlcmNlbnQgJTwveWVsbG93PiBkb25lKS5cbiIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkI1RpY2tldElEcyA+IDUwICYmICRDb3VudCAlICRQZXJjZW50MSA9PSAwICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoJy4gJyk7CiAgICAgICAgICAgIHNlbGVjdCgpLT5mbHVzaCgpOyAgICAjIHNob3cgdGhlIGRvdCBpbW1lZGlhdGVseQogICAgICAgIH0KCiAgICAgICAgVGltZTo6SGlSZXM6OnVzbGVlcCggJFBhcmFte1NsZWVwfSApIGlmICRQYXJhbXtTbGVlcH07CiAgICB9CgogICAgaWYgKCRFcnJvcnMpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+VGlja2V0IHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VycmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5UaWNrZXQgdHJhbnNmZXIgY29tcGxldGUuIFRyYW5zZmVycmVkICRDb3VudCB0aWNrZXRzLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIE1pZ3JhdGVDb25maWdJdGVtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgd2hldGhlciBJVFNNQ29uZmlndXJhdGlvbk1hbmFnbWVudCBpcyBpbnN0YWxsZWQKICAgIG15ICRQYWNrYWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnKTsKICAgIG15ICRJc0luc3RhbGxlZCAgID0gJFBhY2thZ2VPYmplY3QtPlBhY2thZ2VJc0luc3RhbGxlZCgKICAgICAgICBOYW1lID0+ICdJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQnLAogICAgKTsKICAgIGlmICggISRJc0luc3RhbGxlZCApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Ta2lwcGluZyBJVFNNQ29uZmlnSXRlbXMgKElUU01Db25maWd1cmF0aW9uTWFuYWdtZW50IG5vdCBpbnN0YWxsZWQpLi4uPC9ncmVlbj5cbiIpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKICAgIG15ICRDbGFzc0xpc3QgICAgICAgICAgICA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICBteSAkRXhjbHVkZWRDbGFzc2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpFeGNsdWRlZENJQ2xhc3NlcycpOwogICAgJEV4Y2x1ZGVkQ2xhc3NlcyA9IHsgbWFwIHsgJF8gPT4gMSB9IEB7JEV4Y2x1ZGVkQ2xhc3Nlc30gfTsKCiAgICBteSBAQWN0aXZlQ2xhc3NlczsKICAgIENMQVNTOgogICAgZm9yIG15ICRDbGFzcyAoIGtleXMgJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICBuZXh0IENMQVNTIGlmICRFeGNsdWRlZENsYXNzZXMtPnskQ2xhc3N9OwogICAgICAgIHB1c2ggQEFjdGl2ZUNsYXNzZXMsICRDbGFzczsKICAgIH0KCiAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgIGluZGV4ID0+ICdjb25maWdpdGVtJywKICAgICk7CiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5UaGUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q29uZmlnSXRlbSBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5Db25maWdJdGVtIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkNvbmZpZ0l0ZW1TdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBDb25maWdJdGVtU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBpZiBjdXJyZW50bHkgbm8gYWN0aXZlIGNsYXNzZXMgYXJlIGRlZmluZWQsIHJldHVybgogICAgcmV0dXJuIDEgaWYgIUBBY3RpdmVDbGFzc2VzOwoKICAgIG15IEBDb25maWdJdGVtcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFtAQWN0aXZlQ2xhc3Nlc10sCiAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICk7CgogICAgbXkgJENvdW50ICAgPSAwOwogICAgbXkgJENJQ291bnQgPSBzY2FsYXIgQENvbmZpZ0l0ZW1zOwoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtcykgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGNvbmZpZyBpdGVtIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICEkUGFyYW17RVNPYmplY3R9LT5Db25maWdJdGVtQ3JlYXRlKCBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCApICkgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSAxMDAwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICRDSUNvdW50IC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JENJQ291bnQ8L3llbGxvdz4gcHJvY2Vzc2VkICg8eWVsbG93PiRQZXJjZW50ICU8L3llbGxvdz4gZG9uZSkuXG4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBUaW1lOjpIaVJlczo6dXNsZWVwKCAkUGFyYW17U2xlZXB9ICkgaWYgJFBhcmFte1NsZWVwfTsKICAgIH0KCiAgICBpZiAoJEVycm9ycykgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5Db25maWdJdGVtIHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VycmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Db25maWdJdGVtIHRyYW5zZmVyIGNvbXBsZXRlLiBUcmFuc2ZlcnJlZCAkQ291bnQgY29uZmlnIGl0ZW1zLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQojIFJvdGhlciBPU1MgLyBFbGFzdGljc2VhcmNoLUZBUQpzdWIgTWlncmF0ZUZBUXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgRkFRIGlzIGluc3RhbGxlZAogICAgbXkgJFBhY2thZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UGFja2FnZScpOwogICAgbXkgJElzSW5zdGFsbGVkICAgPSAkUGFja2FnZU9iamVjdC0+UGFja2FnZUlzSW5zdGFsbGVkKAogICAgICAgIE5hbWUgPT4gJ0ZBUScsCiAgICApOwogICAgaWYgKCAhJElzSW5zdGFsbGVkICkgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlNraXBwaW5nIEZBUXMgKEZBUSBub3QgaW5zdGFsbGVkKS4uLjwvZ3JlZW4+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAnZmFxJywKICAgICk7CiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5UaGUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgSXRlbUlEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0LAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5GQVEgaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+RkFRIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkZBUVN0b3JlRmllbGRzJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93Pk5vIEZBUVN0b3JlRmllbGRzIGFyZSBkZWZpbmVkLjwveWVsbG93PlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CiAgICBteSBARkFRcyAgICAgID0gJEZBUU9iamVjdC0+RkFRU2VhcmNoKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICBteSAkQ291bnQgICAgPSAwOwogICAgbXkgJEZBUUNvdW50ID0gc2NhbGFyIEBGQVFzOwoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgZm9yIG15ICRJdGVtSUQgKEBGQVFzKSB7CgogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGNyZWF0ZSB0aGUgRkFRIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17RVNPYmplY3R9LT5GQVFDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnMrKzsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsbHkgc2xlZXAKICAgICAgICBpZiAoICRDb3VudCAlIDEwMDAgPT0gMCApIHsKICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSBpbnQoICRDb3VudCAvICggJEZBUUNvdW50IC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JEZBUUNvdW50PC95ZWxsb3c+IHByb2Nlc3NlZCAoPHllbGxvdz4kUGVyY2VudCAlPC95ZWxsb3c+IGRvbmUpLlxuIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgVGltZTo6SGlSZXM6OnVzbGVlcCggJFBhcmFte1NsZWVwfSApIGlmICRQYXJhbXtTbGVlcH07CiAgICB9CgogICAgaWYgKCRFcnJvcnMpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+RkFRIHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VyZWQhPC95ZWxsb3c+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkZBUSB0cmFuc2ZlciBjb21wbGV0ZS4gVHJhbnNmZXJyZWQgJENvdW50IEZBUSBpdGVtcy48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KIyBFTyBFbGFzdGljc2VhcmNoLUZBUQoKMTsK</File>
        <File Location="Custom/Kernel/System/Elasticsearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAxMmIzMDVhMDJlY2QzZDY1YWY1YzY1MWI0NGIzZTUyYzIyODI2MGQ2IC0gS2VybmVsL1N5c3RlbS9FbGFzdGljc2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoIDphbGwgKTsKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKIyBJbmZvcm0gdGhlIENvZGVQb2xpY3kgYWJvdXQgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVudGlvbmFsbHkgbm90IGluIEBPYmplY3REZXBlbmRlbmNpZXMuCiMgU29mdCBkZXBlbmRlbmNpZXMgYXJlIG1vZHVsZXMgdGhhdCB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBidXQgd2hvIGRvbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QuCiMgVGhlcmUgaXMgbm8gbmVlZCB0byBkaXNjYXJkIHRoaXMgbW9kdWxlIHdoZW4gb25lIG9mIHRoZSBzb2Z0IGRlcGVuZGVuY2llcyBpcyBkaXNjYXJkZWQuCm91ciBAU29mdE9iamVjdERlcGVuZGVuY2llcyA9ICgKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICdLZXJuZWw6OlN5c3RlbTo6RkFRJywKIyBFTyBFbGFzdGljc2VhcmNoLUZBUQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RWxhc3RpY3NlYXJjaCAtIEVsYXN0aWNzZWFyY2ggQmFja2VuZAoKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIG1vZHVsZSBwcm9jZXNzZXMgc2VhcmNoIGNhbGxzIGZvciB2YXJpb3VzIG90b2JvIGNsYXNzZXMgdG8gY2FsbCB0aGUgZ2VuZXJpYyBFbGFzdGljc2VhcmNoIHNlYXJjaCBpbnZva2VyCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBFbGFzdGljc2VhcmNoIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJEVTT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2gnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IHRoZSBFbGFzdGljc2VhcmNoIHdlYnNlcnZpY2UgaWQKICAgIG15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKICAgIG15ICRXZWJzZXJ2aWNlICAgICAgID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VHZXQoCiAgICAgICAgTmFtZSA9PiAnRWxhc3RpY3NlYXJjaCcsCiAgICApOwoKICAgICRTZWxmLT57V2Vic2VydmljZUlEfSA9ICRXZWJzZXJ2aWNlLT57SUR9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRpY2tldFNlYXJjaCgpCgpQZXJmb3JtcyBhIHRpY2tldCBzZWFyY2ggdmlhIEVsYXN0aWNzZWFyY2guCgogICAgbXkgQFRpY2tldElEcyA9ICRFU09iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICMgcmVzdWx0IChyZXF1aXJlZCkKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnSEFTSCcgfHwgJ0NPVU5UJyB8fCAnRlVMTCcsCgogICAgICAgICMgdXNlciBzZWFyY2ggKFVzZXJJRCBpcyByZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgID0+IDEyMywKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycgfHwgJ3J3JywKCiAgICAgICAgIyBjdXN0b21lciBzZWFyY2ggKEN1c3RvbWVyVXNlcklEIGlzIHJlcXVpcmVkKQogICAgICAgIEN1c3RvbWVyVXNlcklEID0+IDEyMywKICAgICAgICBQZXJtaXNzaW9uICAgICA9PiAncm8nIHx8ICdydycsCgogICAgICAgICMgcmVzdWx0IGxpbWl0CiAgICAgICAgTGltaXQgPT4gMTAwLAoKICAgICAgICAjIEN1c3RvbWVySUQgKG9wdGlvbmFsKSBhcyBTVFJJTkcgb3IgYXMgQVJSQVlSRUYKICAgICAgICBDdXN0b21lcklEID0+ICcxMjMnLAogICAgICAgIEN1c3RvbWVySUQgPT4gWycxMjMnLCAnQUJDJ10sCgogICAgICAgICMgQ3VzdG9tZXJJRFJhdyAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgICMgQ3VzdG9tZXJJRCB3aXRob3V0IFF1ZXJ5Q29uZGl0aW9uIGNoZWNraW5nCiAgICAgICAgI1RoZSByYXcgdmFsdWUgd2lsbCBiZSB1c2VkIGlmIGlzIHNldCB0aGlzIHBhcmFtZXRlcgogICAgICAgIEN1c3RvbWVySURSYXcgPT4gJzEyMyArIDM0NScsCiAgICAgICAgQ3VzdG9tZXJJRFJhdyA9PiBbJzEyMycsICdBQkMnLCcxMjMgJiYgNDU2JywnQUJDICUgZWZnJ10sCgogICAgICAgICMgQ3VzdG9tZXJVc2VyTG9naW4gKG9wdGlvbmFsKSBhcyBTVFJJTkcgYXMgQVJSQVlSRUYKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAndWlkMTIzJywKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiBbJ3VpZDEyMycsICd1aWQ3NzcnXSwKCiAgICAgICAgIyBDdXN0b21lclVzZXJMb2dpblJhdyAob3B0aW9uYWwpIGFzIFNUUklORyBhcyBBUlJBWVJFRgogICAgICAgICNUaGUgcmF3IHZhbHVlIHdpbGwgYmUgdXNlZCBpZiBpcyBzZXQgdGhpcyBwYXJhbWV0ZXIKICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiAndWlkJywKICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiAndWlkICsgMTIzJywKICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiBbJ3VpZCAgLSAgMTIzJywgJ3VpZCAjIDc3NyArIDMyMSddLAoKICAgICAgICAjIE9yZGVyQnkgYW5kIFNvcnRCeSAob3B0aW9uYWwpCiAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsICAjIERvd258VXAKICAgICAgICBTb3J0QnkgID0+ICdBZ2UnLCAgICMgU2NvcmV8QWdlCgogICAgICAgICMgQ2FjaGVUVEwsIGNhY2hlIHNlYXJjaCByZXN1bHQgaW4gc2Vjb25kcyAob3B0aW9uYWwpCiAgICAgICAgQ2FjaGVUVEwgPT4gNjAgKiAxNSwKICAgICk7Cgo9Y3V0CgpzdWIgVGlja2V0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUmVzdWx0VHlwZSAgID0gJFBhcmFte1Jlc3VsdH0gIHx8ICdBUlJBWSc7CiAgICBteSAkT3JkZXJCeSAgICAgID0gJFBhcmFte09yZGVyQnl9IHx8IFsgJ0Rvd24nLCAgJ0Rvd24nIF07CiAgICBteSAkU29ydEJ5ICAgICAgID0gJFBhcmFte1NvcnRCeX0gIHx8IFsgJ1Njb3JlJywgJ0FnZScgXTsKICAgIG15ICRMaW1pdCAgICAgICAgPSAkUGFyYW17TGltaXR9ICAgfHwgMTAwMDA7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICYmICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQgb3IgQ3VzdG9tZXJVc2VySUQgcGFyYW1zIGZvciBwZXJtaXNzaW9uIGNoZWNrIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnYXRoZXIgdGhlIGluZm8gZm9yIHRoZSBFbGFzdGljc2VhcmNoIHF1ZXJ5IHByZXBhcmF0aW9uCiAgICAjIE11c3QgaXMgcmVhZCBhcyBhbGwgY29uZGl0aW9ucyBoYXZlIHRvIGJlIG1ldCwgU2hvdWxkIGlzIHJlYWQgYXMgYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBoYXMgdG8gYmUgbWV0CiAgICBteSAoIEBGaWx0ZXJzLCBATXVzdHMgKTsKCiAgICAjIHVzZXIgZ3JvdXBzCiAgICBpZiAoICRQYXJhbXtVc2VySUR9ICYmICRQYXJhbXtVc2VySUR9ICE9IDEgKSB7CgogICAgICAgICMgZ2V0IHVzZXJzIGdyb3VwcwogICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGlmIHdlIGhhdmUgbm8gcGVybWlzc2lvbnMKICAgICAgICByZXR1cm4gaWYgISVHcm91cExpc3Q7CgogICAgICAgICMgYWRkIHBlcm1pc3Npb24gcmVzdHJpY3Rpb25zCiAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICBHcm91cElEID0+IFsga2V5cyAlR3JvdXBMaXN0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGdyb3VwcwogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFBhcmFte1Blcm1pc3Npb259IHx8ICdybycsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gaWYgd2UgaGF2ZSBubyBwZXJtaXNzaW9ucwogICAgICAgIHJldHVybiBpZiAhJUdyb3VwTGlzdDsKCiAgICAgICAgIyBnZXQgYWxsIGN1c3RvbWVyIGlkcwogICAgICAgIG15IEBDdXN0b21lcklEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJJRHMoCiAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgY29tYmluYXRpb24gb2YgY3VzdG9tZXI8LT5ncm91cCBhY2Nlc3MKICAgICAgICAjIGFkZCBkZWZhdWx0IGNvbWJpbmF0aW9uIGZpcnN0ICggQ3VzdG9tZXJJRHMgKyBDdXN0b21lclVzZXJJRCA8LT4gcncgYWNjZXNzIGdyb3VwcyApCiAgICAgICAgIyB0aGlzIGdyb3VwIHdpbGwgYWx3YXlzIGJlIGFkZGVkIChlbnN1cmVzIHByZXZpb3VzIGJlaGF2aW9yKQogICAgICAgIG15IEBDdXN0b21lckdyb3VwUGVybWlzc2lvbjsKICAgICAgICBwdXNoIEBDdXN0b21lckdyb3VwUGVybWlzc2lvbiwgewogICAgICAgICAgICBDdXN0b21lcklEcyAgICA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBHcm91cElEcyAgICAgICA9PiBbIHNvcnQga2V5cyAlR3JvdXBMaXN0IF0sCiAgICAgICAgfTsKCiAgICAgICAgIyBhZGQgYWxsIGNvbWJpbmF0aW9ucyBiYXNlZCBvbiBncm91cCBhY2Nlc3MgZm9yIG90aGVyIEN1c3RvbWVySURzIChpZiBhdmFpbGFibGUpCiAgICAgICAgIyBvbmx5IGFjdGl2ZSBpZiBjdXN0b21lciBncm91cCBzdXBwb3J0IGFuZCBleHRyYSBwZXJtaXNzaW9uIGNvbnRleHQgYXJlIGVuYWJsZWQKICAgICAgICBteSAkQ3VzdG9tZXJHcm91cE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CiAgICAgICAgbXkgJEV4dHJhUGVybWlzc2lvbkNvbnRleHQgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0TmFtZUdldCgKICAgICAgICAgICAgU3lzQ29uZmlnTmFtZSA9PiAnMTAwLUN1c3RvbWVySUQtb3RoZXInLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0N1c3RvbWVyR3JvdXBTdXBwb3J0JykgJiYgJEV4dHJhUGVybWlzc2lvbkNvbnRleHQgKSB7CgogICAgICAgICAgICAjIGFkZCBsb29rdXAgZm9yIEN1c3RvbWVySUQKICAgICAgICAgICAgbXkgJUN1c3RvbWVySURzTG9va3VwID0gbWFwIHsgJF8gPT4gJF8gfSBAQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICAjIGZvciBhbGwgQ3VzdG9tZXJJRHMgZ2V0IGdyb3VwcyB3aXRoIGFjY2VzcyB0byBvdGhlciBDdXN0b21lcklEcwogICAgICAgICAgICBteSAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzOwogICAgICAgICAgICBDVVNUT01FUklEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKEBDdXN0b21lcklEcykgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVySURFeHRyYVBlcm1pc3Npb25Hcm91cHMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDdXN0b21lckxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICAgICAgICAgICAgIENvbnRleHQgICAgPT4gJEV4dHJhUGVybWlzc2lvbkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUklEIGlmICElQ3VzdG9tZXJJREV4dHJhUGVybWlzc2lvbkdyb3VwczsKCiAgICAgICAgICAgICAgICAjIGFkZCB0byBncm91cHMKICAgICAgICAgICAgICAgICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgPSAoCiAgICAgICAgICAgICAgICAgICAgJUV4dHJhUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJJREV4dHJhUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGFsbCB1bmlxdWUgYWNjZXNzaWJsZSBHcm91cDwtPkN1c3RvbWVyIGNvbWJpbmF0aW9ucyB0byBxdWVyeQogICAgICAgICAgICAjIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGFsbCBncm91cHMgY29ycmVzcG9uc2luZyB3aXRoIGEgdW5pcXVlIGN1c3RvbWVyIGlkIGNvbWJpbmF0aW9uCiAgICAgICAgICAgICMgICB3aWxsIGJlIGNvbWJpbmVkIGludG8gb25lIHBhcnQKICAgICAgICAgICAgbXkgJUN1c3RvbWVySURDb21iaW5hdGlvbnM7CiAgICAgICAgICAgIEdST1VQSUQ6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQga2V5cyAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzICkgewogICAgICAgICAgICAgICAgbXkgQEV4dHJhQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDdXN0b21lckxpc3QoCiAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0lEJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQSUQgaWYgIUBFeHRyYUN1c3RvbWVySURzOwoKICAgICAgICAgICAgICAgICMgZXhjbHVkZSBvd24gQ3VzdG9tZXJJRHMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKICAgICAgICAgICAgICAgIG15IEBNZXJnZWRDdXN0b21lcklEcyA9IGdyZXAgeyAhJEN1c3RvbWVySURzTG9va3VweyRffSB9IEBFeHRyYUN1c3RvbWVySURzOwogICAgICAgICAgICAgICAgbmV4dCBHUk9VUElEIGlmICFATWVyZ2VkQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBjb21iaW5hdGlvbgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVySURTdHJpbmcgPSBqb2luICcsJywgc29ydCBATWVyZ2VkQ3VzdG9tZXJJRHM7CiAgICAgICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJJRENvbWJpbmF0aW9uc3skQ3VzdG9tZXJJRFN0cmluZ30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySURDb21iaW5hdGlvbnN7JEN1c3RvbWVySURTdHJpbmd9ID0gewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEcyA9PiBcQE1lcmdlZEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRDdXN0b21lcklEQ29tYmluYXRpb25zeyRDdXN0b21lcklEU3RyaW5nfS0+e0dyb3VwSURzfSB9LCAkR3JvdXBJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdG8gcXVlcnkgY29tYmluYXRpb25zCiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVyR3JvdXBQZXJtaXNzaW9uLCBzb3J0IHZhbHVlcyAlQ3VzdG9tZXJJRENvbWJpbmF0aW9uczsKICAgICAgICB9CgogICAgICAgICMgbm93IGFkZCBhbGwgY29tYmluYXRpb25zIHRvIHF1ZXJ5OgogICAgICAgICMgdGhpcyB3aWxsIGNvbXBpbGUgYSBzZWFyY2ggcmVzdHJpY3Rpb24gYmFzZWQgb24gY3VzdG9tZXJfaWQvY3VzdG9tZXJfdXNlcl9pZCBhbmQgZ3JvdXAKICAgICAgICAjICAgYW5kIHdpbGwgbWF0Y2ggaWYgYW55IG9mIHRoZSBwZXJtaXNzaW9uIGNvbWJpbmF0aW9uIGlzIG1ldAogICAgICAgICMgYSBwZXJtaXNzaW9uIGNvbWJpbmF0aW9uIGNvdWxkIGJlOgogICAgICAgICMgICAgICggPEN1c3RvbWVyVXNlcklEPiBPUiA8Q1VTVE9NRVJJRDE+ICkgQU5EICggPEdST1VQSUQxPiApCiAgICAgICAgIyBvcgogICAgICAgICMgICAgICggPEN1c3RvbWVySUQxPiBPUiA8Q1VTVE9NRVJJRDI+IE9SIDxDVVNUT01FUklEMz4gKSBBTkQgKCA8R1JPVVBJRDE+IE9SIDxHUk9VUElEMj4gKQogICAgICAgIG15IEBDdXN0b21lcklER3JvdXBDb21iaW5hdGlvbnM7CiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoQEN1c3RvbWVyR3JvdXBQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgIG15ICREaXJlY3RDb25kaXRpb25zOwogICAgICAgICAgICBteSBAQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEVudHJ5LT57Q3VzdG9tZXJJRHN9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgQHsgJEVudHJ5LT57Q3VzdG9tZXJJRHN9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW5SYXd9IHx8ICggJEVudHJ5LT57Q3VzdG9tZXJVc2VySUR9ICYmICFAQ3VzdG9tZXJJRHMgKSApIHsKICAgICAgICAgICAgICAgICREaXJlY3RDb25kaXRpb25zID0gewogICAgICAgICAgICAgICAgICAgIHRlcm0gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW5SYXd9IC8vICRFbnRyeS0+e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIEBDdXN0b21lcklEcyAmJiAkRW50cnktPntDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0Q29uZGl0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEVudHJ5LT57Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmIChAQ3VzdG9tZXJJRHMpIHsKICAgICAgICAgICAgICAgICREaXJlY3RDb25kaXRpb25zID0gewogICAgICAgICAgICAgICAgICAgIHRlcm1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJJREdyb3VwQ29tYmluYXRpb25zLCB7CiAgICAgICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAkRGlyZWN0Q29uZGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEVudHJ5LT57R3JvdXBJRHN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgfQoKICAgICAgICBpZiAoIHNjYWxhciBAQ3VzdG9tZXJJREdyb3VwQ29tYmluYXRpb25zID09IDEgKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsICRDdXN0b21lcklER3JvdXBDb21iaW5hdGlvbnNbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBGaWx0ZXJzLCB7CiAgICAgICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgICAgICBzaG91bGQgPT4gXEBDdXN0b21lcklER3JvdXBDb21iaW5hdGlvbnMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICB9CgogICAgIyBmdWxsdGV4dCBzZWFyY2gKICAgIGlmICggZGVmaW5lZCAkUGFyYW17RnVsbHRleHR9ICkgewoKICAgICAgICAjIGdldCBmaWVsZHMgdG8gc2VhcmNoCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpUaWNrZXRTZWFyY2hGaWVsZHMnKTsKICAgICAgICBteSBAU2VhcmNoRmllbGRzICAgPSBAeyAkRnVsbHRleHRGaWVsZHMtPntUaWNrZXR9IH07CiAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoIG1hcCB7IkFydGljbGVzRXh0ZXJuYWwuJF8ifSBAeyAkRnVsbHRleHRGaWVsZHMtPntBcnRpY2xlfSB9ICk7CiAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICJBdHRhY2htZW50c0V4dGVybmFsLkNvbnRlbnQiLCAiQXR0YWNobWVudHNFeHRlcm5hbC5GaWxlbmFtZSIgKTsKCiAgICAgICAgIyBhZGQgaW50ZXJuYWwgZmllbGRzCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoIG1hcCB7IkFydGljbGVzSW50ZXJuYWwuJF8ifSBAeyAkRnVsbHRleHRGaWVsZHMtPntBcnRpY2xlfSB9ICk7CiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCAiQXR0YWNobWVudHNJbnRlcm5hbC5Db250ZW50IiwgIkF0dGFjaG1lbnRzSW50ZXJuYWwuRmlsZW5hbWUiICk7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJEZ1bGx0ZXh0RmllbGRzLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgICAgICAgICAgbXkgJFpvb21Db25maWcgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRab29tJykgfHwge307CiAgICAgICAgICAgIG15ICRDdXN0b21lckZpZWxkcyAgICAgPSAkWm9vbUNvbmZpZy0+e0R5bmFtaWNGaWVsZH07CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIEB7ICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgICAgICAgICAgIyBhZ2VudCBzZWFyY2gKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGFsbCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGFydGljbGUgZHluYW1pY2ZpZWxkcyBmb3IgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgYXJ0aWNsZXMKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJ0aWNsZXNFeHRlcm5hbC5EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnRpY2xlc0ludGVybmFsLkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3VzdG9tZXIgc2VhcmNoCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGR5bmFtaWMgZmllbGQgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXJzCiAgICAgICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhJEN1c3RvbWVyRmllbGRzIHx8ICEkQ3VzdG9tZXJGaWVsZHMtPnskRHluYW1pY0ZpZWxkTmFtZX0gKTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhcnRpY2xlIGR5bmFtaWNmaWVsZHMgZm9yIGV4dGVybmFsIGFydGljbGVzCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICgiQXJ0aWNsZXNFeHRlcm5hbC5EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIHF1ZXVlIHJlc3RyaWN0aW9ucwogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gXEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gIiokUGFyYW17RnVsbHRleHR9KiIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICB9CgogICAgIyBkZWZpbmUgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmV0dXJuID0gKCAkUmVzdWx0VHlwZSBlcSAnSEFTSCcgKSA/IFtxdyhUaWNrZXRJRCBUaWNrZXROdW1iZXIpXSA6CiAgICAgICAgKCAkUmVzdWx0VHlwZSBlcSAnRlVMTCcgKSA/ICcnIDogJ1RpY2tldElEJzsKCiAgICAjIGRlZmluZSB0aGUgc29ydGluZwogICAgbXkgQFNvcnQ7CiAgICBteSAlTzJFID0gcXcoRG93biBkZXNjIFVwIGFzYyk7CiAgICBpZiAoICFyZWYoJFNvcnRCeSkgKSB7CiAgICAgICAgJFNvcnRCeSAgPSBbJFNvcnRCeV07CiAgICAgICAgJE9yZGVyQnkgPSBbJE9yZGVyQnldOwogICAgfQogICAgZm9yIG15ICRpICggMCAuLiAkI3skU29ydEJ5fSApIHsKCiAgICAgICAgIyBzY29yZSBpcyBFbGFzdGljc2VhcmNoIHNwZWNpZmljCiAgICAgICAgaWYgKCAkU29ydEJ5LT5bJGldIGVxICdTY29yZScgKSB7ICRTb3J0QnktPlskaV0gPSAnX3Njb3JlJyB9CgogICAgICAgICMgYWdlIGlzIG5vdCBzdG9yZWQgaW4gRWxhc3RpY3NlYXJjaAogICAgICAgIGlmICggJFNvcnRCeS0+WyRpXSBlcSAnQWdlJyApIHsKICAgICAgICAgICAgJFNvcnRCeS0+WyRpXSAgPSAnQ3JlYXRlZCc7CiAgICAgICAgICAgICRPcmRlckJ5LT5bJGldID0gJE9yZGVyQnktPlskaV0gZXEgJ1VwJyA/ICdVcCcgOiAnRG93bic7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBTb3J0LCB7ICRTb3J0QnktPlskaV0gPT4gJE8yRXsgJE9yZGVyQnktPlskaV0gfSB9OwogICAgfQoKICAgICMgY2FsbCB0aGUgRWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdTZWFyY2gnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAndGlja2V0JywKICAgICAgICAgICAgTXVzdCAgICAgID0+IFxATXVzdHMsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiBcQEZpbHRlcnMsCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJldHVybiAgICA9PiAkUmV0dXJuLAogICAgICAgICAgICBTb3J0ICAgICAgPT4gXEBTb3J0LAogICAgICAgIH0KICAgICk7CgogICAgIyBjb252ZXJ0IHRoZSBFbGFzdGljc2VhcmNoIHJldHVybiB0byB0aGUgbmVlZGVkIE9UT0JPIHN0cnVjdHVyZSBhbmQgcmV0dXJuCiAgICBpZiAoICRSZXN1bHRUeXBlIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e1RpY2tldElEfSA9PiAkXy0+e1RpY2tldE51bWJlcn0gfQogICAgICAgICAgICB9IEB7ICRSZXN1bHQtPntEYXRhfSB9CiAgICAgICAgKTsKICAgIH0KCiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdBUlJBWScgKSB7CiAgICAgICAgcmV0dXJuICggbWFwIHsgJF8tPntUaWNrZXRJRH0gfSBAeyAkUmVzdWx0LT57RGF0YX0gfSApOwogICAgfQoKICAgIGVsc2lmICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgewoKICAgICAgICAjIGFnZSBoYXMgdG8gYmUgY2FsdWxhdGVkCiAgICAgICAgbXkgJE5vdyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICBmb3IgbXkgJERhdGEgKCBAeyAkUmVzdWx0LT57RGF0YX0gfSApIHsKICAgICAgICAgICAgJERhdGEtPntBZ2V9ID0gJE5vdyAtICREYXRhLT57Q3JlYXRlZH07CiAgICAgICAgfQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICB7ICRfLT57VGlja2V0SUR9ID0+ICRfIH0KICAgICAgICAgICAgfSBAeyAkUmVzdWx0LT57RGF0YX0gfQogICAgICAgICk7CiAgICB9CgogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnQ09VTlQnICkgewogICAgICAgIHJldHVybiBzY2FsYXIgQHsgJFJlc3VsdC0+e0RhdGF9IH07CiAgICB9Cgp9CgpzdWIgQ3VzdG9tZXJDb21wYW55U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSZXN1bHRUeXBlICAgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwogICAgbXkgJExpbWl0ICAgICAgICA9ICRQYXJhbXtMaW1pdH0gIHx8IDEwMDAwOwoKICAgIG15ICggQE11c3RzLCBARmlsdGVycyApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtGdWxsdGV4dH0gKSB7CgogICAgICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzJyk7CgogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gJEZ1bGx0ZXh0RmllbGRzLAogICAgICAgICAgICAgICAgcXVlcnkgID0+ICIqJFBhcmFte0Z1bGx0ZXh0fSoiLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyB0aGUgcmV0dXJuIHVzdWFsbHkgd2lsbCBiZSBDdXN0b21lcklELCBidXQgaXQgY2FuIGJlIGRpZmZlcmVudCBmb3IgY3VzdG9tIGJhY2tlbmRzCiAgICBteSAkUmV0dXJuID0gJ0N1c3RvbWVyQ29tcGFueUtleSc7CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnU2VhcmNoJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgTXVzdCAgICAgID0+IFxATXVzdHMsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiBcQEZpbHRlcnMsCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJldHVybiAgICA9PiAkUmV0dXJuLAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiAoIG1hcCB7ICRfLT57Q3VzdG9tZXJDb21wYW55S2V5fSB9IEB7ICRSZXN1bHQtPntEYXRhfSB9ICk7CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdDT1VOVCcgKSB7CiAgICAgICAgcmV0dXJuIHNjYWxhciBAeyAkUmVzdWx0LT57RGF0YX0gfTsKICAgIH0KCn0KCnN1YiBDdXN0b21lclVzZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJlc3VsdFR5cGUgICA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CiAgICBteSAkTGltaXQgICAgICAgID0gJFBhcmFte0xpbWl0fSAgfHwgMTAwMDA7CgogICAgbXkgKCBATXVzdHMsIEBGaWx0ZXJzICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMnKTsKCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgcXVlcnlfc3RyaW5nID0+IHsKICAgICAgICAgICAgICAgIGZpZWxkcyA9PiAkRnVsbHRleHRGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gIiokUGFyYW17RnVsbHRleHR9KiIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHRoZSByZXR1cm4gdXN1YWxseSB3aWxsIGJlIFVzZXJMb2dpbiwgYnV0IGl0IGNhbiBiZSBkaWZmZXJlbnQgZm9yIGN1c3RvbSBiYWNrZW5kcwogICAgbXkgJFJldHVybiA9ICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgPyBbcXcoQ3VzdG9tZXJLZXkgVXNlckZ1bGxuYW1lKV0gOiAnQ3VzdG9tZXJLZXknOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1NlYXJjaCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICdjdXN0b21lcnVzZXInLAogICAgICAgICAgICBNdXN0ICAgICAgPT4gXEBNdXN0cywKICAgICAgICAgICAgRmlsdGVyICAgID0+IFxARmlsdGVycywKICAgICAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgUmV0dXJuICAgID0+ICRSZXR1cm4sCiAgICAgICAgfQogICAgKTsKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICB7ICRfLT57Q3VzdG9tZXJLZXl9ID0+ICRfLT57VXNlckZ1bGxuYW1lfSB9CiAgICAgICAgICAgIH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0KICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiAoIG1hcCB7ICRfLT57Q3VzdG9tZXJLZXl9IH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0gKTsKICAgIH0KICAgIGVsc2lmICggJFJlc3VsdFR5cGUgZXEgJ0NPVU5UJyApIHsKICAgICAgICByZXR1cm4gc2NhbGFyIEB7ICRSZXN1bHQtPntEYXRhfSB9OwogICAgfQp9Cgo9aGVhZDIgQ29uZmlnSXRlbVNlYXJjaCgpCgpQZXJmb3JtcyBhIGNvbmZpZyBpdGVtIHNlYXJjaCB2aWEgRWxhc3RpY3NlYXJjaC4KCiAgICAkRVNPYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgRnVsbHRleHQgPT4gJFN0cmluZywKICAgICAgICBMaW1pdCAgICA9PiAyMCwgICAgICMgb3B0aW9uYWwKICAgICAgICBSZXN1bHQgICA9PiBBUlJBWSwgICMgb3B0aW9uYWwsIEFSUkFZIChkZWZhdWx0KSB8IEZVTEwKCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJlc3VsdFR5cGUgICA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CiAgICBteSAkTGltaXQgICAgICAgID0gJFBhcmFte0xpbWl0fSAgfHwgMTAwMDA7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdy9Vc2VySUQgRnVsbHRleHQvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCBATXVzdHMsIEBGaWx0ZXJzICk7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gdGhlIGNsYXNzZXMKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gaWYgISRIYXNBY2Nlc3M7CiAgICB9CgogICAgIyBzZXQgdXAgY2xhc3MgZmlsdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjY2VzcyByaWdodHMKICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgZmlsdGVyID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gWyBrZXlzICV7JENsYXNzTGlzdH0gXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyk7CiAgICAgICAgbXkgQFNlYXJjaEZpZWxkcyAgID0gKAogICAgICAgICAgICBAeyAkRnVsbHRleHRGaWVsZHMtPntCYXNpY30gLy8gW10gfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0F0dGFjaG1lbnRzfSApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICdBdHRhY2htZW50cy5Db250ZW50JywgJ0F0dGFjaG1lbnRzLkZpbGVuYW1lJyApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIEB7ICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgICAgICAgICAgIyBhZGQgYWxsIGNvbmZpZyBpdGVtIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnSVRTTUNvbmZpZ0l0ZW0nICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gXEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gIiokUGFyYW17RnVsbHRleHR9KiIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGRlZmluZSB0aGUgcmV0dXJuIHR5cGUKICAgIG15ICRSZXR1cm4gPSAoICRSZXN1bHRUeXBlIGVxICdGVUxMJyApID8gJycgOiAnQ29uZmlnSXRlbUlEJzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdTZWFyY2gnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAnY29uZmlnaXRlbScsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICB7ICRfLT57Q29uZmlnSXRlbUlEfSA9PiAkXyB9CiAgICAgICAgICAgIH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0KICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICggbWFwIHsgJF8tPntDb25maWdJdGVtSUR9IH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0gKTsKICAgIH0KCn0KCj1oZWFkMiBUaWNrZXRDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgdGlja2V0IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCkUuZy4gd2hlbiBhIFRpY2tldCBpcyByZXN0b3JlZCBmcm9tIHRoZSBhcmNoaXZlIG9yIHdoZW4gd2hlbiBhIHRpY2tldCBpcyBtb3ZlZCBmcm9tIGFuIGV4Y2x1ZGVkIHF1ZXVlLgoKICAgICRFU09iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICk7Cgo9Y3V0CgpzdWIgVGlja2V0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVGlja2V0TWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgPT4gJ1RpY2tldENyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEFydGljbGVDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGFuIGFydGljbGUgaW4gdGhlIEVsYXN0aWNzZWFyY2ggZGF0YWJhc2UuIEhhcHBlbnMgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1RpY2tldE1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQXJ0aWNsZUNyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjdXN0b21lciBjb21wYW55IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCgogICAgJEVTT2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICVDdXN0b21lckNvbXBhbnkgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueU1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUFkZCcsCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlQ3VzdG9tZXJDb21wYW55LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKCn0KCj1oZWFkMiBDdXN0b21lclVzZXJBZGQoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgY3VzdG9tZXIgY29tcGFueSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBldmVudCBiYXNlZCBpbiBhIHByb2R1Y3RpdmUgc3lzdGVtLgoKICAgICRFU09iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJUN1c3RvbWVyVXNlciAgICAgICA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnQ3VzdG9tZXJVc2VyTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICA9PiAnQ3VzdG9tZXJVc2VyQWRkJywKICAgICAgICAgICAgTmV3RGF0YSA9PiBcJUN1c3RvbWVyVXNlciwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cgp9Cgo9aGVhZDIgQ29uZmlnSXRlbUNyZWF0ZSgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjb25maWcgaXRlbSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBtb3N0bHkgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkNvbmZpZ0l0ZW1DcmVhdGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1DcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvQ29uZmlnSXRlbUlELykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0KICAgICk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQtPntTdWNjZXNzfTsKCiAgICAjIHVwZGF0ZSB0aGUgYXR0YWNobWVudHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkNvbmZpZ0l0ZW1TZWFyY2hGaWVsZHMnKQogICAgICAgICYmCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyktPnsnQXR0YWNobWVudHMnfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50TmFtZSAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50TmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdBdHRhY2htZW50QWRkUG9zdCcsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKCn0KCiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCgo9aGVhZDIgRkFRQ3JlYXRlKCkKCkV4cGxpY2l0bHkgY3JlYXRlcyBhIEZBUSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBtb3N0bHkgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkZBUUNyZWF0ZSgKICAgICAgICBJdGVtSUQgPT4gJEZBUUl0ZW1JRCwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3L0l0ZW1JRC8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVxdWVzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY3JlYXRlIHRoZSBGQVEKICAgIG15ICRSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ0ZBUU1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICA9PiAnRkFRQ3JlYXRlJywKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gaWYgISRSZXN1bHQtPntTdWNjZXNzfTsKCiAgICAjIHVwZGF0ZSB0aGUgYXR0YWNobWVudHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkZBUVNlYXJjaEZpZWxkcycpCiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkZBUVNlYXJjaEZpZWxkcycpLT57J0F0dGFjaG1lbnRzJ30KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICAgICAgbXkgQEF0dGFjaG1lbnRJbmRleCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRFbnRyeSAoQEF0dGFjaG1lbnRJbmRleCkgewogICAgICAgICAgICBteSAlQXR0YWNobWVudCA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnRFbnRyeS0+e0ZpbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICAgICAgICAgIEludm9rZXIgICAgICA9PiAnRkFRTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnQsCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgID0+ICdGQVFBdHRhY2htZW50QWRkUG9zdCcsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKCn0KCj1oZWFkMiBGQVFTZWFyY2goKQoKUGVyZm9ybXMgYSBGQVEgc2VhcmNoIHZpYSBFbGFzdGljc2VhcmNoLgoKICAgICRFU09iamVjdC0+RkFRU2VhcmNoKAogICAgICAgIEZ1bGx0ZXh0ID0+ICRTdHJpbmcsCiAgICAgICAgTGltaXQgICAgPT4gMjAsICAgICAjIG9wdGlvbmFsCiAgICAgICAgUmVzdWx0ICAgPT4gQVJSQVksICAjIG9wdGlvbmFsLCBBUlJBWSAoZGVmYXVsdCkgfCBGVUxMCgogICAgKTsKCj1jdXQKCnN1YiBGQVFTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJlc3VsdFR5cGUgICA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CiAgICBteSAkTGltaXQgICAgICAgID0gJFBhcmFte0xpbWl0fSAgfHwgMTAwMDA7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdy9Vc2VySUQgRnVsbHRleHQvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgdXAgY2F0ZWdvcnkgZmlsdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjY2VzcyByaWdodHMKICAgIG15ICRGQVFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RkFRJyk7CgogICAgbXkgJENhdGVnb3J5R3JvdXBIYXNoUmVmOwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICAgICAgJENhdGVnb3J5R3JvdXBIYXNoUmVmID0gJEZBUU9iamVjdC0+R2V0Q3VzdG9tZXJDYXRlZ29yaWVzKAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYgPSAkRkFRT2JqZWN0LT5DYXRlZ29yeUxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYgPSAkRkFRT2JqZWN0LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgY29kZSBiZWxvdywgcGxlYXNlIHNlZSBDdXN0b21lckZBUVNlYXJjaDo1MDAgZmYKICAgIG15ICVBbGxvd2VkQ2F0ZWdvcnlJRHMgPSAoKTsKICAgIGlmICggJENhdGVnb3J5R3JvdXBIYXNoUmVmICYmIHJlZiAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYgZXEgJ0hBU0gnICkgewogICAgICAgIGZvciBteSAkTGV2ZWwgKCBzb3J0IGtleXMgJXskQ2F0ZWdvcnlHcm91cEhhc2hSZWZ9ICkgewogICAgICAgICAgICBpZiAoICRDYXRlZ29yeUdyb3VwSGFzaFJlZi0+eyRMZXZlbH0gJiYgcmVmICRDYXRlZ29yeUdyb3VwSGFzaFJlZi0+eyRMZXZlbH0gZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgbXkgJVRlbXBJRHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYtPnskTGV2ZWx9IH07CiAgICAgICAgICAgICAgICAlQWxsb3dlZENhdGVnb3J5SURzID0gKAogICAgICAgICAgICAgICAgICAgICVBbGxvd2VkQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgJVRlbXBJRHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBteSBAQ2F0ZWdvcnlJRHMgPSAoKTsKICAgIGlmICglQWxsb3dlZENhdGVnb3J5SURzKSB7CiAgICAgICAgQENhdGVnb3J5SURzID0ga2V5cyAlQWxsb3dlZENhdGVnb3J5SURzOwogICAgfQoKICAgIG15ICggQE11c3RzLCBARmlsdGVycyApOwoKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgbXkgJEludGVyZmFjZVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgICAgIFR5cGVzICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6Q3VzdG9tZXI6OlN0YXRlVHlwZXMnKSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgIGZpbHRlciA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVUeXBlSUQgPT4gWyBrZXlzICRJbnRlcmZhY2VTdGF0ZXMtPiUqIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICBmaWx0ZXIgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiBcQENhdGVnb3J5SURzLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtGdWxsdGV4dH0gKSB7CgogICAgICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6RkFRU2VhcmNoRmllbGRzJykgLy8ge307CgogICAgICAgIG15IEBTZWFyY2hGaWVsZHM7CiAgICAgICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgbXkgQENhbmRpZGF0ZUZpZWxkcyA9IEB7ICRGdWxsdGV4dEZpZWxkcy0+e0Jhc2ljfSAvLyBbXSB9OwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ2FuZGlkYXRlRmllbGRzKSB7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZCA9fiAvKEZpZWxkXGQpLyApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRmllbGRTdGF0ZSA9ICRDb25maWdPYmplY3QtPkdldCggJ0ZBUTo6SXRlbTo6JyAuICQxICktPntTaG93fTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZFN0YXRlID1+IC9ecHVibGljfGV4dGVybmFsJC8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgJEZpZWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBAU2VhcmNoRmllbGRzID0gKAogICAgICAgICAgICAgICAgQHsgJEZ1bGx0ZXh0RmllbGRzLT57QmFzaWN9IC8vIFtdIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0F0dGFjaG1lbnRzfSApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICdBdHRhY2htZW50cy5Db250ZW50JywgJ0F0dGFjaG1lbnRzLkZpbGVuYW1lJyApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIEB7ICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgICAgICAgICAgIyBhZGQgYWxsIGZhcSBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ0ZBUScgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgcXVlcnlfc3RyaW5nID0+IHsKICAgICAgICAgICAgICAgIGZpZWxkcyA9PiBcQFNlYXJjaEZpZWxkcywKICAgICAgICAgICAgICAgIHF1ZXJ5ICA9PiAiKiRQYXJhbXtGdWxsdGV4dH0qIiwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgZGVmaW5lIHRoZSByZXR1cm4gdHlwZQogICAgbXkgJFJldHVybiA9ICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgPyAnJyA6ICdGQVFJdGVtSUQnOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1NlYXJjaCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICdmYXEnLAogICAgICAgICAgICBNdXN0ICAgICAgPT4gXEBNdXN0cywKICAgICAgICAgICAgRmlsdGVyICAgID0+IFxARmlsdGVycywKICAgICAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgUmV0dXJuICAgID0+ICRSZXR1cm4sCiAgICAgICAgfQogICAgKTsKCiAgICBpZiAoICRSZXN1bHRUeXBlIGVxICdGVUxMJyApIHsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e0l0ZW1JRH0gPT4gJF8gfQogICAgICAgICAgICB9IEB7ICRSZXN1bHQtPntEYXRhfSB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAoIG1hcCB7ICRfLT57SXRlbUlEfSB9IEB7ICRSZXN1bHQtPntEYXRhfSB9ICk7CiAgICB9Cgp9CgojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCgo9aGVhZDIgVGVzdENvbm5lY3Rpb24oKQoKVGVzdCB0aGUgY29ubmVjdGlvbiB0byB0aGUgRWxhc3RpY3NlYXJjaCBzZXJ2ZXIuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRVNPYmplY3QtPlRlc3RDb25uZWN0aW9uKCk7Cgo9Y3V0CgpzdWIgVGVzdENvbm5lY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRHVtbXlJbmRleCA9ICgKICAgICAgICBpbmRleCA9PiAnJywKICAgICk7CiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc19HRVQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiBcJUR1bW15SW5kZXgsCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9Owp9Cgo9aGVhZDIgQ3JlYXRlSW5kZXgoKQoKQ3JlYXRlIGEgbmV3IGluZGV4LgoKICAgIG15ICRTdWNjZXNzID0gJEVTT2JqZWN0LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gewogICAgICAgICAgICBuYW1lID0+ICdzb21ldGhpbmcnLAogICAgICAgIH0sCiAgICAgICAgUmVxdWVzdCAgID0+IHsKICAgICAgICAgICAgc2V0dGluZ3MgPT4geyAuLi4gfSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4geyAuLi4gfSwKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVJbmRleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzX1BVVCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICRQYXJhbXtJbmRleE5hbWV9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gJFBhcmFte1JlcXVlc3R9LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKfQoKPWhlYWQyIERyb3BJbmRleCgpCgpEcm9wIGEgY29tcGxldGUgaW5kZXguCgogICAgJEVTT2JqZWN0LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+ICduYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgRHJvcEluZGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVXRpbHNfREVMRVRFJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJFBhcmFte0luZGV4TmFtZX0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9Owp9CgpzdWIgRGVsZXRlUGlwZWxpbmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc1BpcGVsaW5lX0RFTEVURScsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHt9LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKfQoKc3ViIENyZWF0ZVBpcGVsaW5lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVXRpbHNQaXBlbGluZV9QVVQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAnJywKICAgICAgICAgICAgUmVxdWVzdCAgID0+ICRQYXJhbXtSZXF1ZXN0fSwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cgp9Cgo9aGVhZDIgSW5kZXhTZXR0aW5nc0dldCgpCgpHZXQgc2V0dGluZ3MgZm9yIGEgY2VydGFpbiBpbmRleAoKICAgIG15ICRTZXR0aW5ncyA9ICRFU09iamVjdC0+SW5kZXhTZXR0aW5nc0dldCgKICAgICAgICBDb25maWcgICA9PiAkQ29uZmlnLAogICAgICAgIFRlbXBsYXRlID0+ICRUZW1wbGF0ZSwKICAgIDspCgo9Y3V0CgpzdWIgSW5kZXhTZXR0aW5nc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWcgPSAkUGFyYW17Q29uZmlnfTsKCiAgICBteSAkU2V0dGluZ3MgPSAkU2VsZi0+X0V4cGFuZFRlbXBsYXRlKAogICAgICAgIEl0ZW0gICAgICAgICA9PiAkUGFyYW17VGVtcGxhdGV9LAogICAgICAgIENvbmZpZyAgICAgICA9PiAkQ29uZmlnLAogICAgICAgIExheW91dE9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyksCiAgICApOwoKICAgIHJldHVybiAkU2V0dGluZ3M7Cn0KCnN1YiBfRXhwYW5kVGVtcGxhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnID0gJFBhcmFte0NvbmZpZ307CiAgICBteSAkTm9kZSAgID0gJFBhcmFte0l0ZW19OwoKICAgIGlmICggcmVmICROb2RlIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlRXhwYW5kZWQ7CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzKCAleyROb2RlfSApICkgewogICAgICAgICAgICAkRXhwYW5kZWR7JEtleX0gPSAkU2VsZi0+X0V4cGFuZFRlbXBsYXRlKAogICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICROb2RlLT57JEtleX0sCiAgICAgICAgICAgICAgICBDb25maWcgICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkUGFyYW17TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcJUV4cGFuZGVkOwogICAgfQogICAgZWxzaWYgKCByZWYgJE5vZGUgZXEgJ0FSUkFZJyApIHsKICAgICAgICBteSBARXhwYW5kZWQ7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskTm9kZX0gKSB7CiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARXhwYW5kZWQsCiAgICAgICAgICAgICAgICAkU2VsZi0+X0V4cGFuZFRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICAgICAgICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFBhcmFte0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXEBFeHBhbmRlZDsKICAgIH0KICAgIGVsc2lmICggIWRlZmluZWQoJE5vZGUpICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2lmICggSXNOdW1iZXIoJE5vZGUpICkgewogICAgICAgIHJldHVybiAkTm9kZTsKICAgIH0KICAgIGVsc2lmICggSXNTdHJpbmcoJE5vZGUpICkgewogICAgICAgIHJldHVybiAkUGFyYW17TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkTm9kZSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gJENvbmZpZywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICROb2RlOwogICAgfQp9Cgo9aGVhZDIgSW5pdGlhbFNldHVwKCkKClRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgSTxpbnN0YWxsZXIucGw+IGFuZCBieSBhbHRlcm5hdGl2ZSBpbnN0YWxsIHNjcmlwdHMgdG8gZ2V0IGEgd29ya2luZwppbml0aWFsIHNldHVwLgoKICAgIG15ICgkU3VjY2VzcywgJEZhdGFsRXJyb3IpID0gJEVTT2JqZWN0LT5Jbml0aWFsU2V0dXAoKQoKPWN1dAoKc3ViIEluaXRpYWxTZXR1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CgogICAgIyBhY3RpdmF0ZSBFbGFzdGljc2VhcmNoIGluIHRoZSBTeXNDb25maWcKICAgIHsKICAgICAgICBteSAkRXhjbHVzaXZlTG9ja0dVSUQgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nTG9jaygKICAgICAgICAgICAgTG9ja0FsbCA9PiAxLAogICAgICAgICAgICBGb3JjZSAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVcGRhdGUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdFbGFzdGljc2VhcmNoOjpBY3RpdmUnLAogICAgICAgICAgICBJc1ZhbGlkICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBFeGNsdXNpdmVMb2NrR1VJRCA9PiAkRXhjbHVzaXZlTG9ja0dVSUQsCiAgICAgICAgKTsKICAgICAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nVW5sb2NrKAogICAgICAgICAgICBVbmxvY2tBbGwgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFRPRE86IGhhbmRsZSBlcnJvcnMKICAgIH0KCiAgICBteSAkU3VjY2VzcyA9IDE7CgogICAgIyBpbml0aWFsaXplIHN0YW5kYXJkIGluZGljZXMKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgIG15ICRFcnJvcnM7CiAgICAgICAgbXkgJEluZGV4Q29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpJbmRleFNldHRpbmdzJyk7CiAgICAgICAgbXkgJERlZmF1bHRDb25maWc7CiAgICAgICAgaWYgKCRJbmRleENvbmZpZykgewogICAgICAgICAgICAkRGVmYXVsdENvbmZpZyA9ICRJbmRleENvbmZpZy0+e0RlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERlZmF1bHRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkFydGljbGVJbmRleENyZWF0aW9uU2V0dGluZ3MnKTsKICAgICAgICB9CgogICAgICAgICMgdGhyb3cgYW4gZmF0YWwgZXJyb3Igd2hlbiB3ZSBhcmUgaW4gYSB3ZWIgY29udGV4dAogICAgICAgIHJldHVybiAwLCAxIHVubGVzcyAkRGVmYXVsdENvbmZpZzsKCiAgICAgICAgbXkgJERlZmF1bHRUZW1wbGF0ZTsKICAgICAgICBteSAkSW5kZXhUZW1wbGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6SW5kZXhUZW1wbGF0ZScpOwogICAgICAgIGlmICgkSW5kZXhUZW1wbGF0ZSkgewogICAgICAgICAgICAkRGVmYXVsdFRlbXBsYXRlID0gJEluZGV4VGVtcGxhdGUtPntEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHRocm93IGFuIGZhdGFsIGVycm9yIHdoZW4gd2UgYXJlIGluIGEgd2ViIGNvbnRleHQKICAgICAgICAgICAgcmV0dXJuIDAsIDE7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBwaXBlbGluZXMuCiAgICAgICAgIyBXcml0aW5nIHRoZSBzdHJpbmcgJ2ZvcmVhY2gnIGluIGEgZnVubnkgd2F5LCBhcyBzb21lIHZlcnNpb25zIG9mIHRoZSBDb2RlUG9saWN5CiAgICAgICAgIyByZXBsYWNlZCBpdCB3aXRoIHRoZSBzdHJpbmcgJ2ZvcicuCiAgICAgICAgbXkgJVBpcGVsaW5lID0gKAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9PiAiRXh0cmFjdCBleHRlcm5hbCBhdHRhY2htZW50IGluZm9ybWF0aW9uIiwKICAgICAgICAgICAgcHJvY2Vzc29ycyAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHF7Zm9yZWFjaH0gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPT4gIkF0dGFjaG1lbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9maWVsZCA9PiAiX2luZ2VzdC5fdmFsdWUuYXR0YWNobWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgICAgID0+ICJfaW5nZXN0Ll92YWx1ZS5kYXRhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBxe2ZvcmVhY2h9ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgID0+ICJBdHRhY2htZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0+ICJfaW5nZXN0Ll92YWx1ZS5kYXRhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXQogICAgICAgICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZVBpcGVsaW5lKAogICAgICAgICAgICBSZXF1ZXN0ID0+IFwlUGlwZWxpbmUsCiAgICAgICAgKTsKICAgICAgICAkRXJyb3JzKysgdW5sZXNzICRTdWNjZXNzOwoKICAgICAgICAjIGNyZWF0ZSBpbmRleCBmb3IgY3VzdG9tZXIKICAgICAgICBteSAlUmVxdWVzdEN1c3RvbWVyID0gKAogICAgICAgICAgICBzZXR0aW5ncyA9PiAkU2VsZi0+SW5kZXhTZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRJbmRleENvbmZpZy0+e0N1c3RvbWVyfSAgIC8vICREZWZhdWx0Q29uZmlnLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGUtPntDdXN0b21lcn0gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVJbmRleCgKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHsgaW5kZXggPT4gJ2N1c3RvbWVyJyB9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0Q3VzdG9tZXIsCiAgICAgICAgKTsKICAgICAgICAkRXJyb3JzKysgdW5sZXNzICRTdWNjZXNzOwoKICAgICAgICAjIGNyZWF0ZSBpbmRleCBmb3IgY3VzdG9tZXIgdXNlcnMKICAgICAgICBteSAlUmVxdWVzdEN1c3RvbWVyVXNlciA9ICgKICAgICAgICAgICAgc2V0dGluZ3MgPT4gJFNlbGYtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSW5kZXhDb25maWctPntDdXN0b21lclVzZXJ9ICAgLy8gJERlZmF1bHRDb25maWcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZS0+e0N1c3RvbWVyVXNlcn0gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZUluZGV4KAogICAgICAgICAgICBJbmRleE5hbWUgPT4geyBpbmRleCA9PiAnY3VzdG9tZXJ1c2VyJyB9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0Q3VzdG9tZXJVc2VyLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgIyBjcmVhdGUgaW5kZXggZm9yIHRpY2tldHMKICAgICAgICBteSAlUmVxdWVzdFRpY2tldCA9ICgKICAgICAgICAgICAgc2V0dGluZ3MgPT4gJFNlbGYtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSW5kZXhDb25maWctPntUaWNrZXR9ICAgLy8gJERlZmF1bHRDb25maWcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZS0+e1RpY2tldH0gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+Q3JlYXRlSW5kZXgoCiAgICAgICAgICAgIEluZGV4TmFtZSA9PiB7IGluZGV4ID0+ICd0aWNrZXQnIH0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3RUaWNrZXQsCiAgICAgICAgKTsKICAgICAgICAkRXJyb3JzKysgdW5sZXNzICRTdWNjZXNzOwoKICAgICAgICAjIGNyZWF0ZSBpbmRleCBmb3IgdG1wYXR0YWNobWVudHMKICAgICAgICBteSAlUmVxdWVzdFRtcEF0dGFjaG1lbnRzID0gKAogICAgICAgICAgICBzZXR0aW5ncyA9PiAkU2VsZi0+SW5kZXhTZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRJbmRleENvbmZpZy0+e1RtcEF0dGFjaG1lbnRzfSAgIC8vICREZWZhdWx0Q29uZmlnLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGUtPntUbXBBdHRhY2htZW50c30gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZUluZGV4KAogICAgICAgICAgICBJbmRleE5hbWUgPT4geyBpbmRleCA9PiAndG1wYXR0YWNobWVudHMnIH0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3RUbXBBdHRhY2htZW50cywKICAgICAgICApOwogICAgICAgICRFcnJvcnMrKyB1bmxlc3MgJFN1Y2Nlc3M7CgogICAgICAgICRTdWNjZXNzID0gMCBpZiAkRXJyb3JzOwogICAgfQoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBMb2NrQWxsID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJVNldHRpbmcgPSAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nR2V0KAogICAgICAgICAgICBOYW1lID0+ICdGcm9udGVuZDo6VG9vbEJhck1vZHVsZSMjIzI1MC1UaWNrZXQ6OkVsYXN0aWNzZWFyY2hGdWxsdGV4dCcsCiAgICAgICAgKTsKICAgICAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nVXBkYXRlKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUjIyMyNTAtVGlja2V0OjpFbGFzdGljc2VhcmNoRnVsbHRleHQnLAogICAgICAgICAgICBJc1ZhbGlkICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBFeGNsdXNpdmVMb2NrR1VJRCA9PiAkRXhjbHVzaXZlTG9ja0dVSUQsCiAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlICAgID0+ICRTZXR0aW5ne0VmZmVjdGl2ZVZhbHVlfSwKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVbmxvY2soCiAgICAgICAgICAgIFVubG9ja0FsbCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIGRpc2FibGUgaW4gY2FzZSBvZiBmYWlsdXJlCiAgICAgICAgbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwogICAgICAgIG15ICRFU1dlYnNlcnZpY2UgICAgID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0VsYXN0aWNzZWFyY2gnLAogICAgICAgICk7CgogICAgICAgICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAleyRFU1dlYnNlcnZpY2V9LAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFN5c0NvbmZpZwogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBMb2NrQWxsID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VwZGF0ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVbmxvY2soCiAgICAgICAgICAgIFVubG9ja0FsbCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAnUmVidWlsZCcgdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWd1cmF0aW9uRGVwbG95KAogICAgICAgIENvbW1lbnRzICAgID0+ICJRdWljayBzZXR1cCBvZiBFbGFzdGljc2VhcmNoIiwKICAgICAgICBBbGxTZXR0aW5ncyA9PiAxLAogICAgICAgIEZvcmNlICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzLCAwOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/FAQ.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UT0JPOjpQZXJsOjpQYXJhbU9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQgcXcoKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBwYXJlbnQgcXcoCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFRU2VhcmNoCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpMYW5ndWFnZQogICAgS2VybmVsOjpTeXN0ZW06OkZBUTo6Q2F0ZWdvcnkKICAgIEtlcm5lbDo6U3lzdGVtOjpGQVE6OlN0YXRlCiAgICBLZXJuZWw6OlN5c3RlbTo6RkFROjpSZWxhdGVkQXJ0aWNsZQogICAgS2VybmVsOjpTeXN0ZW06OkZBUTo6Vm90ZQogICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgopOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RkFRIC0gIEZBUSBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIEZBUSBmdW5jdGlvbnMuIEUuIGcuIHRvIGFkZCBGQVFzIG9yIHRvIGdldCBGQVFzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICAkU2VsZi0+e0xpa2VFc2NhcGVTdHJpbmd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBkZWZhdWx0IG9wdGlvbnMKICAgICRTZWxmLT57Vm90aW5nfSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpWb3RpbmcnKTsKCiAgICAjIGdldCB0aGUgY2FjaGUgVFRMIChpbiBzZWNvbmRzKQogICAgJFNlbGYtPntDYWNoZVRUTH0gPSBpbnQoICRDb25maWdPYmplY3QtPkdldCgnRkFROjpDYWNoZVRUTCcpIHx8IDYwICogNjAgKiAyNCAqIDIgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgIyBjdXJyZW50bHkgdGhlcmUgYXJlIG5vIEZBUSBldmVudCBtb2R1bGVzIGJ1dCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBvdGhlcndpc2UgZXJyb3JzIGFyZQogICAgIyAgICAgbG9nIGR1ZSB0byBzZWFyY2hpbmcgdW5kZWZpbmVkIHNldHRpbmcgaW50byBDb25maWdPYmplY3QuCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICAgICAjICAgICAgICBDb25maWcgPT4gJycsCiAgICAgICAgQ29uZmlnID0+ICdGQVE6OkV2ZW50TW9kdWxlUG9zdCcsCiMgRU8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRkFRR2V0KCkKCmdldCBhbiBGQVEgaXRlbQoKICAgIG15ICVGQVEgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgSXRlbUZpZWxkcyAgICA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBpdGVtIGZpZWxkIGNvbnRlbnQgZm9yIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgRkFRIGl0ZW0gb24gdGhlIHJldHVybiBzdHJ1Y3R1cmUuCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgIyBPcHRpb25hbCwgZGVmYXVsdCAwLiBUbyBpbmNsdWRlIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBGQVEgaXRlbSBvbiB0aGUgcmV0dXJuIHN0cnVjdHVyZS4KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAlRkFRID0gKAogICAgICAgIElEICAgICAgICAgICAgICAgID0+IDMyLAogICAgICAgIEl0ZW1JRCAgICAgICAgICAgID0+IDMyLAogICAgICAgIEZBUUlEICAgICAgICAgICAgID0+IDMyLAogICAgICAgIE51bWJlciAgICAgICAgICAgID0+IDEwMDAzMiwKICAgICAgICBDYXRlZ29yeUlEICAgICAgICA9PiAnMicsCiAgICAgICAgQ2F0ZWdvcnlOYW1lJyAgICAgPT4gJ0NhdGVnb3J5QTo6Q2F0ZWdvcnlCJywKICAgICAgICBDYXRlZ29yeVNob3J0TmFtZSA9PiAnQ2F0ZWdvcnlCJywKICAgICAgICBMYW5ndWFnZUlEICAgICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlICAgICAgICAgID0+ICdlbicsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgPT4gJ0FydGljbGUgVGl0bGUnLAogICAgICAgIEFwcHJvdmVkICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciAwCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZCAgICAgICAgICAgICA9PiAndmFsaWQnLAogICAgICAgIEtleXdvcmRzICAgICAgICAgID0+ICdLZXlXb3JkMSBLZXlXb3JkMicsCiAgICAgICAgVm90ZXMgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWJlciBvZiB2b3RlcwogICAgICAgIFZvdGVSZXN1bHQgICAgICAgID0+ICcwLjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBiZXR3ZWVuIDAuMDAgYW5kIDEwMC4wMAogICAgICAgIFN0YXRlSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgPT4gJ2ludGVybmFsIChhZ2VudCknLCAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCAoY3VzdG9tZXIpJyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAncHVibGljIChhbGwpJwogICAgICAgIFN0YXRlVHlwZUlEICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVUeXBlTmFtZSAgICAgPT4gJ2ludGVybmFsJywgICAgICAgICAgICAgICAgICAgICAjIG9yICdleHRlcm5hbCcgb3IgJ3B1YmxpYycKICAgICAgICBDcmVhdGVkQnkgICAgICAgICA9PiAxLAogICAgICAgIENoYW5nZWQnICAgICAgICAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICBDaGFuZ2VkQnkgICAgICAgICA9PiAnMScsCiAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgPT4gJzIwMTEtMDEtMDUgMjE6NTM6NTAnLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICcxMjk0Mjg2MDMwLTMxLjE2OTcyOTcxMDQ3MzInLCAgIyBGQVEgQXJ0aWNsZSBuYW1lIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN5c3RlbXRpbWUgKyAnLScgKyByYW5kb20gbnVtYmVyCiAgICAgICAgU2VydmljZUxpc3QgICAgICAgPT4geyAnMScgPT4gJ0NvbXB1dGVyJyB9ICAgICAgICAgICAjIEhhc2ggb2YgcmVsYXRlZCBzZXJ2aWNlcwoKICAgICk7CgogICAgbXkgJUZBUSA9ICRGQVFPYmplY3QtPkZBUUdldCgKICAgICAgICBJdGVtSUQgICAgICAgID0+IDEyMywKICAgICAgICBJdGVtRmllbGRzICAgID0+IDEsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICVGQVEgPSAoCgogICAgICAgICMgQ29tcGF0aWJpbGl0eSBJRCBuYW1lcy4KICAgICAgICBJRCAgICAgICAgICAgICAgICA9PiAzMiwKICAgICAgICBGQVFJRCAgICAgICAgICAgICA9PiAzMiwKCiAgICAgICAgSXRlbUlEICAgICAgICAgICAgPT4gMzIsCiAgICAgICAgTnVtYmVyICAgICAgICAgICAgPT4gMTAwMDMyLAogICAgICAgIENhdGVnb3J5SUQgICAgICAgID0+ICcyJywKICAgICAgICBDYXRlZ29yeU5hbWUnICAgICA9PiAnQ2F0ZWdvcnlBOjpDYXRlZ29yeUInLAogICAgICAgIENhdGVnb3J5U2hvcnROYW1lID0+ICdDYXRlZ29yeUInLAogICAgICAgIExhbmd1YWdlSUQgICAgICAgID0+IDEsCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgPT4gJ2VuJywKICAgICAgICBUaXRsZSAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBUaXRsZScsCiAgICAgICAgRmllbGQxICAgICAgICAgICAgPT4gJ1RoZSBTeW1wdG9tcycsCiAgICAgICAgRmllbGQyICAgICAgICAgICAgPT4gJ1RoZSBQcm9ibGVtJywKICAgICAgICBGaWVsZDMgICAgICAgICAgICA9PiAnVGhlIFNvbHV0aW9uJywKICAgICAgICBGaWVsZDQgICAgICAgICAgICA9PiB1bmRlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGFjdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgRmllbGQ1ICAgICAgICAgICAgPT4gdW5kZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBhY3RpdmUgYnkgZGVmYXVsdAogICAgICAgIEZpZWxkNiAgICAgICAgICAgID0+ICdDb21tZW50cycsCiAgICAgICAgQXBwcm92ZWQgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yIDAKICAgICAgICBWYWxpZElEICAgICAgICAgICA9PiAxLAogICAgICAgIENvbnRlbnRUeXBlICAgICAgID0+ICd0ZXh0L3BsYWluJywgICAgICAgICAgICAgICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVmFsaWQgICAgICAgICAgICAgPT4gJ3ZhbGlkJywKICAgICAgICBLZXl3b3JkcyAgICAgICAgICA9PiAnS2V5V29yZDEgS2V5V29yZDInLAogICAgICAgIFZvdGVzICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBudW1iZXIgb2Ygdm90ZXMKICAgICAgICBWb3RlUmVzdWx0ICAgICAgICA9PiAnMC4wMCcsICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgYmV0d2VlbiAwLjAwIGFuZCAxMDAuMDAKICAgICAgICBTdGF0ZUlEICAgICAgICAgICA9PiAxLAogICAgICAgIFN0YXRlICAgICAgICAgICAgID0+ICdpbnRlcm5hbCAoYWdlbnQpJywgICAgICAgICAgICAgIyBvciAnZXh0ZXJuYWwgKGN1c3RvbWVyKScgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJ3B1YmxpYyAoYWxsKScKICAgICAgICBTdGF0ZVR5cGVJRCAgICAgICA9PiAxLAogICAgICAgIFN0YXRlVHlwZU5hbWUgICAgID0+ICdpbnRlcm5hbCcsICAgICAgICAgICAgICAgICAgICAgIyBvciAnZXh0ZXJuYWwnIG9yICdwdWJsaWMnCiAgICAgICAgQ3JlYXRlZEJ5ICAgICAgICAgPT4gMSwKICAgICAgICBDaGFuZ2VkJyAgICAgICAgICA9PiAnMjAxMS0wMS0wNSAyMTo1Mzo1MCcsCiAgICAgICAgQ2hhbmdlZEJ5ICAgICAgICAgPT4gJzEnLAogICAgICAgIENyZWF0ZWQgICAgICAgICAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnMTI5NDI4NjAzMC0zMS4xNjk3Mjk3MTA0NzMyJywgICMgRkFRIEFydGljbGUgbmFtZSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzeXN0ZW10aW1lICsgJy0nICsgcmFuZG9tIG51bWJlcgogICAgICAgIFNlcnZpY2VMaXN0ICAgICAgID0+IHsgJzEnID0+ICdDb21wdXRlcicgfSAgICAgICAgICAgIyBIYXNoIG9mIHJlbGF0ZWQgc2VydmljZXMKICAgICk7Cgo9Y3V0CgpzdWIgRkFRR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZW5hbWUgZnJvbSBJdGVtSUQgdG8gRkFRSUQKICAgIGlmICggJFBhcmFte0ZBUUlEfSApIHsKICAgICAgICAkUGFyYW17SXRlbUlEfSA9ICRQYXJhbXtGQVFJRH07CiAgICB9CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIEl0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRGZXRjaEl0ZW1GaWVsZHMgPSAkUGFyYW17SXRlbUZpZWxkc30gPyAxIDogMDsKCiAgICBteSAkQ2FjaGVLZXkgPSAnRkFRR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSAuICc6Okl0ZW1GaWVsZHM6OicgLiAkRmV0Y2hJdGVtRmllbGRzOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJERCT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc2V0ICVEYXRhIGZyb20gY2FjaGUgaWYgYW55CiAgICBteSAlRGF0YTsKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJURhdGEgPSAleyRDYWNoZX07CiAgICB9CgogICAgIyBvdGhlcndpc2UgZ2V0ICVEYXRhIGZyb20gdGhlIERCCiAgICBlbHNlIHsKCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgaS5mX25hbWUsIGkuZl9sYW5ndWFnZV9pZCwgaS5mX3N1YmplY3QsIGkuY3JlYXRlZCwgaS5jcmVhdGVkX2J5LCBpLmNoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgaS5jaGFuZ2VkX2J5LCBpLmNhdGVnb3J5X2lkLCBpLnN0YXRlX2lkLCBjLm5hbWUsIHMubmFtZSwgbC5uYW1lLCBpLmZfa2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgaS5hcHByb3ZlZCwgaS52YWxpZF9pZCwgaS5jb250ZW50X3R5cGUsIGkuZl9udW1iZXIsIHN0LmlkLCBzdC5uYW1lCiAgICAgICAgICAgICAgICBGUk9NIGZhcV9pdGVtIGksIGZhcV9jYXRlZ29yeSBjLCBmYXFfc3RhdGUgcywgZmFxX3N0YXRlX3R5cGUgc3QsIGZhcV9sYW5ndWFnZSBsCiAgICAgICAgICAgICAgICBXSEVSRSBpLnN0YXRlX2lkID0gcy5pZAogICAgICAgICAgICAgICAgICAgIEFORCBzLnR5cGVfaWQgPSBzdC5pZAogICAgICAgICAgICAgICAgICAgIEFORCBpLmNhdGVnb3J5X2lkID0gYy5pZAogICAgICAgICAgICAgICAgICAgIEFORCBpLmZfbGFuZ3VhZ2VfaWQgPSBsLmlkCiAgICAgICAgICAgICAgICAgICAgQU5EIGkuaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgICAgICVEYXRhID0gKAoKICAgICAgICAgICAgICAgICMgQ29tcGF0aWJpbGl0eSBJRCBuYW1lcy4KICAgICAgICAgICAgICAgIElEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgRkFRSUQgPT4gJFBhcmFte0l0ZW1JRH0sCgogICAgICAgICAgICAgICAgIyBHZXQgZGF0YSBhdHRyaWJ1dGVzLgogICAgICAgICAgICAgICAgSXRlbUlEICAgICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgICAgIExhbmd1YWdlSUQgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgICAgIENyZWF0ZWQgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgICAgIENyZWF0ZWRCeSAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgICAgIENoYW5nZWQgICAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgICAgIENoYW5nZWRCeSAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgPT4gJFJvd1s3XSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFJvd1s4XSwKICAgICAgICAgICAgICAgIENhdGVnb3J5TmFtZSAgPT4gJFJvd1s5XSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJFJvd1sxMF0sCiAgICAgICAgICAgICAgICBMYW5ndWFnZSAgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICAgICAgS2V5d29yZHMgICAgICA9PiAkUm93WzEyXSwKICAgICAgICAgICAgICAgIEFwcHJvdmVkICAgICAgPT4gJFJvd1sxM10sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRSb3dbMTRdLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICA9PiAkUm93WzE1XSwKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgPT4gJFJvd1sxNl0sCiAgICAgICAgICAgICAgICBTdGF0ZVR5cGVJRCAgID0+ICRSb3dbMTddLAogICAgICAgICAgICAgICAgU3RhdGVUeXBlTmFtZSA9PiAkUm93WzE4XSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIEl0ZW1JRCAkUGFyYW17SXRlbUlEfSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBGQVEgaXRlbSBmaWVsZHMgYXJlIHJlcXVpcmVkCiAgICAgICAgaWYgKCRGZXRjaEl0ZW1GaWVsZHMpIHsKCiAgICAgICAgICAgIGZvciBteSAkRmllbGROdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZmllbGQgbmFtZQogICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gIkZpZWxkJEZpZWxkTnVtYmVyIjsKCiAgICAgICAgICAgICAgICAjIGdldCBlYWNoIGZpZWxkIGNvbnRlbnQKICAgICAgICAgICAgICAgICREYXRheyRGaWVsZH0gPSAkU2VsZi0+SXRlbUZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBudW1iZXIKICAgICAgICBpZiAoICEkRGF0YXtOdW1iZXJ9ICkgewoKICAgICAgICAgICAgbXkgJE51bWJlciA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtSUQnKSAuICcwMCcgLiAkRGF0YXtJdGVtSUR9OwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCBmX251bWJlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJE51bWJlciwgXCREYXRhe0l0ZW1JRH0gXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRhe051bWJlcn0gPSAkTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGNhdGVnb3J5IGxvbmcgbmFtZXMKICAgICAgICBteSAkQ2F0ZWdvcnlUcmVlID0gJFNlbGYtPkNhdGVnb3J5VHJlZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIGNhdGVnb3J5IHNob3J0IG5hbWUKICAgICAgICAkRGF0YXtDYXRlZ29yeVNob3J0TmFtZX0gPSAkRGF0YXtDYXRlZ29yeU5hbWV9OwoKICAgICAgICAjIGdldCB0aGUgY2F0ZWdvcnkgbG9uZyBuYW1lCiAgICAgICAgJERhdGF7Q2F0ZWdvcnlOYW1lfSA9ICRDYXRlZ29yeVRyZWUtPnsgJERhdGF7Q2F0ZWdvcnlJRH0gfTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJERhdGF7VmFsaWR9ID0gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfTsKIyBGQVEgU2VydmljZQoKICAgICAgICAjIGdldCByZWxhdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJFNlcnZpY2VzUmVsYXRlZCA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFNlcnZpY2VzUmVsYXRlZCkgewogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2UgKEAkU2VydmljZXNSZWxhdGVkKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtTZXJ2aWNlTGlzdH0tPnsgJFNlcnZpY2UtPnsnU2VydmljZUlEJ30gfSA9ICRTZXJ2aWNlLT57J05hbWUnfTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBlbyBGQVEgU2VydmljZQoKICAgICAgICAjIGNhY2hlIHJlc3VsdAogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRkFRJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJURhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZvdGVEYXRhOwogICAgaWYgKCAkU2VsZi0+e1ZvdGluZ30gKSB7CiAgICAgICAgJFZvdGVEYXRhID0gJFNlbGYtPkl0ZW1Wb3RlRGF0YUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZnJvbSBjb25maWcKICAgIG15ICREZWNpbWFsUGxhY2VzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkV4cGxvcmVyOjpJdGVtTGlzdDo6Vm90aW5nUmVzdWx0RGVjaW1hbFBsYWNlcycpIHx8IDA7CgogICAgIyBmb3JtYXQgdGhlIHZvdGUgcmVzdWx0CiAgICBteSAkVm90ZVJlc3VsdCA9IHNwcmludGYoICIlMC4iIC4gJERlY2ltYWxQbGFjZXMgLiAiZiIsICRWb3RlRGF0YS0+e1Jlc3VsdH0gfHwgMCApOwoKICAgICMgYWRkIHZvdGluZyBpbmZvcm1hdGlvbiB0byBGQVEgaXRlbQogICAgJERhdGF7Vm90ZVJlc3VsdH0gPSAkVm90ZVJlc3VsdDsKICAgICREYXRhe1ZvdGVzfSAgICAgID0gJFZvdGVEYXRhLT57Vm90ZXN9IHx8IDA7CgogICAgIyBjaGVjayBpZiBuZWVkIHRvIHJldHVybiBEeW5hbWljRmllbGRzCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciB0aGUgb2JqZWN0IHR5cGUgRkFRCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0ZBUScKICAgICAgICApOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgICAgICMgdmFsaWRhdGUgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIGR5bmFtaWMgZmllbGQgbmFtZSBhbmQgdmFsdWUgaW50byB0aGUgZGF0YSBoYXNoCiAgICAgICAgICAgICREYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgpzdWIgSXRlbUZpZWxkR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIEl0ZW1JRCBGaWVsZCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIHZhbGlkIGZpZWxkIG5hbWUKICAgIGlmICggJFBhcmFte0ZpZWxkfSAhfiBteyBcQSBGaWVsZCBbMS02XSBceiB9bXN4aSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkICckUGFyYW17RmllbGR9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdJdGVtRmllbGRHZXQ6Okl0ZW1JRDo6JyAuICRQYXJhbXtJdGVtSUR9OwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBGaWVsZAogICAgaWYgKCByZWYgJENhY2hlIGVxICdIQVNIJyAmJiBleGlzdHMgJENhY2hlLT57ICRQYXJhbXtGaWVsZH0gfSApIHsKCiAgICAgICAgcmV0dXJuICRDYWNoZS0+eyAkUGFyYW17RmllbGR9IH07CiAgICB9CgogICAgIyBjcmVhdGUgYSBmaWVsZCBsb29rdXAgdGFibGUKICAgIG15ICVGaWVsZExvb2t1cCA9ICgKICAgICAgICBGaWVsZDEgPT4gJ2ZfZmllbGQxJywKICAgICAgICBGaWVsZDIgPT4gJ2ZfZmllbGQyJywKICAgICAgICBGaWVsZDMgPT4gJ2ZfZmllbGQzJywKICAgICAgICBGaWVsZDQgPT4gJ2ZfZmllbGQ0JywKICAgICAgICBGaWVsZDUgPT4gJ2ZfZmllbGQ1JywKICAgICAgICBGaWVsZDYgPT4gJ2ZfZmllbGQ2JywKICAgICk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgJyAuICRGaWVsZExvb2t1cHsgJFBhcmFte0ZpZWxkfSB9IC4gJwogICAgICAgICAgICBGUk9NIGZhcV9pdGVtCiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRmllbGQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRmllbGQgPSAkUm93WzBdIHx8ICcnOwogICAgfQoKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgQ2FjaGUgZmlsZSBmb3IgSXRlbUlEIGFscmVhZHkgZXhpc3RzLCBhZGQgZmllbGQgZGF0YS4KICAgICAgICAkQ2FjaGUtPnsgJFBhcmFte0ZpZWxkfSB9ID0gJEZpZWxkOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQ3JlYXRlIG5ldyBjYWNoZSBmaWxlLgogICAgICAgICRDYWNoZSA9IHsKICAgICAgICAgICAgJFBhcmFte0ZpZWxkfSA9PiAkRmllbGQsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+ICRDYWNoZSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICRGaWVsZDsKfQoKPWhlYWQyIEZBUUFkZCgpCgphZGQgYW4gYXJ0aWNsZQoKICAgIG15ICRJdGVtSUQgPSAkRkFRT2JqZWN0LT5GQVFBZGQoCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ2F0ZWdvcnlJRCAgPT4gMSwKICAgICAgICBTdGF0ZUlEICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlSUQgID0+IDEsCiAgICAgICAgTnVtYmVyICAgICAgPT4gJzEzNDAyJywgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgS2V5d29yZHMgICAgPT4gJ3NvbWUga2V5d29yZHMnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQxICAgICAgPT4gJ1N5bXB0b20uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQyICAgICAgPT4gJ1Byb2JsZW0uLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQzICAgICAgPT4gJ1NvbHV0aW9uLi4uJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ0ICAgICAgPT4gJ0ZpZWxkNC4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ1ICAgICAgPT4gJ0ZpZWxkNS4uLicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmllbGQ2ICAgICAgPT4gJ0NvbW1lbnQuLi4nLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQXBwcm92ZWQgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRJdGVtSUQgPSAzNDsKCj1jdXQKCnN1YiBGQVFBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFRpdGxlIFVzZXJJRCBDb250ZW50VHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBWYWxpZElECiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZElEfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIHZhbGlkIGlkcwogICAgICAgIG15IEBWYWxpZElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICAgICAkUGFyYW17VmFsaWRJRH0gPSAkVmFsaWRJRHNbMF07CiAgICB9CgogICAgIyBjaGVjayBuYW1lCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFBhcmFte05hbWV9ID0gdGltZSgpIC4gJy0nIC4gcmFuZCgxMDApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgbnVtYmVyCiAgICBpZiAoICEkUGFyYW17TnVtYmVyfSApIHsKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtSUQnKSAuIHJhbmQoMTAwKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFwcHJvdmFsIGZlYXR1cmUgaXMgdXNlZAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICkgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgICAgICBteSAlR3JvdXBzID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBhcHByb3ZhbCBncm91cAogICAgICAgIG15ICRBcHByb3ZhbEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsR3JvdXAnKTsKCiAgICAgICAgIyBzZXQgZGVmYXVsdCB0byAwIGlmIGFwcHJvdmVkIHBhcmFtIGlzIG5vdCBnaXZlbgogICAgICAgICMgb3IgaWYgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSByaWdodHMgdG8gYXBwcm92ZQogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFte0FwcHJvdmVkfSB8fCAhJEdyb3Vwc3skQXBwcm92YWxHcm91cH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtBcHByb3ZlZH0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGFwcHJvdmFsIGZlYXR1cmUgaXMgbm90IGFjdGl2YXRlZCwgYSBuZXcgRkFRIGl0ZW0gaXMgYWx3YXlzIGFwcHJvdmVkCiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17QXBwcm92ZWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBJTlNFUlQgSU5UTyBmYXFfaXRlbQogICAgICAgICAgICAgICAgKGZfbnVtYmVyLCBmX25hbWUsIGZfbGFuZ3VhZ2VfaWQsIGZfc3ViamVjdCwKICAgICAgICAgICAgICAgIGNhdGVnb3J5X2lkLCBzdGF0ZV9pZCwgZl9rZXl3b3JkcywgYXBwcm92ZWQsIHZhbGlkX2lkLCBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICBmX2ZpZWxkMSwgZl9maWVsZDIsIGZfZmllbGQzLCBmX2ZpZWxkNCwgZl9maWVsZDUsIGZfZmllbGQ2LAogICAgICAgICAgICAgICAgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSkKICAgICAgICAgICAgVkFMVUVTCiAgICAgICAgICAgICAgICAoPywgPywgPywgPywKICAgICAgICAgICAgICAgID8sID8sID8sID8sID8sID8sCiAgICAgICAgICAgICAgICA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICAgICAgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TnVtYmVyfSwgICAgIFwkUGFyYW17TmFtZX0sICAgIFwkUGFyYW17TGFuZ3VhZ2VJRH0sIFwkUGFyYW17VGl0bGV9LAogICAgICAgICAgICBcJFBhcmFte0NhdGVnb3J5SUR9LCBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte0tleXdvcmRzfSwgICBcJFBhcmFte0FwcHJvdmVkfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwgICAgXCRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIFwkUGFyYW17RmllbGQxfSwgICAgIFwkUGFyYW17RmllbGQyfSwgXCRQYXJhbXtGaWVsZDN9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkNH0sICAgICBcJFBhcmFte0ZpZWxkNX0sIFwkUGFyYW17RmllbGQ2fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIGdldCB0aGUgaWQgb2YgdGhlIG5ld2x5IGluc2VydGVkIEZBUSBhcnRpY2xlCiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCBGUk9NIGZhcV9pdGVtCiAgICAgICAgV0hFUkUgZl9udW1iZXIgPSA/CiAgICAgICAgICAgIEFORCBmX25hbWUgPSA/CiAgICAgICAgICAgIEFORCBmX2xhbmd1YWdlX2lkID0gPwogICAgICAgICAgICBBTkQgY2F0ZWdvcnlfaWQgPSA/CiAgICAgICAgICAgIEFORCBzdGF0ZV9pZCA9ID8KICAgICAgICAgICAgQU5EIGFwcHJvdmVkID0gPwogICAgICAgICAgICBBTkQgdmFsaWRfaWQgPSA/CiAgICAgICAgICAgIEFORCBjcmVhdGVkX2J5ID0gPwogICAgICAgICAgICBBTkQgY2hhbmdlZF9ieSA9ID8nOwoKICAgICMgaGFuZGxlIHRoZSB0aXRsZQogICAgaWYgKCAkUGFyYW17VGl0bGV9ICkgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgZl9zdWJqZWN0ID0gPyAnOwogICAgfQoKICAgICMgYWRkaXRpb25hbCBTUUwgZm9yIHRoZSBjYXNlIHRoYXQgdGhlIHRpdGxlIGlzIGFuIGVtcHR5IHN0cmluZwogICAgIyBhbmQgdGhlIGRhdGFiYXNlIGlzIG9yYWNsZSwgd2hpY2ggdHJlYXRzIGVtcHR5IHN0cmluZ3MgYXMgTlVMTAogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCAoKGZfc3ViamVjdCA9ID8pIE9SIChmX3N1YmplY3QgSVMgTlVMTCkpICc7CiAgICB9CgogICAgIyBoYW5kbGUgdGhlIGtleXdvcmRzCiAgICBpZiAoICRQYXJhbXtLZXl3b3Jkc30gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCBmX2tleXdvcmRzID0gPyAnOwogICAgfQoKICAgICMgYWRkaXRpb25hbCBTUUwgZm9yIHRoZSBjYXNlIHRoYXQga2V5d29yZHMgaXMgYW4gZW1wdHkgc3RyaW5nCiAgICAjIGFuZCB0aGUgZGF0YWJhc2UgaXMgb3JhY2xlLCB3aGljaCB0cmVhdHMgZW1wdHkgc3RyaW5ncyBhcyBOVUxMCiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EICgoZl9rZXl3b3JkcyA9ID8pIE9SIChmX2tleXdvcmRzIElTIE5VTEwpKSAnOwogICAgfQogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgaWQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOdW1iZXJ9LAogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte0xhbmd1YWdlSUR9LAogICAgICAgICAgICBcJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBcJFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICBcJFBhcmFte0FwcHJvdmVkfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VGl0bGV9LAogICAgICAgICAgICBcJFBhcmFte0tleXdvcmRzfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyB1cGRhdGUgbnVtYmVyCiAgICBteSAkTnVtYmVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW1JRCcpIC4gJzAwJyAuICRJRDsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCBmX251bWJlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCROdW1iZXIsIFwkSUQgXSwKICAgICk7CgogICAgIyBhZGQgaGlzdG9yeQogICAgJFNlbGYtPkZBUUhpc3RvcnlBZGQoCiAgICAgICAgTmFtZSAgID0+ICdDcmVhdGVkJywKICAgICAgICBJdGVtSUQgPT4gJElELAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAjIHRyaWdnZXIgRkFRQ3JlYXRlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdGQVFDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgSXRlbUlEID0+ICRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCgojIEZBUSBTZXJ2aWNlCgogICAgIyBhZGQgc2VydmljZXMKCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggQHsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgbXkgJEFkZFN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZUFkZCgKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUGFyYW17U2VydmljZUxpc3R9LT57JFNlcnZpY2VJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQojIEVPIEZBUSBTZXJ2aWNlCgogICAgIyBjaGVjayBpZiBhcHByb3ZhbCBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUmVxdWlyZWQnKSAmJiAhJFBhcmFte0FwcHJvdmVkfSApIHsKCiAgICAgICAgbXkgJEFwcHJvdmFsUmVxdWlyZWQgICAgICAgID0gMTsKICAgICAgICBteSAkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWw6OkluY2x1ZGVJbnRlcm5hbCcpOwoKICAgICAgICBpZiAoICEkQXBwcm92YWxJbmNsdWRlSW50ZXJuYWwgKSB7CiAgICAgICAgICAgIG15ICVJbnRlcm5hbFN0YXRlID0gJFNlbGYtPlN0YXRlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGVzICA9PiBbJ2ludGVybmFsJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEludGVybmFsU3RhdGV7ICRQYXJhbXtTdGF0ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEFwcHJvdmFsUmVxdWlyZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgYXBwcm92YWwgdGlja2V0CiAgICAgICAgaWYgKCAkQXBwcm92YWxSZXF1aXJlZCApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0ZBUUFwcHJvdmFsVGlja2V0Q3JlYXRlKAogICAgICAgICAgICAgICAgSXRlbUlEICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIExhbmd1YWdlSUQgPT4gJFBhcmFte0xhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgRkFRTnVtYmVyICA9PiAkTnVtYmVyLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgY3JlYXRlIGFwcHJvdmFsIHRpY2tldCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIENsZWFudXAgdGhlIGNhY2hlIGZvciAnRkFRS2V5d29yZEFydGljbGVMaXN0JyBhbmQgdGhlIHJ1bnRpbWUgY2FjaGUuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLAogICAgKTsKCiAgICAjIENsZWFudXAgdGhlIHJ1bnRpbWUgY2FjaGUgZnJvbSB0aGUgRkFRL0NhdGVnb3J5LnBtLgogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9OwoKICAgIHJldHVybiAkSUQ7Cn0KCj1oZWFkMiBGQVFVcGRhdGUoKQoKdXBkYXRlIGFuIGFydGljbGUKCiAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgID0+IDEyMywKICAgICAgICBDYXRlZ29yeUlEICA9PiAxLAogICAgICAgIFN0YXRlSUQgICAgID0+IDEsCiAgICAgICAgTGFuZ3VhZ2VJRCAgPT4gMSwKICAgICAgICBBcHByb3ZlZCAgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhbicsICAgICAjIG9yICd0ZXh0L2h0bWwnCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgRmllbGQxICAgICAgPT4gJ1Byb2JsZW0uLi4nLAogICAgICAgIEZpZWxkMiAgICAgID0+ICdTb2x1dGlvbi4uLicsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBBcHByb3ZhbE9mZiA9PiAxLCAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIChpZiBzZXQgdG8gMSBhcHByb3ZhbCBpcyBpZ25vcmVkLiBUaGlzIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgaW1wb3J0YW50IHdoZW4gY2FsbGVkIGZyb20gRkFRSW5saW5lQXR0YWNobWVudFVSTFVwZGF0ZSkKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0gMSA7ICAgICAgICAgICMgb3IgdW5kZWYgaWYgY2FuJ3QgdXBkYXRlIHRoZSBGQVEgYXJ0aWNsZQoKPWN1dAoKc3ViIEZBUVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBUaXRsZSBVc2VySUQgQ29udGVudFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzID0+IDAsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpZiBubyBuYW1lIHdhcyBnaXZlbiB1c2Ugb2xkIG5hbWUgZnJvbSBGQVEKICAgIGlmICggISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkUGFyYW17TmFtZX0gPSAkRkFRRGF0YXtOYW1lfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBWYWxpZElECiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICAkUGFyYW17VmFsaWRJRH0gPSAkRkFRRGF0YXtWYWxpZElEfTsKICAgIH0KIyBGQVEgU2VydmljZXMKCiAgICBteSAkU2VydmljZXNJbkRCID0gJFNlbGYtPkZBUVNlcnZpY2VHZXQoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgKTsKCiAgICBteSAlU2VydmljZXNJbkRCOwogICAgbWFwIHsgJFNlcnZpY2VzSW5EQnsgJF8tPntTZXJ2aWNlSUR9IH0rKyB9IEB7JFNlcnZpY2VzSW5EQn07CgogICAgbXkgJFNlcnZpY2VzQ2hhbmdlZCA9IDA7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgIFNFUlZJQ0VJRDogZm9yIG15ICRTZXJ2aWNlSUQgKCBAeyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICBpZiAoIGV4aXN0cyAkU2VydmljZXNJbkRCeyRTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlc0luREJ7JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRBZGRTdWNjZXNzID0gJFNlbGYtPkZBUVNlcnZpY2VBZGQoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUGFyYW17U2VydmljZUxpc3R9LT57JFNlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlcnZpY2VzQ2hhbmdlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlc0luREIgKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZURlbGV0ZSgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlc0NoYW5nZWQrKzsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgaWYgKCRTZXJ2aWNlc0NoYW5nZWQpIHsKICAgICAgICAkU2VsZi0+X0RlbGV0ZUZyb21GQVFDYWNoZSglUGFyYW0pOwogICAgfQojIGVvIEZBUSBTZXJ2aWNlcwoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBmYXFfaXRlbSBTRVQKICAgICAgICAgICAgICAgIGZfbmFtZSA9ID8sIGZfbGFuZ3VhZ2VfaWQgPSA/LCBmX3N1YmplY3QgPSA/LCBjYXRlZ29yeV9pZCA9ID8sCiAgICAgICAgICAgICAgICBzdGF0ZV9pZCA9ID8sIGZfa2V5d29yZHMgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbnRlbnRfdHlwZSA9ID8sCiAgICAgICAgICAgICAgICBmX2ZpZWxkMSA9ID8sIGZfZmllbGQyID0gPywKICAgICAgICAgICAgICAgIGZfZmllbGQzID0gPywgZl9maWVsZDQgPSA/LAogICAgICAgICAgICAgICAgZl9maWVsZDUgPSA/LCBmX2ZpZWxkNiA9ID8sCiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gY3VycmVudF90aW1lc3RhbXAsCiAgICAgICAgICAgICAgICBjaGFuZ2VkX2J5ID0gPwogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICBcJFBhcmFte0xhbmd1YWdlSUR9LCBcJFBhcmFte1RpdGxlfSwgICBcJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte0tleXdvcmRzfSwgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZDF9LCAgXCRQYXJhbXtGaWVsZDJ9LAogICAgICAgICAgICBcJFBhcmFte0ZpZWxkM30sICBcJFBhcmFte0ZpZWxkNH0sCiAgICAgICAgICAgIFwkUGFyYW17RmllbGQ1fSwgIFwkUGFyYW17RmllbGQ2fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CgojIFJvdGhlciBPU1MgLyBFbGFzdGljc2VhcmNoLUZBUQogICAgIyB0cmlnZ2VyIEZBUVVwZGF0ZQogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRkFRVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVwZGF0ZSBhcHByb3ZhbAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICYmICEkUGFyYW17QXBwcm92YWxPZmZ9ICkgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgICAgICBteSAlR3JvdXBzID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBhcHByb3ZhbCBncm91cAogICAgICAgIG15ICRBcHByb3ZhbEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsR3JvdXAnKTsKCiAgICAgICAgIyBzZXQgYXBwcm92YWwgdG8gMCBpZiB1c2VyIGRvZXMgbm90IGhhdmUgdGhlIHJpZ2h0cyB0byBhcHByb3ZlCiAgICAgICAgaWYgKCAhJEdyb3Vwc3skQXBwcm92YWxHcm91cH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtBcHByb3ZlZH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGFwcHJvdmFsCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0ZBUUFwcHJvdmFsVXBkYXRlKAogICAgICAgICAgICBJdGVtSUQgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgQXBwcm92ZWQgPT4gJFBhcmFte0FwcHJvdmVkfSB8fCAwLAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSBhcHByb3ZhbCBmb3IgSXRlbUlEICRQYXJhbXtJdGVtSUR9ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjYWNoZQogICAgICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CiAgICB9CgogICAgIyBjaGVjayBpZiBoaXN0b3J5IGVudHJ5IHNob3VsZCBiZSBhZGRlZAogICAgcmV0dXJuIDEgaWYgJFBhcmFte0hpc3RvcnlPZmZ9OwoKICAgICMgd3JpdGUgaGlzdG9yeSBlbnRyeQogICAgJFNlbGYtPkZBUUhpc3RvcnlBZGQoCiAgICAgICAgTmFtZSAgID0+ICdVcGRhdGVkJywKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEF0dGFjaG1lbnRBZGQoKQoKYWRkIGFydGljbGUgYXR0YWNobWVudHMsIHJldHVybnMgdGhlIGF0dGFjaG1lbnQgaWQKCiAgICBteSAkQXR0YWNobWVudElEID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEFkZCgKICAgICAgICBJdGVtSUQgICAgICA9PiAxMjMsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQveG1sJywKICAgICAgICBGaWxlbmFtZSAgICA9PiAnc29tZW5hbWUueG1sJywKICAgICAgICBJbmxpbmUgICAgICA9PiAxLCAgICgwfDEsIGRlZmF1bHQgMCkKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEF0dGFjaG1lbnRJRCA9IDEyMyA7ICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBjYW4ndCBhZGQgdGhlIGF0dGFjaG1lbnQKCj1jdXQKCnN1YiBBdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIENvbnRlbnQgQ29udGVudFR5cGUgRmlsZW5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdAogICAgaWYgKCAhJFBhcmFte0lubGluZX0gKSB7CiAgICAgICAgJFBhcmFte0lubGluZX0gPSAwOwogICAgfQoKICAgICMgZ2V0IGF0dGFjaG1lbnQgc2l6ZQogICAgewogICAgICAgIHVzZSBieXRlczsKICAgICAgICAkUGFyYW17RmlsZXNpemV9ID0gbGVuZ3RoICRQYXJhbXtDb250ZW50fTsKICAgICAgICBubyBieXRlczsKICAgIH0KCiAgICAjIGdldCBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgIG15IEBJbmRleCA9ICRTZWxmLT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGZpbGVuYW1lCiAgICBteSAkTmV3RmlsZU5hbWUgPSAkUGFyYW17RmlsZW5hbWV9OwoKICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaCBvZiBhbGwgZXhpc3RpbmcgZmlsZSBuYW1lcwogICAgbXkgJVVzZWRGaWxlOwogICAgZm9yIG15ICRGaWxlIChASW5kZXgpIHsKICAgICAgICAkVXNlZEZpbGV7ICRGaWxlLT57RmlsZW5hbWV9IH0gPSAxOwogICAgfQoKICAgICMgdHJ5IHRvIG1vZGlmeSB0aGUgdGhlIGZpbGUgbmFtZSBieSBhZGRpbmcgYSBudW1iZXIgaWYgaXQgZXhpc3RzIGFscmVhZHkKICAgIG15ICRDb3VudCA9IDA7CiAgICB3aGlsZSAoICRDb3VudCA8IDUwICkgewoKICAgICAgICAjIGluY3JlYXNlIGNvdW50ZXIKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBpZiB0aGUgZmlsZSBuYW1lIGV4aXN0cwogICAgICAgIGlmICggZXhpc3RzICRVc2VkRmlsZXskTmV3RmlsZU5hbWV9ICkgewoKICAgICAgICAgICAgIyBmaWxlbmFtZSBoYXMgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uIChlLmcuIHRlc3QuanBnKQogICAgICAgICAgICBpZiAoICRQYXJhbXtGaWxlbmFtZX0gPX4gbXsgXEEgKC4qKSBcLiAoLis/KSBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJE5ld0ZpbGVOYW1lID0gIiQxLSRDb3VudC4kMiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmV3RmlsZU5hbWUgPSAiJFBhcmFte0ZpbGVuYW1lfS0kQ291bnQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgdGhlIG5ldyBmaWxlbmFtZQogICAgJFBhcmFte0ZpbGVuYW1lfSA9ICROZXdGaWxlTmFtZTsKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZW5jb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCEhIQogICAgaWYgKCAhJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJFBhcmFte0NvbnRlbnR9ICk7CgogICAgICAgICRQYXJhbXtDb250ZW50fSA9IE1JTUU6OkJhc2U2NDo6ZW5jb2RlX2Jhc2U2NCggJFBhcmFte0NvbnRlbnR9ICk7CiAgICB9CgogICAgIyB3cml0ZSBhdHRhY2htZW50IHRvIGRiCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBmYXFfYXR0YWNobWVudCAnIC4KICAgICAgICAgICAgJyAoZmFxX2lkLCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGNvbnRlbnQsIGlubGluZWF0dGFjaG1lbnQsICcgLgogICAgICAgICAgICAnIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIFZBTFVFUyAnIC4KICAgICAgICAgICAgJyAoPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwgIFwkUGFyYW17RmlsZW5hbWV9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwgXCRQYXJhbXtGaWxlc2l6ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Q29udGVudH0sIFwkUGFyYW17SW5saW5lfSwgICBcJFBhcmFte1VzZXJJRH0sICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBhdHRhY2htZW50IGlkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCAnCiAgICAgICAgICAgIC4gJ0ZST00gZmFxX2F0dGFjaG1lbnQgJwogICAgICAgICAgICAuICdXSEVSRSBmYXFfaWQgPSA/IEFORCBmaWxlbmFtZSA9ID8gJwogICAgICAgICAgICAuICdBTkQgY29udGVudF90eXBlID0gPyBBTkQgY29udGVudF9zaXplID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBpbmxpbmVhdHRhY2htZW50ID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBjcmVhdGVkX2J5ID0gPyBBTkQgY2hhbmdlZF9ieSA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sIFwkUGFyYW17RmlsZW5hbWV9LCBcJFBhcmFte0NvbnRlbnRUeXBlfSwgXCRQYXJhbXtGaWxlc2l6ZX0sCiAgICAgICAgICAgIFwkUGFyYW17SW5saW5lfSwgXCRQYXJhbXtVc2VySUR9LCAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRBdHRhY2htZW50SUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXR0YWNobWVudElEID0gJFJvd1swXTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAjIHRyaWdnZXIgQXR0YWNobWVudEFkZC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRkFRQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJFBhcmFte0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBhcmFte0NvbnRlbnR9LAogICAgICAgICAgICBGaWxlc2l6ZSAgICA9PiAkUGFyYW17RmlsZXNpemV9LAogICAgICAgICAgICBJbmxpbmUgICAgICA9PiAkUGFyYW17SW5saW5lfSwKICAgICAgICAgICAgSXRlbUlEICAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICByZXR1cm4gJEF0dGFjaG1lbnRJRDsKfQoKPWhlYWQyIEF0dGFjaG1lbnRHZXQoKQoKZ2V0IGF0dGFjaG1lbnQgb2YgYXJ0aWNsZQoKICAgIG15ICVGaWxlID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgICAgIEZpbGVJRCA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJUZpbGUgPSAoCiAgICAgICAgRmlsZXNpemUgICAgPT4gJzU0MDI4NicsICAgICAgICAgICAgICAgICMgZmlsZSBzaXplIGluIGJ5dGVzCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgIEZpbGVuYW1lICAgID0+ICdFcnJvci5qcGcnLAogICAgICAgIENvbnRlbnQgICAgID0+ICcuLi4nICAgICAgICAgICAgICAgICAgICAjIGZpbGUgYmluYXJ5IGNvbnRlbnQKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBGaWxlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGNvbnRlbnQgJwogICAgICAgICAgICAuICdGUk9NIGZhcV9hdHRhY2htZW50ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/IEFORCBmYXFfaWQgPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgY3JlYXRlZCcsCiAgICAgICAgQmluZCAgID0+IFsgXCRQYXJhbXtGaWxlSUR9LCBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBFbmNvZGUgPT4gWyAxLCAxLCAxLCAwIF0sCiAgICAgICAgTGltaXQgID0+IDEsCiAgICApOwoKICAgIG15ICVGaWxlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCBhbmQgbm90IEJMT0IKICAgICAgICBpZiAoICEkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0RpcmVjdEJsb2InKSApIHsKICAgICAgICAgICAgJFJvd1szXSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJFJvd1szXSApOwogICAgICAgIH0KCiAgICAgICAgJEZpbGV7RmlsZW5hbWV9ICAgID0gJFJvd1swXTsKICAgICAgICAkRmlsZXtDb250ZW50VHlwZX0gPSAkUm93WzFdOwogICAgICAgICRGaWxle0ZpbGVzaXplfSAgICA9ICRSb3dbMl07CiAgICAgICAgJEZpbGV7Q29udGVudH0gICAgID0gJFJvd1szXTsKICAgIH0KCiAgICByZXR1cm4gJUZpbGU7Cn0KCj1oZWFkMiBBdHRhY2htZW50RGVsZXRlKCkKCmRlbGV0ZSBhdHRhY2htZW50IG9mIGFydGljbGUKCiAgICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICAgICBGaWxlSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0gMSA7ICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIGF0dGFjaG1lbnQgY291bGQgbm90IGJlIGRlbGV0ZWQKCj1jdXQKCnN1YiBBdHRhY2htZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIEZpbGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgIG15ICVBdHRhY2htZW50ID0gJFNlbGYtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIEZpbGVJRCA9PiAkUGFyYW17RmlsZUlEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwojIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfYXR0YWNobWVudCBXSEVSRSBpZCA9ID8gQU5EIGZhcV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtGaWxlSUR9LCBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAjIHRyaWdnZXIgRkFRQXR0YWNobWVudERlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0ZBUUF0dGFjaG1lbnREZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEl0ZW1JRCAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBOdW1iZXIgICA9PiAkUGFyYW17TnVtYmVyfSwKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJEF0dGFjaG1lbnR7RmlsZW5hbWV9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiMgRU8gRWxhc3RpY3NlYXJjaC1GQVEKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEF0dGFjaG1lbnRJbmRleCgpCgpyZXR1cm4gYW4gYXR0YWNobWVudCBpbmRleCBvZiBhbiBhcnRpY2xlCgogICAgbXkgQEluZGV4ID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCAgICAgPT4gMTIzLAogICAgICAgIFNob3dJbmxpbmUgPT4gMCwgICAoIDB8MSwgZGVmYXVsdCAxKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgIEBJbmRleCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEZpbGVzaXplICAgID0+ICc1MjcuNiBLQnl0ZXMnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdFcnJvci5qcGcnLAogICAgICAgICAgICBGaWxlc2l6ZVJhdyA9PiA1NDAyODYsCiAgICAgICAgICAgIEZpbGVJRCAgICAgID0+IDYsCiAgICAgICAgICAgIElubGluZSAgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7LAogICAgICAgICAgICBGaWxlc2l6ZSA9PiAnNDMwLjAgS0J5dGVzJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICBGaWxlbmFtZSA9PiAnU29sdXRpb24uanBnJywKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gNDQwMjg2LAogICAgICAgICAgICBGaWxlSUQgPT4gNSwKICAgICAgICAgICAgSW5saW5lID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpbGVzaXplID0+ICcyOTYgQnl0ZXMnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICdBZGRpdGlvbmFsQ29tbWVudHMudHh0JywKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gMjk2LAogICAgICAgICAgICBGaWxlSUQgPT4gNywKICAgICAgICAgICAgSW5saW5lID0+IDAsCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEluZGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZpbGVuYW1lLCBjb250ZW50X3R5cGUsIGNvbnRlbnRfc2l6ZSwgaW5saW5lYXR0YWNobWVudCAnCiAgICAgICAgICAgIC4gJ0ZST00gZmFxX2F0dGFjaG1lbnQgJwogICAgICAgICAgICAuICdXSEVSRSBmYXFfaWQgPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgZmlsZW5hbWUnLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMTAwLAogICAgKTsKCiAgICBteSBASW5kZXg7CiAgICBBVFRBQ0hNRU5UOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRJRCAgICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgbXkgJEZpbGVuYW1lICAgID0gJFJvd1sxXTsKICAgICAgICBteSAkQ29udGVudFR5cGUgPSAkUm93WzJdOwogICAgICAgIG15ICRGaWxlc2l6ZSAgICA9ICRSb3dbM107CiAgICAgICAgbXkgJElubGluZSAgICAgID0gJFJvd1s0XTsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyBpbmxpbmUgYXR0YWNobWVudHMKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1Nob3dJbmxpbmV9ICYmICEkUGFyYW17U2hvd0lubGluZX0gJiYgJElubGluZSApIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRvIGh1bWFuIHJlYWRhYmxlIGZpbGUgc2l6ZQogICAgICAgIG15ICRGaWxlU2l6ZVJhdyA9ICRGaWxlc2l6ZTsKICAgICAgICBpZiAoJEZpbGVzaXplKSB7CiAgICAgICAgICAgIGlmICggJEZpbGVzaXplID4gKCAxMDI0ICogMTAyNCApICkgewogICAgICAgICAgICAgICAgJEZpbGVzaXplID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoICRGaWxlc2l6ZSAvICggMTAyNCAqIDEwMjQgKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZpbGVzaXplID4gMTAyNCApIHsKICAgICAgICAgICAgICAgICRGaWxlc2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCAoICRGaWxlc2l6ZSAvIDEwMjQgKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZpbGVzaXplID0gJEZpbGVzaXplIC4gJyBCeXRlcyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQEluZGV4LCB7CiAgICAgICAgICAgIEZpbGVJRCAgICAgID0+ICRJRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIEZpbGVzaXplICAgID0+ICRGaWxlc2l6ZSwKICAgICAgICAgICAgRmlsZXNpemVSYXcgPT4gJEZpbGVTaXplUmF3LAogICAgICAgICAgICBJbmxpbmUgICAgICA9PiAkSW5saW5lLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBJbmRleDsKfQoKPWhlYWQyIEZBUUNvdW50KCkKCkNvdW50IHRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgZm9yIGEgZGVmaW5lZCBjYXRlZ29yeS4gT25seSB2YWxpZCBGQVEgYXJ0aWNsZXMgd2lsbCBiZSBjb3VudGVkLgoKICAgIG15ICRBcnRpY2xlQ291bnQgPSAkRkFRT2JqZWN0LT5GQVFDb3VudCgKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbMSwyLDMsNF0sCiAgICAgICAgSXRlbVN0YXRlcyA9PiAgewogICAgICAgICAgICAxID0+ICdpbnRlcm5hbCcsCiAgICAgICAgICAgIDIgPT4gJ2V4dGVybmFsJywKICAgICAgICAgICAgMyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIE9ubHlBcHByb3ZlZCA9PiAxLCAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMCkKICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQXJ0aWNsZUNvdW50ID0gMzsKCj1jdXQKCnN1YiBGQVFDb3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENhdGVnb3J5SURzIEl0ZW1TdGF0ZXMgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICBteSAkVmFsaWQgICAgPSAkUGFyYW17VmFsaWR9ID8gMSA6IDA7CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkQ2F0ZWdvcnlJRFN0cmluZyA9ICcnOwogICAgaWYgKCAkUGFyYW17Q2F0ZWdvcnlJRHN9ICYmIHJlZiAkUGFyYW17Q2F0ZWdvcnlJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9ICkgewoKICAgICAgICAjIGludGVnZXIgcXVvdGUgdGhlIGNhdGVnb3J5IGlkcwogICAgICAgIGZvciBteSAkQ2F0ZWdvcnlJRCAoIEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfSApIHsKICAgICAgICAgICAgJENhdGVnb3J5SUQgPSAkREJPYmplY3QtPlF1b3RlKCAkQ2F0ZWdvcnlJRCwgJ0ludGVnZXInICk7CiAgICAgICAgfQoKICAgICAgICBteSBAU29ydGVkSURzID0gc29ydCBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH07CgogICAgICAgICMgc3BsaXQgSU4gc3RhdGVtZW50IHdpdGggbW9yZSB0aGFuIDkwMCBlbGVtZW50cyBpbiBtb3JlIHN0YXRlbWVudHMgY29tYmluZWQgd2l0aCBPUgogICAgICAgICMgYmVjYXVzZSBPcmFjbGUgZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiAxMDAwIGVsZW1lbnRzIGluIG9uZSBJTiBzdGF0ZW1lbnQuCiAgICAgICAgbXkgQFNRTFN0cmluZ3M7CiAgICAgICAgTE9PUDoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAU29ydGVkSURzICkgewoKICAgICAgICAgICAgbXkgQFNvcnRlZElEc1BhcnQgPSBzcGxpY2UgQFNvcnRlZElEcywgMCwgOTAwOwoKICAgICAgICAgICAgbXkgJElEU3RyaW5nID0gam9pbiAnLCcsIEBTb3J0ZWRJRHNQYXJ0OwoKICAgICAgICAgICAgcHVzaCBAU1FMU3RyaW5ncywgIiBpLmNhdGVnb3J5X2lkIElOICgkSURTdHJpbmcpICI7CiAgICAgICAgfQoKICAgICAgICBteSAkU1FMU3RyaW5nID0gam9pbiAnIE9SICcsIEBTUUxTdHJpbmdzOwoKICAgICAgICAkQ2F0ZWdvcnlJRFN0cmluZyAuPSAnQU5EICggJyAuICRTUUxTdHJpbmcgLiAnICkgJzsKICAgIH0KCiAgICAjIGJ1aWxkIHZhbGlkIGlkIHN0cmluZwogICAgbXkgJFZhbGlkSURzU3RyaW5nOwogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRWYWxpZElEc1N0cmluZyA9IGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgICRWYWxpZElEc1N0cmluZyA9IGpvaW4gJywgJywga2V5cyAlVmFsaWRMaXN0OwogICAgfQoKICAgIG15ICRTUUwgPSAnU0VMRUNUIENPVU5UKCopICcKICAgICAgICAuICdGUk9NIGZhcV9pdGVtIGksIGZhcV9zdGF0ZSBzICcKICAgICAgICAuICdXSEVSRSBpLnN0YXRlX2lkID0gcy5pZCAnCiAgICAgICAgLiAiQU5EIGkudmFsaWRfaWQgSU4gKCRWYWxpZElEc1N0cmluZykgIgogICAgICAgIC4gJENhdGVnb3J5SURTdHJpbmc7CgogICAgIyBjb3VudCBvbmx5IGFwcHJvdmVkIGFydGljbGVzCiAgICBpZiAoICRQYXJhbXtPbmx5QXBwcm92ZWR9ICkgewogICAgICAgICRTUUwgLj0gJyBBTkQgaS5hcHByb3ZlZCA9IDEnOwogICAgfQoKICAgIG15ICRFeHQgPSAnJzsKICAgIGlmICggJFBhcmFte0l0ZW1TdGF0ZXN9ICYmIHJlZiAkUGFyYW17SXRlbVN0YXRlc30gZXEgJ0hBU0gnICYmICV7ICRQYXJhbXtJdGVtU3RhdGVzfSB9ICkgewogICAgICAgIG15ICRTdGF0ZXNTdHJpbmcgPSBqb2luICcsICcsIGtleXMgJXsgJFBhcmFte0l0ZW1TdGF0ZXN9IH07CiAgICAgICAgJEV4dCAuPSAiIEFORCBzLnR5cGVfaWQgSU4gKCRTdGF0ZXNTdHJpbmcgKSI7CiAgICB9CiAgICAkRXh0IC49ICcgR1JPVVAgQlkgY2F0ZWdvcnlfaWQnOwogICAgJFNRTCAuPSAkRXh0OwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gMjAwLAogICAgKTsKCiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvdW50ICs9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWhlYWQyIEZBUURlbGV0ZSgpCgpEZWxldGUgYW4gYXJ0aWNsZS4KCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJERlbGV0ZVN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBhcnRpY2xlIGNvdWxkIG5vdCBiZSBkZWxldGVkCgo9Y3V0CgpzdWIgRkFRRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGF0dGFjaG1lbnRzCiAgICBteSBASW5kZXggPSAkU2VsZi0+QXR0YWNobWVudEluZGV4KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgZm9yIG15ICRGaWxlSUQgKEBJbmRleCkgewogICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPkF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQtPntGaWxlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkRGVsZXRlU3VjY2VzczsKICAgIH0KCiAgICAjIGRlbGV0ZSB2b3RlcwogICAgbXkgJFZvdGVJRHNSZWYgPSAkU2VsZi0+Vm90ZVNlYXJjaCgKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIGZvciBteSAkVm90ZUlEICggQHskVm90ZUlEc1JlZn0gKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+Vm90ZURlbGV0ZSgKICAgICAgICAgICAgVm90ZUlEID0+ICRWb3RlSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISREZWxldGVTdWNjZXNzOwogICAgfQoKICAgICMgZGVsZXRlIGFsbCBGQVEgbGlua3Mgb2YgdGhpcyBGQVEgYXJ0aWNsZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgaGlzdG9yeQogICAgcmV0dXJuIGlmICEkU2VsZi0+RkFRSGlzdG9yeURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKIyBGQVEgU2VydmljZQoKICAgICMgZGVsZXRlIGFsbCByZWxhdGVkIHNlcnZpY2VzCiAgICBteSAkU2VydmljZURhdGFBcnJheVJlZiA9ICRTZWxmLT5GQVFTZXJ2aWNlR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgZm9yIG15ICRTZXJ2aWNlICggQHskU2VydmljZURhdGFBcnJheVJlZn0gKSB7CiAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+RkFRU2VydmljZURlbGV0ZSgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2UtPntTZXJ2aWNlSUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJERlbGV0ZVN1Y2Nlc3M7CiAgICB9CiMgZW8gRkFRIFNlcnZpY2UKCiAgICAjIGRlbGV0ZSBhcnRpY2xlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBmYXFfaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT5fRGVsZXRlRnJvbUZBUUNhY2hlKCVQYXJhbSk7CiMgUm90aGVyIE9TUyAvIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAjIHRyaWdnZXIgRkFRRGVsZXRlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdGQVFEZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKIyBFTyBFbGFzdGljc2VhcmNoLUZBUQoKICAgIHJldHVybiAxOwp9CiMgRkFRIFNlcnZpY2UKCj1oZWFkMiBGQVFTZXJ2aWNlQWRkKCkKCmFkZCBzZXJ2aWNlcyB0byBhbiBhcnRpY2xlCgogICAgbXkgJEFkZFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFTZXJ2aWNlQWRkKAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgICAgIFNlcnZpY2VJRCA9PiAxLAogICAgICAgIE5hbWUgICA9PiAnU2VydmljZSBOYW1lJywKICAgICk7CgpSZXR1cm5zOgoKICAgICRBZGRTdWNjZXNzID0gMTsgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIGFydGljbGUgc2VydmljZSBjb3VsZCBub3QgYmUgYWRkZWQKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIE5hbWUgU2VydmljZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBmYXFfc2VydmljZSAobmFtZSwgc2VydmljZV9pZCwgaXRlbV9pZCknIC4KICAgICAgICAgICAgJyBWQUxVRVMgKCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRU2VydmljZUdldCgpCgpnZXQgYW4gYXJyYXkgd2l0aCBoYXNoIHJlZmVyZW5jZSB3aXRoIHRoZSBzZXJ2aWNlcyBvZiBhbiBhcnRpY2xlCgogICAgbXkgJFNlcnZpY2VEYXRhQXJyYXlSZWYgPSAkRkFRT2JqZWN0LT5GQVFTZXJ2aWNlR2V0KAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJFNlcnZpY2VEYXRhQXJyYXlSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NvbXB1dGVyJywKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ29tcHV0ZXI6OkhhcmR3YXJlJywKICAgICAgICAgICAgU2VydmljZUlEID0+IDIsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgRkFRU2VydmljZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBuYW1lLCBzZXJ2aWNlX2lkCiAgICAgICAgICAgIEZST00gZmFxX3NlcnZpY2UKICAgICAgICAgICAgV0hFUkUgaXRlbV9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgbmFtZSwgc2VydmljZV9pZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICAjICRHZXRQYXJhbXtTZXJ2aWNlTGlzdH0gICAgICAgICA9IFwlU2VydmljZUxpc3Q7CgogICAgbXkgQERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlUmVjb3JkID0gKAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgU2VydmljZUlEID0+ICRSb3dbMV0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBEYXRhLCBcJVJlY29yZDsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwoKfQoKPWhlYWQyIEZBUVNlcnZpY2VBcnRpY2xlc0dldCgpCgpnZXQgYW4gYXJyYXkgd2l0aCBhcnRpY2xlcyByZWxhdGVkIHRvIGEgc2VydmljZQoKICAgIG15ICRGQVFTZXJ2aWNlQXJ0aWNsZXMgPSAkRkFRT2JqZWN0LT5GQVFTZXJ2aWNlQXJ0aWNsZXNHZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEsCiAgICAgICAgTGltaXQgICAgID0+IDEwLCAgICAjIGRlZmF1bHQgMTAKICAgICk7CgpSZXR1cm5zOgoKICAgICRGQVFTZXJ2aWNlQXJ0aWNsZXMgPSBbIDEsIDIsIDMgXTsKCgo9Y3V0CgpzdWIgRkFRU2VydmljZUFydGljbGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExpbWl0ID0gMTA7CiAgICBpZiAoICRQYXJhbXtMaW1pdH0gKSB7CiAgICAgICAgJExpbWl0ID0gJFBhcmFte0xpbWl0fTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaXRlbV9pZAogICAgICAgICAgICBGUk9NIGZhcV9zZXJ2aWNlCiAgICAgICAgICAgIFdIRVJFIHNlcnZpY2VfaWQgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIGl0ZW1faWQnLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gJExpbWl0LAogICAgKTsKCiAgICBteSBARGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQERhdGEsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxARGF0YTsKCn0KCj1oZWFkMiBGQVFTZXJ2aWNlRGVsZXRlKCkKCmRlbGV0ZSB0aGUgc2VydmljZSBvZiBhbiBhcnRpY2xlCgogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFTZXJ2aWNlRGVsZXRlKAogICAgICAgIEl0ZW1JRCAgICA9PiAxLAogICAgICAgIFNlcnZpY2VJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJERlbGV0ZVN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIHNlcnZpY2UgY291bGQgbm90IGJlIGRlbGV0ZWQKCj1jdXQKCnN1YiBGQVFTZXJ2aWNlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFNlcnZpY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gZmFxX3NlcnZpY2UgV0hFUkUgaXRlbV9pZCA9ID8gQU5EIHNlcnZpY2VfaWQgPSA/ICcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSwgXCRQYXJhbXtTZXJ2aWNlSUR9LCBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQojIGVvIEZBUSBTZXJ2aWNlCgo9aGVhZDIgRkFRSGlzdG9yeUFkZCgpCgphZGQgYW4gaGlzdG9yeSB0byBhbiBhcnRpY2xlCgogICAgbXkgJEFkZFN1Y2Nlc3MgPSAkRkFRT2JqZWN0LT5GQVFIaXN0b3J5QWRkKAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgICAgIE5hbWUgICA9PiAnVXBkYXRlZCBBcnRpY2xlLicsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQWRkU3VjY2VzcyA9IDE7ICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBhcnRpY2xlIGhpc3RvcnkgY291bGQgbm90IGJlIGFkZGVkCgo9Y3V0CgpzdWIgRkFRSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZmFxX2hpc3RvcnkgKG5hbWUsIGl0ZW1faWQsICcgLgogICAgICAgICAgICAnIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpJyAuCiAgICAgICAgICAgICcgVkFMVUVTICggPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17SXRlbUlEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFIaXN0b3J5R2V0KCkKCmdldCBhbiBhcnJheSB3aXRoIGhhc2ggcmVmZXJlbmNlIHdpdGggdGhlIGhpc3Rvcnkgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICRIaXN0b3J5RGF0YUFycmF5UmVmID0gJEZBUU9iamVjdC0+RkFRSGlzdG9yeUdldCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRIaXN0b3J5RGF0YUFycmF5UmVmID0gWwogICAgICAgIHsKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+IDEsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAxMC0xMS0wMiAwNzo0NToxNScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ3JlYXRlZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAxLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMTEtMDYtMTQgMTI6NTM6NTUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1VwZGF0ZWQnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIEZBUUhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIG5hbWUsIGNyZWF0ZWQsIGNyZWF0ZWRfYnkKICAgICAgICAgICAgRlJPTSBmYXFfaGlzdG9yeQogICAgICAgICAgICBXSEVSRSBpdGVtX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBjcmVhdGVkLCBpZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSBARGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbMl0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBEYXRhLCBcJVJlY29yZDsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aGVhZDIgRkFRSGlzdG9yeURlbGV0ZSgpCgpkZWxldGUgdGhlIGhpc3Rvcnkgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICREZWxldGVTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRSGlzdG9yeURlbGV0ZSgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICREZWxldGVEdWNjZXNzID0gMTsgICAgICAgICAgICAgICAgIyBvciB1bmRlZiBpZiBoaXN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkCgo9Y3V0CgpzdWIgRkFRSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGZhcV9oaXN0b3J5IFdIRVJFIGl0ZW1faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRkFRSm91cm5hbEdldCgpCgpnZXQgdGhlIHN5c3RlbSBqb3VybmFsCgogICAgbXkgJEhpc3RvcnlEYXRhQXJyYXlSZWYgPSAkRkFRT2JqZWN0LT5GQVFKb3VybmFsR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEpvdXJuYWxEYXRhQXJyYXlSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICBJdGVtSUQgICAgPT4gJzMyJywKICAgICAgICAgICAgTnVtYmVyICAgID0+ICcxMDAwNCcsCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAnTXkgQ2F0ZWdvcnknLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gJ05ldyBBcnRpY2xlJywKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICcxJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDExLTAxLTA1IDIxOjUzOjUwJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgSXRlbUlEICAgID0+ICc0JywKICAgICAgICAgICAgTnVtYmVyICAgID0+ICcxMDAwNCcsCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAnTXkgQ2F0ZWdvcnknLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gIk5ldyBBcnRpY2xlIiwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdVcGRhdGVkJywKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICcxJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDExLTAxLTA1IDIxOjU1OjMyJywKICAgICAgICB9CiAgICBdOwoKPWN1dAoKc3ViIEZBUUpvdXJuYWxHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAlR3JvdXBzICAgICAgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuIGlmICElR3JvdXBzOwoKICAgIG15IEBHcm91cElEcyAgICAgICAgICA9IGtleXMgJUdyb3VwczsKICAgIG15ICRHcm91cFBsYWNlaG9sZGVycyA9IGpvaW4gJywgJywgKCc/JykgeCBAR3JvdXBJRHM7CiAgICBteSBAR3JvdXBCaW5kICAgICAgICAgPSBtYXAgeyBcJF8gfSBAR3JvdXBJRHM7CgogICAgbXkgJENhdGVnb3J5U1FMID0KICAgICAgICAiU0VMRUNUIGcuY2F0ZWdvcnlfaWQKICAgICAgICBGUk9NIGZhcV9jYXRlZ29yeV9ncm91cCBnCiAgICAgICAgV0hFUkUgZy5ncm91cF9pZCBJTiAoICRHcm91cFBsYWNlaG9sZGVycyApIjsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJENhdGVnb3J5U1FMLAogICAgICAgIEJpbmQgPT4gXEBHcm91cEJpbmQsCiAgICApOwoKICAgIG15IEBDYXRlZ29yeUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENhdGVnb3J5SURzLCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBpZiAhQENhdGVnb3J5SURzOwoKICAgIG15IEBCaW5kICAgICAgICAgICAgICAgICA9IG1hcCB7IFwkXyB9IEBDYXRlZ29yeUlEczsKICAgIG15ICRDYXRlZ29yeVBsYWNlaG9sZGVycyA9IGpvaW4gJywgJywgKCc/JykgeCBAQ2F0ZWdvcnlJRHM7CgogICAgIyBidWlsZCBTUUwgcXVlcnkKICAgIG15ICRTUUwgPQogICAgICAgICJTRUxFQ1QgaS5pZCwgaC5uYW1lLCBoLmNyZWF0ZWQsIGguY3JlYXRlZF9ieSwgYy5uYW1lLCBpLmZfc3ViamVjdCwgaS5mX251bWJlcgogICAgICAgIEZST00gZmFxX2l0ZW0gaQogICAgICAgICAgICBJTk5FUiBKT0lOIGZhcV9zdGF0ZSBzIE9OIHMuaWQgPSBpLnN0YXRlX2lkCiAgICAgICAgICAgIElOTkVSIEpPSU4gZmFxX2hpc3RvcnkgaCBPTiBoLml0ZW1faWQgPSBpLmlkCiAgICAgICAgICAgIElOTkVSIEpPSU4gZmFxX2NhdGVnb3J5IGMgT04gYy5pZCA9IGkuY2F0ZWdvcnlfaWQKICAgICAgICBXSEVSRSBjLmlkIElOICgkQ2F0ZWdvcnlQbGFjZWhvbGRlcnMpIjsKCiAgICAjIGFkZCBzdGF0ZXMgY29uZGl0aW9uCiAgICBpZiAoICRQYXJhbXtTdGF0ZXN9ICYmIHJlZiAkUGFyYW17U3RhdGVzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtTdGF0ZXN9IH0gKSB7CiAgICAgICAgcHVzaCBAQmluZCwgbWFwIHsgXCRfIH0gQHsgJFBhcmFte1N0YXRlc30gfTsKICAgICAgICBteSAkU3RhdGVzU3RyaW5nID0gam9pbiAnLCAnLCAoJz8nKSB4IEB7ICRQYXJhbXtTdGF0ZXN9IH07CiAgICAgICAgJFNRTCAuPSAiQU5EIHMubmFtZSBJTiAoJFN0YXRlc1N0cmluZykgIjsKICAgIH0KCiAgICAjIGFkZCBvcmRlciBieSBjbGF1c2UKICAgICRTUUwgLj0gJ09SREVSIEJZIGguY3JlYXRlZCBERVNDJzsKCiAgICAjIGdldCB0aGUgZGF0YSBmcm9tIGRiCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+IDIwMCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJVJlY29yZCA9ICgKICAgICAgICAgICAgSXRlbUlEICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbM10sCiAgICAgICAgICAgIENhdGVnb3J5ICA9PiAkUm93WzRdLAogICAgICAgICAgICBTdWJqZWN0ICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTnVtYmVyICAgID0+ICRSb3dbNl0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBEYXRhLCBcJVJlY29yZDsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aGVhZDIgS2V5d29yZExpc3QoKQoKZ2V0IGEgbGlzdCBvZiBrZXl3b3JkcyBhcyBhIGhhc2gsIHdpdGggdGhlaXIgY291bnQgYXMgdGhlIHZhbHVlOgoKICAgIG15ICVLZXl3b3JkcyA9ICRGQVFPYmplY3QtPktleXdvcmRMaXN0KAogICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJUtleXdvcmRzID0gKAogICAgICAgICAgJ21hY29zeCcgICA9PiA4LAogICAgICAgICAgJ3VidW50dScgICA9PiAxLAogICAgICAgICAgJ291dGxvb2snICA9PiAyLAogICAgICAgICAgJ3dpbmRvd3MnICA9PiAzLAogICAgICAgICAgJ2V4Y2hhbmdlJyA9PiAxLAogICAgKTsKCj1jdXQKCiMgVE9ETzogRnVuY3Rpb24gbm90IHVzZWQ/IEtleXdvcmQgc2VwYXJhdG9yIGlzIGhlcmUgYSBvdGhlciBhcyBhdCBvdGhlciBwbGFjZXMuLi4KIyBUT0RPOiBDbGFyaWZ5IC0gUmVtb3ZlIGZ1bmN0aW9uIG9yIGNoYW5nZSB0aGUgc2VwYXJhdG9yPwpzdWIgS2V5d29yZExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQKICAgIG15ICRWYWxpZCA9IDA7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkVmFsaWQgPSAkUGFyYW17VmFsaWR9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGtleXdvcmRzIGZyb20gZGIKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGZfa2V5d29yZHMgRlJPTSBmYXFfaXRlbScsCiAgICApOwoKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRLZXl3b3JkTGlzdCA9IGxjICRSb3dbMF07CgogICAgICAgIGZvciBteSAkS2V5d29yZCAoIHNwbGl0IC8sLywgJEtleXdvcmRMaXN0ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZy90YWlsaW5nIHNwYWNlcwogICAgICAgICAgICAkS2V5d29yZCA9fiBzeyBcQSBccysgfXt9eG1zZzsKICAgICAgICAgICAgJEtleXdvcmQgPX4gc3sgXHMrIFx6IH17fXhtc2c7CgogICAgICAgICAgICAjIGluY3JlYXNlIGtleXdvcmQgY291bnRlcgogICAgICAgICAgICAkRGF0YXskS2V5d29yZH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgRkFRS2V5d29yZEFydGljbGVMaXN0KCkKCkdldCBhIGtleXdvcmQgYW5kIHJlbGF0ZWQgZmFxIGFydGljbGVzIGxvb2t1cCBsaXN0IChvcHRpb25hbCBvbmx5IGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2VzKS4KWW91IGNhbiBidWlsZCBhIGxpc3QgZm9yIGEgYWdlbnQgb3IgY3VzdG9tZXIuIElmIHlvdSBnaXZlIG9ubHkgYSBVc2VySUQgdGhlIHJlc3VsdCBpcyBmb3IKdGhlIGdpdmVuIFVzZXJJRCwgd2l0aCBhIGFkZGl0aW9uYWwgQ3VzdG9tZXJVc2VyIHRoZSBsaXN0IGlzIG9ubHkgZm9yIHRoZSBnaXZlbiBDdXN0b21lclVzZXIuCgogICAgbXkgJUZBUUtleXdvcmRBcnRpY2xlTGlzdCA9ICRGQVFPYmplY3QtPkZBUUtleXdvcmRBcnRpY2xlTGlzdCgKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ3R0JywgICAgICAgICAgICMgb3B0aW9uYWwgKHdpdGggdGhpcyB0aGUgcmVzdWx0IGlzIG9ubHkgY3VzdG9tZXIgZmFxIGFydGljbGUpCiAgICAgICAgTGFuZ3VhZ2VzICAgID0+IFsgJ2VuJywgJ2RlJyBdLCAjIG9wdGlvbmFsCiAgICAgICAgU2VydmljZUlEICAgID0+ICRTZXJ2aWNlSUQsICAgICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucwoKICAgIG15ICVGQVFLZXl3b3JkQXJ0aWNsZUxpc3QgPSAoCiAgICAgICAgJ0V4YW1wbGVLZXl3b3JkJyA9PiBbCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICAxMywKICAgICAgICBdLAogICAgICAgICdUZXN0S2V5d29yZCcgPT4gWwogICAgICAgICAgICA4NzYsCiAgICAgICAgXSwKICAgICk7Cgo9Y3V0CgpzdWIgRkFRS2V5d29yZEFydGljbGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBMYW5ndWFnZUlEczsKCiAgICBMQU5HVUFHRU5BTUU6CiAgICBmb3IgbXkgJExhbmd1YWdlTmFtZSAoIEB7ICRQYXJhbXtMYW5ndWFnZXN9IH0gKSB7CiAgICAgICAgbmV4dCBMQU5HVUFHRU5BTUUgaWYgISRMYW5ndWFnZU5hbWU7CgogICAgICAgIG15ICRMYW5ndWFnZUlEID0gJFNlbGYtPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRMYW5ndWFnZU5hbWUsCiAgICAgICAgKTsKICAgICAgICBuZXh0IExBTkdVQUdFTkFNRSBpZiAhJExhbmd1YWdlSUQ7CgogICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkSW50ZXJmYWNlOwogICAgbXkgJFN0YXRlVHlwZXM7CiAgICBteSAkQ2F0ZWdvcnlJRHM7CgogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKCiAgICAgICAgJEludGVyZmFjZSA9ICdleHRlcm5hbCc7CgogICAgICAgICRTdGF0ZVR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkN1c3RvbWVyOjpTdGF0ZVR5cGVzJyk7CgogICAgICAgICRDYXRlZ29yeUlEcyA9ICRTZWxmLT5DdXN0b21lckNhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBDdXN0b21lclVzZXIgICAgID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBNb2RlICAgICAgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIEdldFN1YkNhdGVnb3JpZXMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICRJbnRlcmZhY2UgPSAnaW50ZXJuYWwnOwoKICAgICAgICAkU3RhdGVUeXBlcyA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBZ2VudDo6U3RhdGVUeXBlcycpOwoKICAgICAgICAkQ2F0ZWdvcnlJRHMgPSAkU2VsZi0+QWdlbnRDYXRlZ29yeVNlYXJjaCgKICAgICAgICAgICAgR2V0U3ViQ2F0ZWdvcmllcyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJENhdGVnb3J5SURzKTsKCiAgICBteSAkQ2FjaGVLZXkgPSAnRkFRS2V5d29yZEFydGljbGVMaXN0JzsKCiAgICBpZiAoQExhbmd1YWdlSURzKSB7CiAgICAgICAgJENhY2hlS2V5IC49ICc6Okxhbmd1YWdlJyAuIGpvaW4gJzo6Jywgc29ydCBATGFuZ3VhZ2VJRHM7CiAgICB9CiAgICAkQ2FjaGVLZXkgLj0gJzo6Q2F0ZWdvcnlJRHMnIC4gam9pbiAnOjonLCBzb3J0IEB7JENhdGVnb3J5SURzfTsKICAgICRDYWNoZUtleSAuPSAnOjpJbnRlcmZhY2U6OicgLiAkSW50ZXJmYWNlOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJzo6U2VydmljZUlEOjonIC4gJFBhcmFte1NlcnZpY2VJRH07CiAgICB9CgogICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgJENhY2hlOwoKICAgIG15ICVGQVFTZWFyY2hQYXJhbWV0ZXI7CgogICAgIyBTZXQgaW50ZXJmYWNlIHNldHRpbmcgdG8gJ2V4dGVybmFsJywgdG8gc2VhcmNoIG9ubHkgZm9yIGFwcHJvdmVkIGZhcSBhcnRpY2xlLgogICAgJEZBUVNlYXJjaFBhcmFtZXRlcntJbnRlcmZhY2V9ID0gJFNlbGYtPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lICAgPT4gJ2V4dGVybmFsJywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICRGQVFTZWFyY2hQYXJhbWV0ZXJ7U3RhdGVzfSA9ICRTZWxmLT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzICA9PiAkU3RhdGVUeXBlcywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRTZWFyY2hMaW1pdCA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpLZXl3b3JkQXJ0aWNlTGlzdDo6U2VhcmNoTGltaXQnKTsKCiAgICBpZiAoQExhbmd1YWdlSURzKSB7CiAgICAgICAgJEZBUVNlYXJjaFBhcmFtZXRlcntMYW5ndWFnZUlEc30gPSBcQExhbmd1YWdlSURzOwogICAgfQoKICAgICMgR2V0IHRoZSByZWxldmFudCBGQVEgYXJ0aWNsZSBmb3IgdGhlIGN1cnJlbnQgY3VzdG9tZXIgdXNlci4KICAgIG15IEBGQVFBcnRpY2xlSURzID0gJFNlbGYtPkZBUVNlYXJjaCgKICAgICAgICAlRkFRU2VhcmNoUGFyYW1ldGVyLAogICAgICAgIENhdGVnb3J5SURzICAgICAgPT4gJENhdGVnb3J5SURzLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydGQVFJRCddLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydEb3duJ10sCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAkU2VhcmNoTGltaXQsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAojIEZBUSBTZXJ2aWNlIFRPRE8KICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiMgZW8gRkFRIFNlcnZpY2UKICAgICk7CgogICAgbXkgJUtleXdvcmRBcnRpY2VMaXN0OwogICAgbXkgJUxvb2t1cEtleXdvcmRBcnRpY2xlSUQ7CgogICAgRkFRQVJUSUNMRUlEOgogICAgZm9yIG15ICRGQVFBcnRpY2xlSUQgKEBGQVFBcnRpY2xlSURzKSB7CgogICAgICAgIG15ICVGQVFBcnRpY2xlRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkRkFRQXJ0aWNsZUlELAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBGQVFBUlRJQ0xFSUQgaWYgISRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc307CgogICAgICAgICMgUmVwbGFjZSBjb21tYXMgYW5kIHNlbWljb2xvbnMsIGJlY2F1c2UgdGhlIGtleXdvcmRzIGFyZSBub3JtYWwgc3BsaXQgd2l0aCBhbiB3aGl0ZXNwYWNlLgogICAgICAgICRGQVFBcnRpY2xlRGF0YXtLZXl3b3Jkc30gPX4gcy8sLyAvZzsKICAgICAgICAkRkFRQXJ0aWNsZURhdGF7S2V5d29yZHN9ID1+IHMvOy8gL2c7CgogICAgICAgIG15IEBLZXl3b3JkcyA9IHNwbGl0IC9ccysvLCBsYyAkRkFRQXJ0aWNsZURhdGF7S2V5d29yZHN9OwoKICAgICAgICBLRVlXT1JEOgogICAgICAgIGZvciBteSAkS2V5d29yZCAoQEtleXdvcmRzKSB7CgogICAgICAgICAgICBuZXh0IEtFWVdPUkQgaWYgJExvb2t1cEtleXdvcmRBcnRpY2xlSUR7JEtleXdvcmR9LT57JEZBUUFydGljbGVJRH07CgogICAgICAgICAgICBwdXNoIEB7ICRLZXl3b3JkQXJ0aWNlTGlzdHskS2V5d29yZH0gfSwgJEZBUUFydGljbGVJRDsKCiAgICAgICAgICAgICRMb29rdXBLZXl3b3JkQXJ0aWNsZUlEeyRLZXl3b3JkfS0+eyRGQVFBcnRpY2xlSUR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAnRkFRS2V5d29yZEFydGljbGVMaXN0JywKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVLZXl3b3JkQXJ0aWNlTGlzdCwKICAgICAgICBUVEwgICA9PiA2MCAqIDYwICogMywKICAgICk7CgogICAgcmV0dXJuICVLZXl3b3JkQXJ0aWNlTGlzdDsKfQoKPWhlYWQyIEZBUVBhdGhMaXN0R2V0KCkKCnJldHVybnMgYSBjYXRlZ29yeSBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkQ2F0ZWdvcnlJREFycmF5UmVmID0gJEZBUU9iamVjdC0+RkFRUGF0aExpc3RHZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAxNTAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJENhdGVnb3J5SURBcnJheVJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJzInLAogICAgICAgICAgICBQYXJlbnRJRCA9PiAnMCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ015IENhdGVnb3J5JywKICAgICAgICAgICAgQ29tbWVudCA9PiAnTXkgRmlyc3QgQ2F0ZWdvcnknLAogICAgICAgICAgICBWYWxpZElEID0+ICcxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAnNCcsCiAgICAgICAgICAgIFBhcmVudElEID0+ICcyJywKICAgICAgICAgICAgTmFtZSA9PiAnU3ViIENhdGVnb3J5IEEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdUaGlzIElzIENhdGVnb3J5IEEnLAogICAgICAgICAgICBWYWxpZElEID0+ICcxJywKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBGQVFQYXRoTGlzdEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQENhdGVnb3J5TGlzdDsKICAgIG15ICRUZW1wQ2F0ZWdvcnlJRCA9ICRQYXJhbXtDYXRlZ29yeUlEfTsKICAgIHdoaWxlICgkVGVtcENhdGVnb3J5SUQpIHsKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkVGVtcENhdGVnb3J5SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJURhdGEpIHsKICAgICAgICAgICAgcHVzaCBAQ2F0ZWdvcnlMaXN0LCBcJURhdGE7CiAgICAgICAgfQogICAgICAgICRUZW1wQ2F0ZWdvcnlJRCA9ICREYXRhe1BhcmVudElEfTsKICAgIH0KCiAgICBAQ2F0ZWdvcnlMaXN0ID0gcmV2ZXJzZSBAQ2F0ZWdvcnlMaXN0OwoKICAgIHJldHVybiBcQENhdGVnb3J5TGlzdDsKCn0KCj1oZWFkMiBGQVFMb2dBZGQoKQoKYWRkcyBhY2Nlc3NlZCBGQVEgYXJ0aWNsZSB0byB0aGUgYWNjZXNzIGxvZyB0YWJsZQoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRTG9nQWRkKAogICAgICAgIEl0ZW1JRCAgICA9PiAnMTIzNDU2JywKICAgICAgICBJbnRlcmZhY2UgPT4gJ2ludGVybmFsJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRTdWNjZXNzID0xOyAgICAgICAgICAgICAgICAjIG9yIHVuZGVmIGlmIEZBUUxvZyBjb3VsZCBub3QgYmUgYWRkZWQKCj1jdXQKCnN1YiBGQVFMb2dBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgSW50ZXJmYWNlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGVudmlyb25tZW50IHZhcmlhYmxlcwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJElQICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5SZW1vdGVBZGRyKCkgICAgICAgfHwgJ05PTkUnOwogICAgbXkgJFVzZXJBZ2VudCAgID0gJFBhcmFtT2JqZWN0LT5IVFRQKCdVU0VSX0FHRU5UJykgfHwgJ05PTkUnOwoKICAgICMgRGVmaW5lIHRpbWUgcGVyaW9kIHdoZW4gcmVsb2FkcyB3aWxsIG5vdCBiZSBsb2dnZWQgKDEwIG1pbnV0ZXMpLgogICAgbXkgJFJlbG9hZEJsb2NrVGltZSA9IDEwICogNjA7CgogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAkRGF0ZVRpbWVPYmplY3QtPlN1YnRyYWN0KCBTZWNvbmRzID0+ICRSZWxvYWRCbG9ja1RpbWUgKTsKICAgIG15ICRUaW1lU3RhbXAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayBpZiBhIGxvZyBlbnRyeSBleGlzdHMgbmV3ZXIgdGhhbiB0aGUgUmVsb2FkQmxvY2tUaW1lCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGZhcV9sb2cgJwogICAgICAgICAgICAuICdXSEVSRSBpdGVtX2lkID0gPyBBTkQgaXAgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIHVzZXJfYWdlbnQgPSA/IEFORCBjcmVhdGVkID49ID8gJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SXRlbUlEfSwgXCRJUCwgXCRVc2VyQWdlbnQsIFwkVGltZVN0YW1wIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxyZWFkeUV4aXN0cyA9IDE7CiAgICB9CgogICAgcmV0dXJuIGlmICRBbHJlYWR5RXhpc3RzOwoKICAgICMgaW5zZXJ0IG5ldyBsb2cgZW50cnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGZhcV9sb2cgJwogICAgICAgICAgICAuICcoaXRlbV9pZCwgaW50ZXJmYWNlLCBpcCwgdXNlcl9hZ2VudCwgY3JlYXRlZCkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wKScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwgXCRQYXJhbXtJbnRlcmZhY2V9LCBcJElQLCBcJFVzZXJBZ2VudCwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZBUVRvcDEwR2V0KCkKClJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgdG9wIDEwIEZBUSBhcnRpY2xlIGlkcy4KCiAgICBteSAkVG9wMTBJRHNSZWYgPSAkRkFRT2JqZWN0LT5GQVFUb3AxMEdldCgKICAgICAgICBJbnRlcmZhY2UgICA9PiAncHVibGljJywKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbIDEsIDIsIDMgXSwgICMgKG9wdGlvbmFsKSBPbmx5IHNob3cgdGhlIFRvcC0xMCBhcnRpY2xlcyBmcm9tIHRoZXNlIGNhdGVnb3JpZXMKICAgICAgICBMaW1pdCAgICAgICA9PiAxMCwgICAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDEwKQogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkVG9wMTBJRHNSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAxMywKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMTU5LCAgICAgICAgICAgICAgICMgbnVtYmVyIG9mIHZpc2l0cwogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gNiwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gNzgsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdwdWJsaWMnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiA0LAogICAgICAgICAgICAnQ291bnQnICAgICA9PiA1OSwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gMjAsCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDI5LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAncHVibGljJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gMSwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMjQsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdleHRlcm5hbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDExLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAyNCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0l0ZW1JRCcgICAgPT4gNSwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gMTgsCiAgICAgICAgICAgICdJbnRlcmZhY2UnID0+ICdpbnRlcm5hbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICdJdGVtSUQnICAgID0+IDksCiAgICAgICAgICAgICdDb3VudCcgICAgID0+IDE2LAogICAgICAgICAgICAnSW50ZXJmYWNlJyA9PiAnZXh0ZXJuYWwnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAyLAogICAgICAgICAgICAnQ291bnQnICAgICA9PiAxNCwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ2ludGVybmFsJwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAnSXRlbUlEJyAgICA9PiAxNCwKICAgICAgICAgICAgJ0NvdW50JyAgICAgPT4gNiwKICAgICAgICAgICAgJ0ludGVyZmFjZScgPT4gJ3B1YmxpYycsCiAgICAgICAgfQogICAgXTsKCj1jdXQKCnN1YiBGQVFUb3AxMEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEludGVyZmFjZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHZhbGlkIGlkIHN0cmluZwogICAgbXkgJFZhbGlkSURzU3RyaW5nID0gam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIHByZXBhcmUgU1FMCiAgICBteSBAQmluZDsKICAgIG15ICRTUUwgPSAnU0VMRUNUIGl0ZW1faWQsIGNvdW50KGl0ZW1faWQpIGFzIGl0ZW1jb3VudCwgZmFxX3N0YXRlX3R5cGUubmFtZSwgYXBwcm92ZWQgJwogICAgICAgIC4gJ0ZST00gZmFxX2xvZywgZmFxX2l0ZW0sIGZhcV9zdGF0ZSwgZmFxX3N0YXRlX3R5cGUgJwogICAgICAgIC4gJ1dIRVJFIGZhcV9sb2cuaXRlbV9pZCA9IGZhcV9pdGVtLmlkICcKICAgICAgICAuICdBTkQgZmFxX2l0ZW0uc3RhdGVfaWQgPSBmYXFfc3RhdGUuaWQgJwogICAgICAgIC4gIkFORCBmYXFfaXRlbS52YWxpZF9pZCBJTiAoJFZhbGlkSURzU3RyaW5nKSAiCiAgICAgICAgLiAnQU5EIGZhcV9zdGF0ZS50eXBlX2lkID0gZmFxX3N0YXRlX3R5cGUuaWQgJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbHRlciBqdXN0IGNhdGVnb3JpZXMgd2l0aCBhdCBsZWFzdCBybyBwZXJtaXNzaW9uCiAgICBpZiAoICRQYXJhbXtDYXRlZ29yeUlEc30gJiYgcmVmICRQYXJhbXtDYXRlZ29yeUlEc30gZXEgJ0FSUkFZJyAmJiBAeyAkUGFyYW17Q2F0ZWdvcnlJRHN9IH0gKSB7CgogICAgICAgICMgaW50ZWdlciBxdW90ZSB0aGUgY2F0ZWdvcnkgaWRzCiAgICAgICAgZm9yIG15ICRDYXRlZ29yeUlEICggQHsgJFBhcmFte0NhdGVnb3J5SURzfSB9ICkgewogICAgICAgICAgICAkQ2F0ZWdvcnlJRCA9ICREQk9iamVjdC0+UXVvdGUoICRDYXRlZ29yeUlELCAnSW50ZWdlcicgKTsKICAgICAgICB9CgogICAgICAgIG15IEBTb3J0ZWRJRHMgPSBzb3J0IEB7ICRQYXJhbXtDYXRlZ29yeUlEc30gfTsKCiAgICAgICAgIyBzcGxpdCBJTiBzdGF0ZW1lbnQgd2l0aCBtb3JlIHRoYW4gOTAwIGVsZW1lbnRzIGluIG1vcmUgc3RhdGVtZW50cyBjb21iaW5lZCB3aXRoIE9SCiAgICAgICAgIyBiZWNhdXNlIE9yYWNsZSBkb2Vzbid0IHN1cHBvcnQgbW9yZSB0aGFuIDEwMDAgZWxlbWVudHMgaW4gb25lIElOIHN0YXRlbWVudC4KICAgICAgICBteSBAU1FMU3RyaW5nczsKICAgICAgICBMT09QOgogICAgICAgIHdoaWxlICggc2NhbGFyIEBTb3J0ZWRJRHMgKSB7CgogICAgICAgICAgICBteSBAU29ydGVkSURzUGFydCA9IHNwbGljZSBAU29ydGVkSURzLCAwLCA5MDA7CgogICAgICAgICAgICBteSAkSURTdHJpbmcgPSBqb2luICcsJywgQFNvcnRlZElEc1BhcnQ7CgogICAgICAgICAgICBwdXNoIEBTUUxTdHJpbmdzLCAiIGZhcV9pdGVtLmNhdGVnb3J5X2lkIElOICgkSURTdHJpbmcpICI7CiAgICAgICAgfQoKICAgICAgICBteSAkU1FMU3RyaW5nID0gam9pbiAnIE9SICcsIEBTUUxTdHJpbmdzOwoKICAgICAgICAkU1FMIC49ICcgQU5EICggJyAuICRTUUxTdHJpbmcgLiAnICkgJzsKICAgIH0KCiAgICAjIGZpbHRlciByZXN1bHRzIGZvciBwdWJsaWMgYW5kIGN1c3RvbWVyIGludGVyZmFjZQogICAgaWYgKCAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdwdWJsaWMnICkgfHwgKCAkUGFyYW17SW50ZXJmYWNlfSBlcSAnZXh0ZXJuYWwnICkgKSB7CgogICAgICAgICMgb25seSBzaG93IGFwcHJvdmVkIGFydGljbGVzCiAgICAgICAgJFNRTCAuPSAnQU5EIGZhcV9pdGVtLmFwcHJvdmVkID0gMSAnOwoKICAgICAgICAjIG9ubHkgc2hvdyB0aGUgcHVibGljIGFydGljbGVzCiAgICAgICAgJFNRTCAuPSAiQU5EICggKCBmYXFfc3RhdGVfdHlwZS5uYW1lID0gJ3B1YmxpYycgQU5EIGZhcV9sb2cuaW50ZXJmYWNlID0gJ3B1YmxpYycgKSAiOwoKICAgICAgICAjIGN1c3RvbWVycyBjYW4gYWRkaXRpb25hbGx5IHNlZSB0aGUgZXh0ZXJuYWwgYXJ0aWNsZXMKICAgICAgICBpZiAoICRQYXJhbXtJbnRlcmZhY2V9IGVxICdleHRlcm5hbCcgKSB7CiAgICAgICAgICAgICRTUUwgLj0gIk9SICggZmFxX3N0YXRlX3R5cGUubmFtZSA9ICdleHRlcm5hbCcgQU5EIGZhcV9sb2cuaW50ZXJmYWNlID0gJ2V4dGVybmFsJyApICI7CiAgICAgICAgfQoKICAgICAgICAkU1FMIC49ICcpICc7CiAgICB9CgogICAgIyBmaWx0ZXIgcmVzdWx0cyBmb3IgZGVmaW5lZCB0aW1lIHBlcmlvZAogICAgaWYgKCAkUGFyYW17U3RhcnREYXRlfSAmJiAkUGFyYW17RW5kRGF0ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGZhcV9sb2cuY3JlYXRlZCA+PSA/IEFORCBmYXFfbG9nLmNyZWF0ZWQgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsICggXCRQYXJhbXtTdGFydERhdGV9LCBcJFBhcmFte0VuZERhdGV9ICk7CiAgICB9CgogICAgIyBjb21wbGV0ZSBTUUwgc3RhdGVtZW50CiAgICAkU1FMIC49ICdHUk9VUCBCWSBpdGVtX2lkLCBmYXFfc3RhdGVfdHlwZS5uYW1lLCBhcHByb3ZlZCAnCiAgICAgICAgLiAnT1JERVIgQlkgaXRlbWNvdW50IERFU0MnOwoKICAgICMgZ2V0IHRoZSB0b3AgMTAgYXJ0aWNsZSBpZHMgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIFtdIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAxMCwKICAgICk7CgogICAgbXkgQFJlc3VsdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFJlc3VsdCwgewogICAgICAgICAgICBJdGVtSUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ291bnQgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEludGVyZmFjZSA9PiAkUm93WzJdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAUmVzdWx0Owp9Cgo9aGVhZDIgRkFRSW5saW5lQXR0YWNobWVudFVSTFVwZGF0ZSgpCgpVcGRhdGVzIHRoZSBVUkxzIG9mIHVwbG9hZGVkIGlubGluZSBhdHRhY2htZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRGQVFPYmplY3QtPkZBUUlubGluZUF0dGFjaG1lbnRVUkxVcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICA9PiAxMiwKICAgICAgICBGb3JtSUQgICAgID0+IDQ1NiwKICAgICAgICBGaWxlSUQgICAgID0+IDUsCiAgICAgICAgQXR0YWNobWVudCA9PiBcJUF0dGFjaG1lbnQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICMgb2YgdW5kZWYgaWYgYXR0YWNobWVudCBVUkwgY291bGQgbm90IGJlIHVwZGF0ZWQKCj1jdXQKCnN1YiBGQVFJbmxpbmVBdHRhY2htZW50VVJMVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIEF0dGFjaG1lbnQgRm9ybUlEIEZpbGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGF0dGFjaG1lbnQgaXMgYSBoYXNoIHJlZmVyZW5jZQogICAgaWYgKCByZWYgJFBhcmFte0F0dGFjaG1lbnR9IG5lICdIQVNIJyAmJiAhJXsgJFBhcmFte0F0dGFjaG1lbnR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRhY2htZW50IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9ubHkgY29uc2lkZXIgaW5saW5lIGF0dGFjaG1lbnRzIGhlcmUgKHRoZXkgaGF2ZSBhIGNvbnRlbnQgaWQpCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0F0dGFjaG1lbnR9LT57Q29udGVudElEfTsKCiAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgSXRlbUlEICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICBJdGVtRmllbGRzID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBwaWN0dXJlIFVSTCBpbiB1cGxvYWQgY2FjaGUKICAgIG15ICRTZWFyY2ggPSAiQWN0aW9uPVBpY3R1cmVVcGxvYWQgLiBGb3JtSUQ9XFEkUGFyYW17Rm9ybUlEfVxFIC4gIgogICAgICAgIC4gIkNvbnRlbnRJRD1cUSRQYXJhbXtBdHRhY2htZW50fS0+e0NvbnRlbnRJRH1cRSI7CgogICAgIyBwaWN0dXJlIFVSTCBpbiBGQVEgYXR0YWNobWVudAogICAgbXkgJFJlcGxhY2UgPSAiQWN0aW9uPUFnZW50RkFRWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50OyIKICAgICAgICAuICJJdGVtSUQ9JFBhcmFte0l0ZW1JRH07RmlsZUlEPSRQYXJhbXtGaWxlSUR9IjsKCiAgICAjIHJld3JpdGUgcGljdHVyZSBVUkxzCiAgICBGSUVMRDoKICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGNvbnRhaW5zIHNvbWV0aGluZwogICAgICAgIG5leHQgRklFTEQgaWYgISRGQVFEYXRheyJGaWVsZCROdW1iZXIifTsKCiAgICAgICAgIyByZW1vdmUgbmV3bGluZXMKICAgICAgICAkRkFRRGF0YXsiRmllbGQkTnVtYmVyIn0gPX4gc3sgW1xuXHJdKyB9e31neG1zOwoKICAgICAgICAjIHJlcGxhY2UgVVJMCiAgICAgICAgJEZBUURhdGF7IkZpZWxkJE51bWJlciJ9ID1+IHN7JFNlYXJjaH17JFJlcGxhY2V9eG1zOwogICAgfQoKICAgICMgdXBkYXRlIEZBUSBhcnRpY2xlIHdpdGhvdXQgd3JpdGluZyBhIGhpc3RvcnkgZW50cnkKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkZBUVVwZGF0ZSgKICAgICAgICAlRkFRRGF0YSwKICAgICAgICBIaXN0b3J5T2ZmICA9PiAxLAogICAgICAgIEFwcHJvdmFsT2ZmID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgRkFRIEl0ZW0jICckUGFyYW17SXRlbUlEfSchIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGQVFBcnRpY2xlVGl0bGVDbGVhbigpCgpzdHJpcC9jbGVhbiB1cCBhIEZBUSBhcnRpY2xlIHRpdGxlCgogICAgbXkgJE5ld1RpdGxlID0gJEZBUU9iamVjdC0+RkFRQXJ0aWNsZVRpdGxlQ2xlYW4oCiAgICAgICAgVGl0bGUgICAgICA9PiAkT2xkVGl0bGUsCiAgICAgICAgU2l6ZSAgICAgICA9PiAkVGl0bGVTaXplVG9CZURpc3BsYXllZCAgICMgb3B0aW9uYWwsIGlmIDAgZG8gbm90IGN1dCB0aXRsZQogICAgKTsKCj1jdXQKCnN1YiBGQVFBcnRpY2xlVGl0bGVDbGVhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaXRsZSA9ICRQYXJhbXtUaXRsZX0gfHwgJyc7CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbnMKICAgIG15ICRUaXRsZVNpemUgPSAkUGFyYW17U2l6ZX07CiAgICBpZiAoICFkZWZpbmVkICRUaXRsZVNpemUgKSB7CiAgICAgICAgJFRpdGxlU2l6ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpUaXRsZVNpemUnKSB8fCAxMDA7CiAgICB9CgogICAgIyB0cmltIHdoaXRlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kCiAgICAkVGl0bGUgPX4gcy8oXlxzK3xccyskKS8vOwoKICAgICMgcmVzaXplIHRpdGxlIGJhc2VkIG9uIGNvbmZpZwogICAgIyBkbyBub3QgY3V0IHRpdGxlLCBpZiBzaXplIHBhcmFtZXRlciB3YXMgMAogICAgaWYgKCRUaXRsZVNpemUpIHsKICAgICAgICAkVGl0bGUgPX4gcy9eKC57JFRpdGxlU2l6ZX0pLiokLyQxIFsuLi5dLzsKICAgIH0KCiAgICByZXR1cm4gJFRpdGxlOwp9Cgo9aGVhZDIgRkFRQ29udGVudFR5cGVTZXQoKQoKU2V0cyB0aGUgY29udGVudCB0eXBlIG9mIDEsIHNvbWUgb3IgYWxsIEZBUSBpdGVtcywgYnkgYSBnaXZlbiBwYXJhbWV0ZXIgb3IgZGV0ZXJtaW5lZCBieSB0aGUgRkFRIGl0ZW0gY29udGVudAoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+RkFRQ29udGVudFR5cGVTZXQoCiAgICAgICAgRkFRSXRlbUlEcyAgPT4gWyAxLCAyLCAzIF0sICAgICAgICAgICAgICMgb3B0aW9uYWwsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3NvbWUgY29udGVudCB0eXBlJywgICAgICMgb3B0aW9uYWwsCiAgICApOwoKPWN1dAoKc3ViIEZBUUNvbnRlbnRUeXBlU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkUGFyYW17RkFRSXRlbUlEc30gJiYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0ZBUUl0ZW1JRHN9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIEZBUUl0ZW1JRHMgZm9ybWF0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRDb250ZW50VHlwZSA9ICRQYXJhbXtDb250ZW50VHlwZX0gfHwgJyc7CgogICAgIyBHZXQgZGVmYXVsdCBjb250ZW50IHR5cGUgZnJvbSB0aGUgY29uZmlnIGlmIGl0IHdhcyBub3QgZ2l2ZW4uCiAgICBpZiAoICEkQ29udGVudFR5cGUgKSB7CgogICAgICAgICRDb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Okl0ZW06OkhUTUwnKSApIHsKICAgICAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgfQogICAgfQoKICAgICMgU1FMIHRvIHNldCB0aGUgY29udGVudCB0eXBlIChkZWZhdWx0IG9yIGdpdmVuKS4KICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGZhcV9pdGVtCiAgICAgICAgU0VUIGNvbnRlbnRfdHlwZSA9ID8nOwoKICAgICMgR2V0IEZBUSBpdGVtIElEcyBmcm9tIHRoZSBwYXJhbS4KICAgIG15IEBGQVFJdGVtSURzID0gQHsgJFBhcmFte0ZBUUl0ZW1JRHN9IC8vIFtdIH07CgogICAgIyBSZXN0cmljdCB0byBvbmx5IGdpdmVuIEZBUSBpdGVtIElEcyAoaWYgYW55KS4KICAgIGlmIChARkFRSXRlbUlEcykgewoKICAgICAgICBteSAkSURTdHJpbmcgPSBqb2luICcsJywgQEZBUUl0ZW1JRHM7CgogICAgICAgICRTUUwgLj0gIgogICAgICAgICAgICBXSEVSRSBpZCBJTiAoJElEU3RyaW5nKSI7CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBTZXQgdGhlIGNvbnRlbnQgdHlwZSBlaXRoZXIgYnkgdGhlIGdpdmVuIHBhcmFtIG9yIGFjY29yZGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzLgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRDb250ZW50VHlwZSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIE5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiBjb250ZW50IHR5cGUgd2FzIGdpdmVuIChpdCB3YXMgYWxyZWFkeSBzZXQpLgogICAgaWYgKCAkUGFyYW17Q29udGVudFR5cGV9ICkgewoKICAgICAgICAjIERlbGV0ZSBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdGQVEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgT3RoZXJ3aXNlIGNvbnRlbnQgdHlwZSBoYXMgdG8gYmUgZGV0ZXJtaW5lZCBieSB0aGUgRkFRIGl0ZW0gY29udGVudC4KCiAgICAjIEdldCBhbGwgRkFRSURzIChpZiBubyBmYXEgaXRlbSB3YXMgZ2l2ZW4pLgogICAgaWYgKCAhQEZBUUl0ZW1JRHMgKSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgRElTVElOQ1QoZmFxX2l0ZW0uaWQpCiAgICAgICAgICAgICAgICBGUk9NIGZhcV9pdGVtCiAgICAgICAgICAgICAgICBPUkRFUiBCWSBpZCBBU0MnLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBGQVFJdGVtSURzLCAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICAjIExvb3AgdHJvdWdoIHRoZSBGQVEgaXRlbXMuCiAgICBJVEVNSUQ6CiAgICBmb3IgbXkgJEl0ZW1JRCAoQEZBUUl0ZW1JRHMpIHsKICAgICAgICBteSAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgICAgICAjIEdldCB0aGUgY29udGVudHMgb2YgZWFjaCBmaWVsZAogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewoKICAgICAgICAgICAgbXkgJEZpZWxkQ29udGVudCA9ICRTZWxmLT5JdGVtRmllbGRHZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgIEZpZWxkICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZENvbnRlbnQ7CgogICAgICAgICAgICAjIGlmIGZpZWxkIGNvbnRlbnQgc2VhbXMgdG8gYmUgSFRNTCBzZXQgdGhlIGNvbnRlbnQgdHlwZSB0byBIVE1MCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGaWVsZENvbnRlbnQKICAgICAgICAgICAgICAgID1+IG17KD86IDxiclxzKi8+IHwgPC9saT4gfCA8L29sPiB8IDwvdWw+IHwgPC90YWJsZT4gfCA8L3RyPiB8IDwvdGQ+IHwgPC9kaXY+IHwgPC9vPiB8IDwvaT4gfCA8L3NwYW4+IHwgPC9oXGQ+IHwgPC9wPiB8IDwvcHJlPiApfW1zeAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICAgICBsYXN0IEZJRUxEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU1JRCBpZiAkRGV0ZXJtaW5lZENvbnRlbnRUeXBlIGVxICRDb250ZW50VHlwZTsKCiAgICAgICAgIyBTZXQgdGhlIGNvbnRlbnQgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIGNvbnRlbnQuCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIGZhcV9pdGVtCiAgICAgICAgICAgICAgICBTRVQgY29udGVudF90eXBlID0gPwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPT8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkRGV0ZXJtaW5lZENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgXCRJdGVtSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIERlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnRkFRJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBERVBSRUNBVEVEIEZVTkNUSU9OUwoKPWhlYWQyIEhpc3RvcnlHZXQoKQoKRGVwcmVjYXRlZCwgdXNlIEZBUUpvdXJuYWxHZXQoKSBpbnN0ZWFkLgoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPkZBUUpvdXJuYWxHZXQoJVBhcmFtKTsKfQoKPWhlYWQxIFBSSVZBVEUgRlVOQ1RJT05TCgo9aGVhZDIgX0ZBUUFwcHJvdmFsVXBkYXRlKCkKCnVwZGF0ZSB0aGUgYXBwcm92YWwgc3RhdGUgb2YgYW4gYXJ0aWNsZQoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+X0ZBUUFwcHJvdmFsVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgPT4gMTIzLAogICAgICAgIEFwcHJvdmVkICAgPT4gMSwgICAgIyAwfDEgKGRlZmF1bHQgMCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9GQVFBcHByb3ZhbFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtBcHByb3ZlZH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHByb3ZlZCBwYXJhbWV0ZXIhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1cGRhdGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGZhcV9pdGVtIFNFVCAnCiAgICAgICAgICAgIC4gJ2FwcHJvdmVkID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VkID0gY3VycmVudF90aW1lc3RhbXAsICcKICAgICAgICAgICAgLiAnY2hhbmdlZF9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcHJvdmVkfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBhcHByb3ZhbCBmZWF0dXJlIGlzIGFjdGl2YXRlZCBhbmQgRkFRIGFydGljbGUgaXMgbm90IGFwcHJvdmVkIHlldAogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZBUTo6QXBwcm92YWxSZXF1aXJlZCcpICYmICEkUGFyYW17QXBwcm92ZWR9ICkgewoKICAgICAgICBteSAlRkFRRGF0YSA9ICRTZWxmLT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIEl0ZW1GaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQXBwcm92YWxSZXF1aXJlZCAgICAgICAgPSAxOwogICAgICAgIG15ICRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRkFROjpBcHByb3ZhbDo6SW5jbHVkZUludGVybmFsJyk7CgogICAgICAgIGlmICggISRBcHByb3ZhbEluY2x1ZGVJbnRlcm5hbCApIHsKICAgICAgICAgICAgbXkgJUludGVybmFsU3RhdGUgPSAkU2VsZi0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVHlwZXMgID0+IFsnaW50ZXJuYWwnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkSW50ZXJuYWxTdGF0ZXsgJEZBUURhdGF7U3RhdGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICRBcHByb3ZhbFJlcXVpcmVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXBwcm92YWxSZXF1aXJlZCApIHsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGFwcHJvdmFsIHRpY2tldAogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fRkFRQXBwcm92YWxUaWNrZXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtSUQgICAgID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkRkFRRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIExhbmd1YWdlSUQgPT4gJEZBUURhdGF7TGFuZ3VhZ2VJRH0sCiAgICAgICAgICAgICAgICBGQVFOdW1iZXIgID0+ICRGQVFEYXRhe051bWJlcn0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICRGQVFEYXRhe1RpdGxlfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgPT4gJEZBUURhdGF7U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgY3JlYXRlIGFwcHJvdmFsIHRpY2tldCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9GQVFBcHByb3ZhbFRpY2tldENyZWF0ZSgpCgpjcmVhdGVzIGFuIGFwcHJvdmFsIHRpY2tldAoKICAgIG15ICRTdWNjZXNzID0gJEZBUU9iamVjdC0+X0ZBUUFwcHJvdmFsVGlja2V0Q3JlYXRlKAogICAgICAgIEl0ZW1JRCAgICAgPT4gMTIzLAogICAgICAgIENhdGVnb3J5SUQgPT4gMiwKICAgICAgICBMYW5ndWFnZUlEID0+IDEsCiAgICAgICAgRkFRTnVtYmVyICA9PiAxMDIxMSwKICAgICAgICBUaXRsZSAgICAgID0+ICdTb21lIFRpdGxlJywKICAgICAgICBTdGF0ZUlEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfRkFRQXBwcm92YWxUaWNrZXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgQ2F0ZWdvcnlJRCBGQVFOdW1iZXIgVGl0bGUgU3RhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgc3ViamVjdAogICAgbXkgJFN1YmplY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxUaWNrZXRTdWJqZWN0Jyk7CiAgICAkU3ViamVjdCA9fiBzeyA8T1RPQk9fRkFRX05VTUJFUj4gICAgIH17JFBhcmFte0ZBUU51bWJlcn19eG1zOwogICAgJFN1YmplY3QgPX4gc3sgPE9UT0JPX0ZBUV9DQVRFR09SWUlEPiB9eyRQYXJhbXtDYXRlZ29yeUlEfX14bXM7CiAgICAkU3ViamVjdCA9fiBzeyA8T1RPQk9fRkFRX0lURU1JRD4gICAgIH17JFBhcmFte0l0ZW1JRH19eG1zOwogICAgJFN1YmplY3QgPX4gc3sgPE9UT0JPX0ZBUV9USVRMRT4gICAgICB9eyRQYXJhbXtUaXRsZX19eG1zOwogICAgJFN1YmplY3QgPX4gc3sgPE9UT0JPX0ZBUV9TVEFURUlEPiAgICB9eyRQYXJhbXtTdGF0ZUlEfX14bXM7CgogICAgIyBjaGVjayBpZiB3ZSBjYW4gZmluZCBleGlzdGluZyBvcGVuIGFwcHJvdmFsIHRpY2tldHMgZm9yIHRoaXMgRkFRIGFydGljbGUKICAgIG15IEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgUmVzdWx0ICAgID0+ICdBUlJBWScsCiAgICAgICAgVGl0bGUgICAgID0+ICRTdWJqZWN0LAogICAgICAgIFN0YXRlVHlwZSA9PiAnT3BlbicsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgICMgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW5vdGhlciBhcHByb3ZhbCB0aWNrZXQgaWYgdGhlcmUgaXMgc3RpbGwgYXQgbGVhc3Qgb25lIHRpY2tldCBvcGVuCiAgICAjIGZvciB0aGlzIEZBUSBhcnRpY2xlCiAgICByZXR1cm4gMSBpZiBAVGlja2V0SURzOwoKICAgICMgZ2V0IHRpY2tldCB0eXBlIGZyb20gU3lzQ29uZmlnCiAgICBteSAkVGlja2V0VHlwZSA9ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFRpY2tldFR5cGUnKSB8fCAnJzsKCiAgICAjIHZhbGlkYXRlIHRpY2tldCB0eXBlIGlmIGFueQogICAgaWYgKCRUaWNrZXRUeXBlKSB7CgogICAgICAgICMgZ2V0IGEgdGlja2V0IHR5cGUgbG9va3VwIHRhYmxlCiAgICAgICAgbXkgJVR5cGVMaXN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlTGlzdCgpOwogICAgICAgIG15ICVUeXBlTG9va3VwID0gcmV2ZXJzZSAlVHlwZUxpc3Q7CgogICAgICAgICMgc2V0ICRUaWNrZXRUeXBlIHRvIGVtcHR5IGlmIFRpY2tleVR5cGUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsb29rdXAgdGFibGUuIElmIHNldCB0bwogICAgICAgICMgICAgZW1wdHkgVGlja2V0Q3JlYXRlKCkgd2lsbCB1c2UgYXMgZGVmYXVsdCBUeXBlSUQgPSAxLCBubyBtYXR0ZXIgaWYgaXQgaXMgdmFsaWQgb3Igbm90LgogICAgICAgICRUaWNrZXRUeXBlID0gJFR5cGVMb29rdXB7JFRpY2tldFR5cGV9ID8gJFRpY2tldFR5cGUgOiAnJzsKICAgIH0KCiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgPT4gJFN1YmplY3QsCiAgICAgICAgUXVldWUgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6OkFwcHJvdmFsUXVldWUnKSB8fCAnUmF3JywKICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICBQcmlvcml0eSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxUaWNrZXRQcmlvcml0eScpICAgICB8fCAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpBcHByb3ZhbFRpY2tldERlZmF1bHRTdGF0ZScpIHx8ICduZXcnLAogICAgICAgIFR5cGUgICAgID0+ICRUaWNrZXRUeXBlLAogICAgICAgIE93bmVySUQgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgaWYgKCRUaWNrZXRJRCkgewoKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgIG15ICRVc2VyTmFtZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTdGF0ZSA9ICRTZWxmLT5TdGF0ZUdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjYXRlZ29yaWVzIGNhbiBiZSBuZXN0ZWQ7IHlvdSBjYW4gaGF2ZSBzb21lOjpsb25nOjpjYXRlZ29yeS4KICAgICAgICBteSBAQ2F0ZWdvcnlOYW1lczsKICAgICAgICBteSAkQ2F0ZWdvcnlJRCA9ICRQYXJhbXtDYXRlZ29yeUlEfTsKICAgICAgICBDQVRFR09SWToKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBteSAlQ2F0ZWdvcnkgPSAkU2VsZi0+Q2F0ZWdvcnlHZXQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ2F0ZWdvcnlOYW1lcywgJENhdGVnb3J5e05hbWV9OwogICAgICAgICAgICBsYXN0IENBVEVHT1JZIGlmICEkQ2F0ZWdvcnl7UGFyZW50SUR9OwogICAgICAgICAgICAkQ2F0ZWdvcnlJRCA9ICRDYXRlZ29yeXtQYXJlbnRJRH07CiAgICAgICAgfQogICAgICAgIG15ICRDYXRlZ29yeSA9IGpvaW4oICc6OicsIHJldmVyc2UgQENhdGVnb3J5TmFtZXMgKTsKCiAgICAgICAgbXkgJExhbmd1YWdlOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGQVE6Ok11bHRpTGFuZ3VhZ2UnKSApIHsKICAgICAgICAgICAgJExhbmd1YWdlID0gJFNlbGYtPkxhbmd1YWdlTG9va3VwKAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkUGFyYW17TGFuZ3VhZ2VJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGFuZ3VhZ2UgPSAnLSc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBib2R5IGZyb20gY29uZmlnCiAgICAgICAgbXkgJEJvZHkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZBUTo6QXBwcm92YWxUaWNrZXRCb2R5Jyk7CiAgICAgICAgJEJvZHkgPX4gc3sgPE9UT0JPX0ZBUV9DQVRFR09SWUlEPiB9eyRQYXJhbXtDYXRlZ29yeUlEfX14bXM7CiAgICAgICAgJEJvZHkgPX4gc3sgPE9UT0JPX0ZBUV9DQVRFR09SWT4gICB9eyRDYXRlZ29yeX14bXM7CiAgICAgICAgJEJvZHkgPX4gc3sgPE9UT0JPX0ZBUV9MQU5HVUFHRT4gICB9eyRMYW5ndWFnZX14bXM7CiAgICAgICAgJEJvZHkgPX4gc3sgPE9UT0JPX0ZBUV9JVEVNSUQ+ICAgICB9eyRQYXJhbXtJdGVtSUR9fXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX05VTUJFUj4gICAgIH17JFBhcmFte0ZBUU51bWJlcn19eG1zOwogICAgICAgICRCb2R5ID1+IHN7IDxPVE9CT19GQVFfVElUTEU+ICAgICAgfXskUGFyYW17VGl0bGV9fXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX0FVVEhPUj4gICAgIH17JFVzZXJOYW1lfXhtczsKICAgICAgICAkQm9keSA9fiBzeyA8T1RPQk9fRkFRX1NUQVRFPiAgICAgIH17JFN0YXRle05hbWV9fXhtczsKCiAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmcm9tIHN0cmluZwogICAgICAgIG15ICRGcm9tID0gIlwiJFVzZXJ7VXNlckZ1bGxuYW1lfVwiIDwkVXNlcntVc2VyRW1haWx9PiI7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgICAgIG15ICRJbnRlcm5hbEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnICk7CgogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkSW50ZXJuYWxBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAwLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PgogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUnKS0+e0hpc3RvcnlUeXBlfQogICAgICAgICAgICAgICAgfHwgJ0FkZE5vdGUnLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PgogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUnKS0+e0hpc3RvcnlDb21tZW50fQogICAgICAgICAgICAgICAgfHwgJyUlTm90ZScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRBcnRpY2xlSUQ7CiAgICB9CgogICAgcmV0dXJuOwp9CgojCiMgRGVsZXRlcyBhbGwgbmVlZGVkIEZBUSBpdGVtIGNhY2hlIGVudHJpZXMgZm9yIGEgZ2l2ZW4gRkFRIEl0ZW1JRC4KIwpzdWIgX0RlbGV0ZUZyb21GQVFDYWNoZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBDbGVhciBGQVFHZXQgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAnRkFRR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSAuICc6Okl0ZW1GaWVsZHM6OjEnLAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0ZBUScsCiAgICAgICAgS2V5ICA9PiAnRkFRR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfSAuICc6Okl0ZW1GaWVsZHM6OjAnLAogICAgKTsKCiAgICAjIENsZWFyIEl0ZW1GZWxkR2V0IGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdGQVEnLAogICAgICAgIEtleSAgPT4gJ0l0ZW1GaWVsZEdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH0sCiAgICApOwoKICAgICMgQ2xlYW51cCBjYWNoZSBmb3IgdGhlICdGQVFLZXl3b3JkQXJ0aWNsZUxpc3QnLgogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0ZBUUtleXdvcmRBcnRpY2xlTGlzdCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UT0JPIHByb2plY3QgKEw8aHR0cHM6Ly9vdG9iby5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==</File>
        <File Location="Kernel/Config/Files/XML/FAQElasticsearch.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJFbGFzdGljc2VhcmNoOjpJbmRleFNldHRpbmdzIyMjRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk51bWJlciBvZiBzaGFyZHMgKE5TKSwgcmVwbGljYXMgKE5SKSBhbmQgZmllbGRzIGxpbWl0IGZvciB0aGUgaW5kZXggJ2ZhcScuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbGFzdGljc2VhcmNoOjpTZXR0aW5nczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOUyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTlIiPjA8L0l0ZW0+CiAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFbGFzdGljc2VhcmNoOjpGQVFTdG9yZUZpZWxkcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5GaWVsZHMgc3RvcmVkIGluIHRoZSBmYXEgaW5kZXggd2hpY2ggYXJlIHVzZWQgZm9yIG90aGVyIHRoaW5ncyBiZXNpZGVzIGZ1bGx0ZXh0IHNlYXJjaGVzLiBGb3IgdGhlIGNvbXBsZXRlIGZ1bmN0aW9uYWxpdHkgYWxsIGZpZWxkcyBhcmUgbWFuZGF0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RWxhc3RpY3NlYXJjaDo6U2V0dGluZ3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmFzaWMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SXRlbUlEPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5DYXRlZ29yeUlEPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5OdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5TdGF0ZVR5cGVJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkVsYXN0aWNzZWFyY2g6OkZBUVNlYXJjaEZpZWxkcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5GaWVsZHMgb2YgdGhlIGZhcSBpbmRleCwgdXNlZCBmb3IgdGhlIGZ1bGx0ZXh0IHNlYXJjaC4gRmllbGRzIGFyZSBhbHNvIHN0b3JlZCwgYnV0IGFyZSBub3QgbWFuZGF0b3J5IGZvciB0aGUgb3ZlcmFsbCBmdW5jdGlvbmFsaXR5LiBJbmNsdXNpb24gb2YgYXR0YWNobWVudHMgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlIGVudHJ5IHRvIDAgb3IgZGVsZXRpbmcgaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbGFzdGljc2VhcmNoOjpTZXR0aW5nczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCYXNpYyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GaWVsZDE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkZpZWxkMjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RmllbGQzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5UaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+S2V5d29yZHM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXR0YWNobWVudHMiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iR2VuZXJpY0ludGVyZmFjZTo6SW52b2tlcjo6TW9kdWxlIyMjRWxhc3RpY3NlYXJjaDo6RkFRTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5HZW5lcmljSW50ZXJmYWNlIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbnZva2VyIGxheWVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+R2VuZXJpY0ludGVyZmFjZTo6SW52b2tlcjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkZBUU1hbmFnZW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbnRyb2xsZXIiPkZBUU1hbmFnZW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpZ0RpYWxvZyI+QWRtaW5HZW5lcmljSW50ZXJmYWNlSW52b2tlckRlZmF1bHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRXZlbnRzIyMjRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgYWxsIFBhY2thZ2UgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+RkFRQ3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RkFRVXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RkFRRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RkFRQXR0YWNobWVudEFkZFBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5GQVFBdHRhY2htZW50RGVsZXRlUG9zdDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRkFROjpFdmVudE1vZHVsZVBvc3QjIyM5ODAwLUdlbmVyaWNJbnRlcmZhY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGVyZm9ybXMgdGhlIGNvbmZpZ3VyZWQgYWN0aW9uIGZvciBlYWNoIGV2ZW50IChhcyBhbiBJbnZva2VyKSBmb3IgZWFjaCBjb25maWd1cmVkIFdlYnNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6RkFRPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpFdmVudDo6SGFuZGxlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oRkFRQ3JlYXRlfEZBUVVwZGF0ZXxGQVFEZWxldGV8RkFRQXR0YWNobWVudEFkZFBvc3R8RkFRQXR0YWNobWVudERlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkVsYXN0aWNzZWFyY2g6OlF1aWNrU2VhcmNoU2hvdyMjI0ZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PYmplY3RzIHRvIHNlYXJjaCBmb3IsIGhvdyBtYW55IGVudHJpZXMgYW5kIHdoaWNoIGF0dHJpYnV0cyB0byBzaG93LiBGQVEgYXR0cmlidXRlcyBoYXZlIHRvIGV4cGxpY2l0bHkgYmUgc3RvcmVkIHZpYSBFbGFzdGljc2VhcmNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RWxhc3RpY3NlYXJjaDo6U2V0dGluZ3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ291bnQiPjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkF0dHJpYnV0ZXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+TnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5UaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBdHRyaWJ1dGVIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik51bWJlciI+TnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIj5UaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L290b2JvX2NvbmZpZz4K</File>
        <File Location="Kernel/GenericInterface/Invoker/Elasticsearch/FAQManagement.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6SW52b2tlcjo6RWxhc3RpY3NlYXJjaDo6RkFRTWFuYWdlbWVudDsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFRpbWU6OkhpUmVzKCk7CgojIGNvcmUgbW9kdWxlcwp1c2UgTUlNRTo6QmFzZTY0IHF3KGVuY29kZV9iYXNlNjQpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpJbnZva2VyOjpFbGFzdGljc2VhcmNoOjpGQVFNYW5hZ2VtZW50Cgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgp1c3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Okludm9rZXItPm5ldygpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zIGFuZCBzdG9yZSB0aGVtIGluICRTZWxmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvRGVidWdnZXJPYmplY3QgV2Vic2VydmljZUlELykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBQcmVwYXJlUmVxdWVzdCgpCgpwcmVwYXJlIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBjb25maWd1cmVkIHJlbW90ZSB3ZWIgc2VydmljZS4KVGhpcyB3aWxsIGp1c3QgcmV0dXJuIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCgogICAgbXkgJFJlc3VsdCA9ICRJbnZva2VyT2JqZWN0LT5QcmVwYXJlUmVxdWVzdCgKICAgICAgICBEYXRhID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXRhIHBheWxvYWQKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgICk7CgogICAgJFJlc3VsdCA9IHsKICAgICAgICBTdWNjZXNzICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAwIG9yIDEKICAgICAgICBFcnJvck1lc3NhZ2UgICAgPT4gJycsICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+IHsgICAgICAgICAgICAgICAgICAgICMgZGF0YSBwYXlsb2FkIGFmdGVyIEludm9rZXIKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgIH07Cgo9Y3V0CgpzdWIgUHJlcGFyZVJlcXVlc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgZm9yIG15ICROZWVkZWQgKHF3L0V2ZW50IEl0ZW1JRC8pIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdGhpbmcgaWYgRkFRcyBhcmUgbm90IGNvbmZpZ3VyZWQKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6RkFRU3RvcmVGaWVsZHMnKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBTdG9wQ29tbXVuaWNhdGlvbiA9PiAxLAogICAgICAgIH07CiAgICB9CgogICAgIyBoYW5kbGUgYWxsIGV2ZW50cyB3aGljaCBhcmUgbmVpdGhlciB1cGRhdGUgbm9yIGNyZWF0aW9uIGZpcnN0CgogICAgIyBkZWxldGUgdGhlIEZBUSBpdGVtCiAgICBpZiAoICRQYXJhbXtEYXRhfXtFdmVudH0gZXEgJ0ZBUURlbGV0ZScgKSB7CiAgICAgICAgbXkgJUNvbnRlbnQgPSAoCiAgICAgICAgICAgIHF1ZXJ5ID0+IHsKICAgICAgICAgICAgICAgIHRlcm0gPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17RGF0YX17SXRlbUlEfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgRGF0YSAgICA9PiB7CiAgICAgICAgICAgICAgICBkb2NhcGkgPT4gJ19kZWxldGVfYnlfcXVlcnknLAogICAgICAgICAgICAgICAgaWQgICAgID0+ICcnLAogICAgICAgICAgICAgICAgJUNvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHB1dCBhIHNpbmdsZSB0ZW1wb3JhcnkgYXR0YWNobWVudCBpbnRvIGEgcXVldWUKICAgICMgbW9yZSB0aGFuIG9uZSBhdHRhY2hlbWVudCBjb3VsZCBiZSBwdXQgcGVyIGNhbGwsIGJ1dCB0aGlzIHdvdWxkIG1ha2UgZXJyb3IgaGFuZGxpbmcgaGFyZGVyCiAgICBpZiAoICRQYXJhbXtEYXRhfXtFdmVudH0gZXEgJ1B1dFRNUEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIGdldCBmaWxlIGZvcm1hdCB0byBiZSBpbmdlc3RlZAogICAgICAgIG15ICRGaWxlRm9ybWF0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpJbmdlc3RBdHRhY2htZW50Rm9ybWF0Jyk7CiAgICAgICAgbXkgJUZvcm1hdEhhc2ggPSBtYXAgeyAkXyA9PiAxIH0gQHskRmlsZUZvcm1hdH07CgogICAgICAgIG15ICRNYXhGaWxlc2l6ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6SW5nZXN0TWF4RmlsZXNpemUnKTsKICAgICAgICBteSAkRmlsZW5hbWUgICAgPSAkUGFyYW17RGF0YX17RmlsZW5hbWV9OwogICAgICAgIG15ICRDb250ZW50VHlwZSA9ICRQYXJhbXtEYXRhfXtDb250ZW50VHlwZX07CiAgICAgICAgbXkgJEZpbGVzaXplICAgID0gJFBhcmFte0RhdGF9e0ZpbGVzaXplfTsKCiAgICAgICAgIyBpbmdlc3QgYXR0YWNobWVudCBvbmx5IGlmIGZpbGVzaXplIGxlc3MgdGhhbiBkZWZpbmVkIGluIHN5c2NvbmZpZwogICAgICAgIGlmICggJEZpbGVzaXplID4gJE1heEZpbGVzaXplICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN0b3BDb21tdW5pY2F0aW9uID0+IDEsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAoJFR5cGVGb3JtYXQpID0gJENvbnRlbnRUeXBlID1+IG0vXi4qP1wvKFtcZFx3XSspLzsKICAgICAgICBteSAoJE5hbWVGb3JtYXQpID0gJEZpbGVuYW1lICAgID1+IG0vXC4oW1xkXHddKykkLzsKCiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgaWYgKCAkRm9ybWF0SGFzaHskVHlwZUZvcm1hdH0gfHwgJEZvcm1hdEhhc2h7JE5hbWVGb3JtYXR9ICkgewogICAgICAgICAgICBteSAkRW5jb2RlZCA9IGVuY29kZV9iYXNlNjQoICRQYXJhbXtEYXRhfXtDb250ZW50fSApOwogICAgICAgICAgICAkRW5jb2RlZCA9fiBzL1xuLy9nOwogICAgICAgICAgICAkRGF0YXtmaWxlbmFtZX0gPSAkRmlsZW5hbWU7CiAgICAgICAgICAgICREYXRhe2RhdGF9ICAgICA9ICRFbmNvZGVkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBub3QgYSB2YWxpZCBmaWxlIHR5cGUKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTdG9wQ29tbXVuaWNhdGlvbiA9PiAxLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICBEYXRhICAgID0+IHsKICAgICAgICAgICAgICAgIGRvY2FwaSAgICAgID0+ICdfZG9jJywKICAgICAgICAgICAgICAgIHBhdGggICAgICAgID0+ICdBdHRhY2htZW50cycsICAgICMgYWN0dWFsbHkgdGhlIHBpcGVsaW5lCiAgICAgICAgICAgICAgICBpZCAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFsgXCVEYXRhIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGhhbmRsZSB0aGUgcmVndWxhciB1cGRhdGluZyBhbmQgY3JlYXRpb24KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICAjIGF0dGFjaG1lbnQgbWFuYWdlbWVudAogICAgaWYgKCAkUGFyYW17RGF0YX17RXZlbnR9IGVxICdGQVFBdHRhY2htZW50QWRkUG9zdCcgKSB7CiAgICAgICAgbXkgJFJlcXVlc3Rlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyk7CgogICAgICAgICMgY3JlYXRlIGEgdGVtcG9yYXJ5IGluZGV4IHRvICJpbmdlc3QiIHRoZSBhdHRhY2htZW50CiAgICAgICAgbXkgJFJlc3VsdCA9ICRSZXF1ZXN0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdGQVFJbmdlc3RBdHRhY2htZW50JywKICAgICAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwKICAgICAgICAgICAgICAgIEV2ZW50ID0+ICdQdXRUTVBBdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiwgaWYgYXR0YWNobWVudCB3YXMgbm90IGFkZGVkCiAgICAgICAgaWYgKCAhJFJlc3VsdCB8fCAhJFJlc3VsdC0+e0RhdGF9e19pZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU3RvcENvbW11bmljYXRpb24gPT4gMSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBhcmFtZXRlcnMKICAgICAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICAgICAgaWQgPT4gJFJlc3VsdC0+e0RhdGF9e19pZH0sCiAgICAgICAgKTsKICAgICAgICBteSAlQVBJID0gKAogICAgICAgICAgICBkb2NhcGkgPT4gJ19kb2MnLAogICAgICAgICk7CiAgICAgICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICAgICAgaW5kZXggPT4gJ3RtcGF0dGFjaG1lbnRzJywKICAgICAgICApOwoKICAgICAgICAjIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgdGhlIGluZ2VzdC1wbHVnaW4KICAgICAgICAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzSW5nZXN0X0dFVCcsCiAgICAgICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICAgICAgICAgICAgIEFQSSAgICAgICA9PiBcJUFQSSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgcHJvY2Vzc2VkIGRhdGEgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGF0dGFjaG1lbnQgYXJyYXkgb2YgdGhlIEZBUQogICAgICAgIG15IEBBdHRhY2htZW50QXJyYXk7CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50QXR0ciAoIEB7ICRSZXN1bHQtPntEYXRhfXtfc291cmNlfXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnQgPSAoCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkQXR0YWNobWVudEF0dHItPntmaWxlbmFtZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICA9PiAkQXR0YWNobWVudEF0dHItPnthdHRhY2htZW50fXtjb250ZW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudEFycmF5LCBcJUF0dGFjaG1lbnQ7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSB0aGUgZG9jIGluIHRtcGF0dGFjaG1lbnQKICAgICAgICAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzSW5nZXN0X0RFTEVURScsCiAgICAgICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICAgICAgICAgICAgIEFQSSAgICAgICA9PiBcJUFQSSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSB0aGUgQ0kgd2l0aCB0aGUgZXh0cmFjdGVkIGRhdGEKICAgICAgICBteSAlQ29udGVudCA9ICgKICAgICAgICAgICAgc2NyaXB0ID0+IHsKICAgICAgICAgICAgICAgIHNvdXJjZSA9PiAnY3R4Ll9zb3VyY2UuQXR0YWNobWVudHMuYWRkQWxsKHBhcmFtcy5uZXcpJywKICAgICAgICAgICAgICAgIHBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgbmV3ID0+IFxAQXR0YWNobWVudEFycmF5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICAgICAgZG9jYXBpID0+ICdfdXBkYXRlJywKICAgICAgICAgICAgICAgIGlkICAgICA9PiAkUGFyYW17RGF0YX17SXRlbUlEfSwKICAgICAgICAgICAgICAgICVDb250ZW50LAogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEYXRhfXtFdmVudH0gZXEgJ0ZBUUF0dGFjaG1lbnREZWxldGVQb3N0JyApIHsKICAgICAgICBteSAkUmVxdWVzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKCiAgICAgICAgIyBzZXQgcGFyYW1ldGVycwogICAgICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgICAgICBpZCA9PiAkUGFyYW17RGF0YX17SXRlbUlEfSwKICAgICAgICApOwogICAgICAgIG15ICVBUEkgPSAoCiAgICAgICAgICAgIGRvY2FwaSA9PiAnX2RvYycsCiAgICAgICAgKTsKICAgICAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgICAgICBpbmRleCA9PiAnZmFxJywKICAgICAgICApOwoKICAgICAgICAjIHJldHJpZXZlIHRoZSBjdXJyZW50IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJFJlc3VsdCA9ICRSZXF1ZXN0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc0luZ2VzdF9HRVQnLAogICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICAgICAgICAgICAgICBBUEkgICAgICAgPT4gXCVBUEksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHByb2Nlc3NlZCBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBhdHRhY2htZW50IGFycmF5IG9mIHRoZSBGQVEKICAgICAgICBteSBAQXR0YWNobWVudEFycmF5ID0gKCk7CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFJlc3VsdC0+e0RhdGF9e19zb3VyY2V9e0F0dGFjaG1lbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBzb3J0IG91dCBkZWxldGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudC0+e0ZpbGVuYW1lfSBuZSAkUGFyYW17RGF0YX17RmlsZW5hbWV9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudEFycmF5LCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb250ZW50ID0gKAogICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRBcnJheSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICAgICAgZG9jYXBpID0+ICdfdXBkYXRlJywKICAgICAgICAgICAgICAgIGlkICAgICA9PiAkUGFyYW17RGF0YX17SXRlbUlEfSwKICAgICAgICAgICAgICAgIGRvYyAgICA9PiBcJUNvbnRlbnQsCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgICMgaWdub3JlIGV2ZW50cyBvdGhlciB0aGFuIEZBUUNyZWF0ZSBvciBGQVFVcGRhdGUKICAgIGlmICggJFBhcmFte0RhdGF9e0V2ZW50fSAhfiAvRkFRQ3JlYXRlfEZBUVVwZGF0ZS8gKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU3RvcENvbW11bmljYXRpb24gPT4gMSwKICAgICAgICB9OwogICAgfQoKICAgICMgZGVmaW5lIHRoZSBkZWZhdWx0IEFQSQogICAgbXkgJEFQSSA9ICRQYXJhbXtEYXRhfXtFdmVudH0gZXEgJ0ZBUUNyZWF0ZScgPyAnX2RvYycgOiAnX3VwZGF0ZSc7CgogICAgIyBnYXRoZXIgYWxsIGZpZWxkcyB3aGljaCBoYXZlIHRvIGJlIHN0b3JlZAogICAgbXkgJFN0b3JlICAgICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6RkFRU3RvcmVGaWVsZHMnKTsKICAgIG15ICRTZWFyY2ggICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkZBUVNlYXJjaEZpZWxkcycpOwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICVEYXRhVG9TdG9yZTsKICAgIGZvciBteSAkRmllbGQgKCBAeyAkU3RvcmUtPntCYXNpY30gfSwgQHsgJFNlYXJjaC0+e0Jhc2ljfSB9ICkgewogICAgICAgICREYXRhVG9TdG9yZXskRmllbGR9ID0gMTsKICAgIH0KCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBAeyAkU3RvcmUtPntEeW5hbWljRmllbGR9IH0sIEB7ICRTZWFyY2gtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZDsKCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ0ZBUScgKSB7CiAgICAgICAgICAgICREYXRhVG9TdG9yZXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIn0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcmVxdWVzdAogICAgbXkgJUNvbnRlbnQ7CiAgICBteSAkR2V0RHluYW1pY0ZpZWxkcyA9ICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VhcmNoLT57RHluYW1pY0ZpZWxkfSApIHx8IElzQXJyYXlSZWZXaXRoRGF0YSggJFN0b3JlLT57RHluYW1pY0ZpZWxkfSApICkgPyAxIDogMDsKICAgIG15ICVGQVEgICAgICAgICAgICAgID0gJEZBUU9iamVjdC0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gJFBhcmFte0RhdGF9e0l0ZW1JRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgIEl0ZW1GaWVsZHMgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEKICAgICk7CgogICAgSVRFTUZJRUxEOgogICAgZm9yIG15ICRJdGVtRmllbGQgKHF3KEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgIG5leHQgSVRFTUZJRUxEIGlmICEkRkFReyRJdGVtRmllbGR9OwogICAgICAgICRGQVF7JEl0ZW1GaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRkFReyRJdGVtRmllbGR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBpdGVyYXRlIG92ZXIgZHluYW1pYyBmaWVsZHMgYW5kIHJlcGxhY2UgdmFsdWUgd2l0aCBEaXNwbGF5VmFsdWVSZW5kZXIgcmVzdWx0CiAgICBpZiAoJEdldER5bmFtaWNGaWVsZHMpIHsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICRERk5hbWUgKCBncmVwIHsgJERhdGFUb1N0b3JleyRffSAmJiAkXyA9fiAvXkR5bmFtaWNGaWVsZF8vIH0ga2V5cyAlRGF0YVRvU3RvcmUgKSB7CiAgICAgICAgICAgIG15ICRERk5hbWVTaG9ydCA9IHN1YnN0ciAkREZOYW1lLCBsZW5ndGgoJ0R5bmFtaWNGaWVsZF8nKTsKICAgICAgICAgICAgbXkgJERGQ29uZmlnICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICRERk5hbWVTaG9ydCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRERkNvbmZpZyk7CiAgICAgICAgICAgIG15ICRERlZhbHVlU3RydWN0dXJlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJERGQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRGQVF7JERGTmFtZX0sCiAgICAgICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGQVF7JERGTmFtZX0gPSAkREZWYWx1ZVN0cnVjdHVyZS0+e1ZhbHVlfTsKICAgICAgICB9CiAgICB9CiAgICAlQ29udGVudCA9ICgKICAgICAgICAoIG1hcCB7ICRfID0+ICRGQVF7JF99IH0ga2V5cyAlRGF0YVRvU3RvcmUgKSwKICAgICk7CgogICAgaWYgKCAkQVBJIGVxICdfdXBkYXRlJyApIHsKICAgICAgICBkZWxldGUgJENvbnRlbnR7QXR0YWNobWVudHN9OwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICAgICAgZG9jYXBpID0+ICRBUEksCiAgICAgICAgICAgICAgICBpZCAgICAgPT4gJFBhcmFte0RhdGF9e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBkb2MgICAgPT4gXCVDb250ZW50LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29udGVudHtBdHRhY2htZW50c30gPSBbXTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICBEYXRhICAgID0+IHsKICAgICAgICAgICAgICAgIGRvY2FwaSA9PiAkQVBJLAogICAgICAgICAgICAgICAgaWQgICAgID0+ICRQYXJhbXtEYXRhfXtJdGVtSUR9LAogICAgICAgICAgICAgICAgJUNvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KfQoKPWhlYWQyIEhhbmRsZVJlc3BvbnNlKCkKCmhhbmRsZSByZXNwb25zZSBkYXRhIG9mIHRoZSBjb25maWd1cmVkIHJlbW90ZSB3ZWIgc2VydmljZS4KVGhpcyB3aWxsIGp1c3QgcmV0dXJuIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCgogICAgbXkgJFJlc3VsdCA9ICRJbnZva2VyT2JqZWN0LT5IYW5kbGVSZXNwb25zZSgKICAgICAgICBSZXNwb25zZVN1Y2Nlc3MgICAgICA9PiAxLCAgICAgICAgICAgICAgIyBzdWNjZXNzIHN0YXR1cyBvZiB0aGUgcmVtb3RlIHdlYiBzZXJ2aWNlCiAgICAgICAgUmVzcG9uc2VFcnJvck1lc3NhZ2UgPT4gJycsICAgICAgICAgICAgICMgaW4gY2FzZSBvZiB3ZWIgc2VydmljZSBlcnJvcgogICAgICAgIERhdGEgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRhdGEgcGF5bG9hZAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKCiAgICAkUmVzdWx0ID0gewogICAgICAgIFN1Y2Nlc3MgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSAgICA9PiAnJywgICAgICAgICAgICAgICAgICAjIGluIGNhc2Ugb2YgZXJyb3IKICAgICAgICBEYXRhICAgICAgICAgICAgPT4geyAgICAgICAgICAgICAgICAgICAgIyBkYXRhIHBheWxvYWQgYWZ0ZXIgSW52b2tlcgogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgfTsKCj1jdXQKCnN1YiBIYW5kbGVSZXNwb25zZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSByZXNwb25zZSwgZm9yd2FyZCBpdAogICAgaWYgKCAhJFBhcmFte1Jlc3BvbnNlU3VjY2Vzc30gKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkUGFyYW17UmVzcG9uc2VFcnJvck1lc3NhZ2V9LAogICAgICAgIH07CiAgICB9CgogICAgIyBQZXIgZGVmYXVsdCB0aGVyZSBpcyBubyByZXNjaGVkdWxpbmcgb2YgRWxhc3RpY3NlYXJjaDo6Q29uZmlnSXRlbU1hbmFnZW1lbnQgcmVxdWVzdHMsCiAgICAjIGJ1dCBFcnJvckhhbmRsaW5nOjpSZXF1ZXN0UmV0cnkgY291bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgbWFudWFsbHksIGUuZy4gdmlhIHRoZSBhZG1pbiBpbnRlcmZhY2UuCiAgICBpZiAoICRQYXJhbXtEYXRhfXtSZXNwb25zZUNvbnRlbnR9ICYmICRQYXJhbXtEYXRhfXtSZXNwb25zZUNvbnRlbnR9ID1+IG17UmVTY2hlZHVsZT0xfSApIHsKCiAgICAgICAgIyBSZXNwb25zZUNvbnRlbnQgaGFzIFVSSSBsaWtlIHBhcmFtcywgY29udmVydCB0aGVtIGludG8gYSBoYXNoCiAgICAgICAgbXkgJVF1ZXJ5UGFyYW1zID0gc3BsaXQgL1smPV0vLCAkUGFyYW17RGF0YX17UmVzcG9uc2VDb250ZW50fTsKCiAgICAgICAgIyB1bmVzY2FwZSBVUkkgc3RyaW5ncyBpbiBxdWVyeSBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlUXVlcnlQYXJhbXMgKSB7CiAgICAgICAgICAgICRRdWVyeVBhcmFtc3skUGFyYW19ID0gVVJJOjpFc2NhcGU6OnVyaV91bmVzY2FwZSggJFF1ZXJ5UGFyYW1zeyRQYXJhbX0gKTsKICAgICAgICB9CgogICAgICAgICMgZml4IEV4ZWN1dGlvblRpbWUgcGFyYW0KICAgICAgICBpZiAoICRRdWVyeVBhcmFtc3tFeGVjdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJFF1ZXJ5UGFyYW1ze0V4ZWN1dGlvblRpbWV9ID1+IHN7KFxkKylcKyhcZCspfXskMSAkMn07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdSZS1TY2hlZHVsaW5nLi4uJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUXVlcnlQYXJhbXMsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBEYXRhICAgID0+ICRQYXJhbXtEYXRhfSwKICAgIH07Cn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.UI.Elasticsearch.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZmY5ZTI5N2JhZjI4N2UxNjA3MWQzYWM2YWQ3ZjZjMTNmMTFhYzdmYSAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5VSS5FbGFzdGljc2VhcmNoLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuVUkgPSBDb3JlLlVJIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5VSS5FbGFzdGljc2VhcmNoCiAqIEBtZW1iZXJvZiBDb3JlLlVJCiAqIEBhdXRob3IgUm90aGVyIE9TUwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciBDdXN0b21lckluZm9ybWF0aW9uQ2VudGVyLgogKi8KQ29yZS5VSS5FbGFzdGljc2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIE1pblNlYXJjaAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuRWxhc3RpY1NlYXJjaAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE1pbmltdW0gbGVuZ3RoIG9mIHNlYXJjaCBzdHJpbmcgd2hpY2ggaW5kdWNlcyBhIHNlYXJjaC4KICAgICovCiAgICB2YXIgTWluU2VhcmNoID0gMjsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRTZWFyY2hGaWVsZAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuRWxhc3RpY3NlYXJjaAogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRJbnB1dEZpZWxkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQWN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhbiBFbGFzdGljc2VhcmNoIHNlYXJjaCBmaWVsZC4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFNlYXJjaEZpZWxkID0gZnVuY3Rpb24gKCAkSW5wdXRGaWVsZCwgQWN0aW9uICkgewoKICAgICAgICAvLyBoYW5kbGUgc2VhcmNoZXMgb24gaW5wdXQKICAgICAgICAkSW5wdXRGaWVsZC5vbignaW5wdXQnLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGlmIHRoZSBkaWFsb2cgYWxyZWFkeSBleGlzdHMsIHVzZSBpdAogICAgICAgICAgICB2YXIgJERpYWxvZyA9ICQoJ2Rpdi5EaWFsb2c6dmlzaWJsZScpOwoKICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGlucHV0IGxlbmd0aAogICAgICAgICAgICB2YXIgRnVsbHRleHRFU1ZhbHVlID0gJElucHV0RmllbGQudmFsKCk7CiAgICAgICAgICAgIGlmICggdHlwZW9mIEZ1bGx0ZXh0RVNWYWx1ZSA9PSAndW5kZWZpbmVkJyApewogICAgICAgICAgICAgICAgRnVsbHRleHRFU1ZhbHVlID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIExlbmd0aEZ1bGx0ZXh0ID0gRnVsbHRleHRFU1ZhbHVlLmxlbmd0aDsKCiAgICAgICAgICAgIC8vIGNsb3NlIGFuIGV4aXN0aW5nIGRpYWxvZywgaWYgdGhlIHNlYXJjaCBzdHJpbmcgaXMgbGVzcyB0aGFuIE1pblNlYXJjaCBjaGFyYWN0ZXJzIGxvbmcKICAgICAgICAgICAgaWYgKCB0eXBlb2YgJERpYWxvZ1swXSAhPSAndW5kZWZpbmVkJyAmJiBMZW5ndGhGdWxsdGV4dCA8IE1pblNlYXJjaCApIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCAkRGlhbG9nICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVsc2UgdXBkYXRlIHRoZSBkaWFsb2cKICAgICAgICAgICAgZWxzZSBpZiAoIExlbmd0aEZ1bGx0ZXh0ID49IE1pblNlYXJjaCApIHsKICAgICAgICAgICAgICAgIFVwZGF0ZURpYWxvZyggJElucHV0RmllbGQsIEFjdGlvbiwgRnVsbHRleHRFU1ZhbHVlICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CgogICAgICAgIC8vIGRlbGV0ZSBpbnB1dCBvbiBibHVyLCBpZiB0aGUgZGlhbG9nIGlzIG5vdCBvcGVuCiAgICAgICAgJElucHV0RmllbGQub24oJ2JsdXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICREaWFsb2cgPSAkKCdkaXYuRGlhbG9nOnZpc2libGUnKTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgJERpYWxvZ1swXSA9PSAndW5kZWZpbmVkJyApIHsKICAgICAgICAgICAgICAgICRJbnB1dEZpZWxkLnZhbCgnJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gZGVsZXRlIGlucHV0IG9uIGNsb3NpbmcgdGhlIGRpYWxvZywgaWYgSW5wdXRGaWVsZCBpcyBub3QgZm9jdXNlZAogICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnRXZlbnQuVUkuRGlhbG9nLkNsb3NlRGlhbG9nLkNsb3NlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoICEkSW5wdXRGaWVsZC5pcygnOmZvY3VzJykgKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRGaWVsZC52YWwoJycpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBVcGRhdGVEaWFsb2cKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLkVsYXN0aWNzZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRJbnB1dEZpZWxkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQWN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRnVsbHRleHRFU1ZhbHVlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVXBkYXRlcyB0aGUgRWxhc3RpY3NlYXJjaCBxdWljayByZXN1bHQgZGlhbG9nLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVEaWFsb2coICRJbnB1dEZpZWxkLCBBY3Rpb24sIEZ1bGx0ZXh0RVNWYWx1ZSApewoKICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgQWN0aW9uOiBBY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdTZWFyY2hVcGRhdGUnLAogICAgICAgICAgICAgICAgRnVsbHRleHRFUzogRnVsbHRleHRFU1ZhbHVlLAovLyBSb3RoZXIgT1NTIC8gRWxhc3RpY3NlYXJjaC1GQVEKICAgICAgICAgICAgICAgIFVSTDogd2luZG93LmxvY2F0aW9uLmhyZWYsCi8vIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgICAgIH07CgogICAgICAgIC8vIGluaXRpYXRlIHRoZSBBSkFYIGNhbGwKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBVUkwsCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uICggUmVzcG9uc2UgKSB7CgogICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRFU1ZhbHVlID0gJElucHV0RmllbGQudmFsKCk7CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcmVzdWx0cyBzdGlsbCBtYXRjaGVzIHRoZSBjdXJyZW50IGlucHV0CiAgICAgICAgICAgICAgICBpZiAoIEZ1bGx0ZXh0RVNWYWx1ZSA9PSBDdXJyZW50RVNWYWx1ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyICREaWFsb2cgPSAkKCdkaXYuRGlhbG9nOnZpc2libGUnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIG5ldyBkaWFsb2csIGlmIGl0IGRvZXNuJ3QgZXhpc3QKICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiAkRGlhbG9nWzBdID09ICd1bmRlZmluZWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICBPcGVuRGlhbG9nKCBSZXNwb25zZSApOwogICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXRGaWVsZC5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkaWFsb2cKICAgICAgICAgICAgICAgICAgICAkKCcjb29vRVNPdXRlcicpLmh0bWwoUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2h0bWwnCiAgICAgICAgKTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgT3BlbkRpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuVUkuRWxhc3RpY3NlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUmVzcG9uc2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBPcGVucyB0aGUgRWxhc3RpY3NlYXJjaCBxdWljayByZXN1bHQgZGlhbG9nLgogICAgICovCiAgICBmdW5jdGlvbiBPcGVuRGlhbG9nKCBSZXNwb25zZSApIHsKCiAgICAgICAgdmFyIEN1c3RvbWVySW50ZXJmYWNlID0gQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpID09PSBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpOwoKICAgICAgICAvLyBkZWZpbmUgYW5kIG9wZW4gdGhlIGRpYWxvZyBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIGlmICggQ3VzdG9tZXJJbnRlcmZhY2UgKSB7CiAgICAgICAgICAgIHZhciBNaW5XaWR0aCAgICAgID0gJCh3aW5kb3cpLndpZHRoKCkgPiA3NjcgPyAnNDAwcHgnIDogJzMyMHB4JzsKICAgICAgICAgICAgdmFyIEZ1bGxzaXplICAgICAgPSAkKHdpbmRvdykud2lkdGgoKSA+IDc2NyA/ICcnIDogJ3dpZHRoOiAxMDB2dzsnOwogICAgICAgICAgICB2YXIgSFRNTCAgICAgICAgICA9ICI8ZGl2IGlkPSdvb29FU091dGVyJyBzdHlsZT0nIiArIEZ1bGxzaXplICsgIm1pbi13aWR0aDogIiArIE1pbldpZHRoICsgIic+IiArIFJlc3BvbnNlICsgIjwvZGl2PiI7CiAgICAgICAgICAgIHZhciBQb3NSaWdodCAgICAgID0gJCh3aW5kb3cpLndpZHRoKCkgPiA3NjcgPyAnMTIwcHgnIDogJzBweCc7CiAgICAgICAgICAgIHZhciBQb3NUb3AgICAgICAgID0gJCh3aW5kb3cpLndpZHRoKCkgPiA3NjcgPyAnMTIwcHgnIDogJzE5MnB4JzsKICAgICAgICAgICAgdmFyIERpYWxvZ09wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBIVE1MOiBIVE1MLAogICAgICAgICAgICAgICAgVGl0bGU6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdSZXN1bHRzJyksCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogUG9zVG9wLAogICAgICAgICAgICAgICAgUG9zaXRpb25SaWdodDogUG9zUmlnaHQsCiAgICAgICAgICAgICAgICBNb2RhbDogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkVzY2FwZTogdHJ1ZSwKICAgICAgICAgICAgICAgIEFsbG93QXV0b0dyb3c6IGZhbHNlLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyggRGlhbG9nT3B0aW9ucyApOwoKICAgICAgICAgICAgaWYgKCAkKHdpbmRvdykud2lkdGgoKSA8IDc2OCApIHsKICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIG92ZXJsYXkgdG8ga2VlcCBhY2Nlc3MgdG8gdGhlIGlucHV0IGZpZWxkCiAgICAgICAgICAgICAgICAkKCcjT3ZlcmxheScpLmNzcygndG9wJywnMjAxLjVweCcpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgLy8gZGVmaW5lIGFuZCBvcGVuIHRoZSBkaWFsb2cgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIEhUTUwgICAgICAgICAgPSAiPGRpdiBpZD0nb29vRVNPdXRlcicgc3R5bGU9J21pbi13aWR0aDogNTAwcHgnPiIgKyBSZXNwb25zZSArICI8L2Rpdj4iOwogICAgICAgICAgICB2YXIgRGlhbG9nT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgIEhUTUw6IEhUTUwsCiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1Jlc3VsdHMnKSwKICAgICAgICAgICAgICAgIFBvc2l0aW9uVG9wOiAnMTAwcHgnLAogICAgICAgICAgICAgICAgUG9zaXRpb25MZWZ0OiAnQ2VudGVyJywKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogZmFsc2UsCiAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgQWxsb3dBdXRvR3JvdzogZmFsc2UsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKCBEaWFsb2dPcHRpb25zICk7CgogICAgICAgICAgICAvLyBtb3ZlIHRoZSBvdmVybGF5IHRvIGtlZXAgYWNjZXNzIHRvIHRoZSBpbnB1dCBmaWVsZAogICAgICAgICAgICAkKCcjT3ZlcmxheScpLmNzcygndG9wJywnOTRweCcpOwogICAgICAgIH0KCiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLlVJLkVsYXN0aWNzZWFyY2ggfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Customer.Search.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZmY5ZTI5N2JhZjI4N2UxNjA3MWQzYWM2YWQ3ZjZjMTNmMTFhYzdmYSAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5DdXN0b21lci5TZWFyY2guanMKLy8gLS0KLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi8vIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQovLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5DdXN0b21lciA9IENvcmUuQ3VzdG9tZXIgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkN1c3RvbWVyLlNlYXJjaAogKiBAbWVtYmVyb2YgQ29yZS5DdXN0b21lcgogKiBAYXV0aG9yIFJvdGhlciBPU1MgR21iSAogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBzcGVjaWFsIGZ1bmN0aW9ucyBmb3IgdGhlIHRpY2tldCBzZWFyY2ggaW4gdGhlIGN1c3RvbWVyIGludGVyZmFjZS4KICovCkNvcmUuQ3VzdG9tZXIuU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtb2R1bGUgZnVuY3Rpb25hbGl0eS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJCgnI29vb1NlYXJjaEJveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI29vb1NlYXJjaCcpLmFkZENsYXNzKCdvb29GdWxsJyk7CiAgICAgICAgICAgICQoJyNvb29TZWFyY2gnKS5mb2N1cygpOwoKICAgICAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBGQVEgdG8gRVMKLy8gUm90aGVyIE9TUyAtIEVsYXN0aWNzZWFyY2gtRkFRCi8vICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnRVNBY3RpdmUnKSA9PSAxICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdDdXN0b21lckZBUUV4cGxvcmVyJyAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQ3VzdG9tZXJGQVFab29tJyl7CiAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0VTQWN0aXZlJykgPT0gMSl7Ci8vIEVPIEVsYXN0aWNzZWFyY2gtRkFRCiAgICAgICAgICAgICAgICBDb3JlLlVJLkVsYXN0aWNzZWFyY2guSW5pdFNlYXJjaEZpZWxkKCQoJyNvb29TZWFyY2gnKSwgIkN1c3RvbWVyRWxhc3RpY3NlYXJjaFF1aWNrUmVzdWx0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoJyNvb29TZWFyY2gnKS5vbignYmx1cicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI29vb1NlYXJjaCcpLnJlbW92ZUNsYXNzKCdvb29GdWxsJyk7CiAgICAgICAgICAgICAgICAgICAgJCgnI29vb1NlYXJjaCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9LDYwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIC8qQ29yZS5BcHAuU3Vic2NyaWJlKCdFdmVudC5VSS5EaWFsb2cuQ2xvc2VEaWFsb2cuQ2xvc2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI29vb1NlYXJjaCcpLmJsdXIoKTsKICAgICAgICB9KTsqLwoKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkN1c3RvbWVyLlNlYXJjaCB8fCB7fSkpOwo=</File>
        <File Location="var/packagesetup/ElasticsearchFAQ.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI1IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6RWxhc3RpY3NlYXJjaEZBUTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RWxhc3RpY3NlYXJjaCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpFbGFzdGljc2VhcmNoRkFRIC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6OkZBUScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGFsd2F5cyBkaXNjYXJkIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBwYWNrYWdlIGNvZGUgaXMgZXhlY3V0ZWQsCiAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBuZXdseSwgc28gdGhhdCBpdAogICAgIyB3aWxsIHVzZSB0aGUgcmVjZW50bHkgd3JpdHRlbiBuZXcgY29uZmlnIGZyb20gdGhlIHBhY2thZ2UKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X1VwZGF0ZUVsYXN0aWNzZWFyY2hXZWJTZXJ2aWNlKAogICAgICAgIEFjdGlvbiA9PiAnQWRkJwogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewoKICAgICMgc3R1YgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9VcGRhdGVFbGFzdGljc2VhcmNoV2ViU2VydmljZSgKICAgICAgICBBY3Rpb24gPT4gJ1JlbW92ZScKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9CgpzdWIgX1VwZGF0ZUVsYXN0aWNzZWFyY2hXZWJTZXJ2aWNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwogICAgbXkgJFdlYnNlcnZpY2UgICAgICAgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZUdldCgKICAgICAgICBOYW1lID0+ICdFbGFzdGljc2VhcmNoJywKICAgICk7CgogICAgaWYgKCAhJFdlYnNlcnZpY2UgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEaWQgbm90IGZpbmQgdGhlIEVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgJFdlYnNlcnZpY2UtPntDb25maWd9LT57UmVxdWVzdGVyfS0+e0ludm9rZXJ9LT57RkFRSW5nZXN0QXR0YWNobWVudH0gPSB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnRWxhc3RpY3NlYXJjaDo6RkFRTWFuYWdlbWVudCcsCiAgICAgICAgfTsKICAgICAgICAkV2Vic2VydmljZS0+e0NvbmZpZ30tPntSZXF1ZXN0ZXJ9LT57SW52b2tlcn0tPntGQVFNYW5hZ2VtZW50fSA9IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdFbGFzdGljc2VhcmNoOjpGQVFNYW5hZ2VtZW50JywKICAgICAgICAgICAgRXZlbnRzICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnRkFRQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gJzAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdGQVFEZWxldGUnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnRkFRVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gJzAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnRkFRQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyA9PiAnMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQXN5bmNocm9ub3VzID0+ICcwJywKICAgICAgICAgICAgICAgICAgICBFdmVudCAgICAgICAgPT4gJ0ZBUUF0dGFjaG1lbnREZWxldGVQb3N0JwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICAgICAgJFdlYnNlcnZpY2UtPntDb25maWd9LT57UmVxdWVzdGVyfS0+e1RyYW5zcG9ydH0tPntDb25maWd9LT57SW52b2tlckNvbnRyb2xsZXJNYXBwaW5nfS0+e0ZBUUluZ2VzdEF0dGFjaG1lbnR9ID0gewogICAgICAgICAgICBDb21tYW5kICAgID0+ICdQT1NUJywKICAgICAgICAgICAgQ29udHJvbGxlciA9PiAnL3RtcGF0dGFjaG1lbnRzLzpkb2NhcGkvOmlkP3BpcGVsaW5lPTpwYXRoJywKICAgICAgICB9OwogICAgICAgICRXZWJzZXJ2aWNlLT57Q29uZmlnfS0+e1JlcXVlc3Rlcn0tPntUcmFuc3BvcnR9LT57Q29uZmlnfS0+e0ludm9rZXJDb250cm9sbGVyTWFwcGluZ30tPntGQVFNYW5hZ2VtZW50fSA9IHsKICAgICAgICAgICAgQ29tbWFuZCAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgIENvbnRyb2xsZXIgPT4gJy9mYXEvOmRvY2FwaS86aWQnLAogICAgICAgIH07CiAgICB9CgogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnUmVtb3ZlJyApIHsKICAgICAgICBkZWxldGUgJFdlYnNlcnZpY2UtPntDb25maWd9e1JlcXVlc3Rlcn17SW52b2tlcn17RkFRSW5nZXN0QXR0YWNobWVudH07CiAgICAgICAgZGVsZXRlICRXZWJzZXJ2aWNlLT57Q29uZmlnfXtSZXF1ZXN0ZXJ9e0ludm9rZXJ9e0ZBUU1hbmFnZW1lbnR9OwogICAgICAgIGRlbGV0ZSAkV2Vic2VydmljZS0+e0NvbmZpZ317UmVxdWVzdGVyfXtUcmFuc3BvcnR9e0ludm9rZXJDb250cm9sbGVyTWFwcGluZ317RkFRSXRlbUluZ2VzdEF0dGFjaG1lbnR9OwogICAgICAgIGRlbGV0ZSAkV2Vic2VydmljZS0+e0NvbmZpZ317UmVxdWVzdGVyfXtUcmFuc3BvcnR9e0ludm9rZXJDb250cm9sbGVyTWFwcGluZ317RkFRTWFuYWdlbWVudH07CiAgICAgICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICAgICAgaW5kZXggPT4gJ2ZhcScsCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RWxhc3RpY3NlYXJjaCcpLT5Ecm9wSW5kZXgoCiAgICAgICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICApOwogICAgfQoKICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gQWN0aW9uIHByb3ZpZGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN1Y2Nlc3MgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZVVwZGF0ZSgKICAgICAgICAleyRXZWJzZXJ2aWNlfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBFbGFzdGljc2VhcmNoIHdlYnNlcnZpY2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCg==</File>
        <File Location="doc/en/Elasticsearch-FAQ.pdf" Permission="644" Encode="Base64">JVBERi0xLjUKJeTw7fgKNCAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA4MjgvSGVpZ2h0IDI1My9Db2xvclNwYWNlL0RldmljZUdyYXkvQml0c1BlckNvbXBvbmVudAo4L0RlY29kZVBhcm1zPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9ycyAxL0NvbHVtbnMgODI4L1ByZWRpY3RvciAyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aAoyNDQzPj4Kc3RyZWFtCnja7d2LddpYAgZgUkGYCqKtIGwFZisIqWCYCsJUsGwFw1QwuIJlKli5gpUrGKhgTQVZJ465AoORhB7X6PvOmXMSGzsaSf/VfWswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF5LktEwSR7/kC3WNf3K8TSp/LOr5cN1nufZ5PxnsodsnTV5EE9XJh2s19mDW/+yUzke34S/bcf1XLflz5f89P34Gq/qMP1Y8JPb1WrV1FHkr8wmS9NMBKpdzcnk0+FlS+q4bef/vOzn70dXeLbTmxIf3i4WjZQfk38ffGGTLlNJKP/wPvZw+HVRw69+eH/hL/jH9V3P0X/LfX47XzRwFNmRZ99muVyLQwnT+YejX//XvIb201+X/oY6jiK2ouo/ZX/iblL/o+fr8S/fzqXn0uTEkp1fF7JTX+vzfHakp/BlnJ+uev+yrOEfWH+48Bf8PZOdRsKz+nTyW7/P9bud7SGYfzn9zc2ojhP4okVatrYyHshOI+F57Si205V0vH72lq88FDaTeq7V7LeLojN5kJ06y7J8bf2PV77559Sj5xWnuo/vBoOHbL2q69wlk+GJ7+z+/bv0VL3iKsccQnZuT7csRsPkoGS7ndZ8HMl08PhUTz40WnZeZX1t+bK+u02ztMUh5q919kq8yey83gGfjKd7rdGmuutHyXj8saH27lVG58XQdpND2LJTJTvfPrr42E7b78jg+OD3mZwcK2rSgzHLu2X7pYzsFHiS5GfONDtOnEynTdcSrzE6d/O0g6OQnSJhyIWn8Xv5cLBPeM5FZzNNOzkM2Sn0IMnNfnvXeFV+NnsvPMXbOp3dubJTKDtJtrudPzffIk2WN8Jz2t4swPtpZ32RslOsARNqba2cqNk8/+jR23aq9Tm4nXU3BiY7xbIT5l23M8titMq3eq5wInv19uAfMdTXZKfEfbmbFLhJ2q/U17OO6yrkas9dP5Blp2B2Qm/Bu3aOcLjKNXqucUphNfk1ix3XZWWnYHbC7Kl3bR1jfpb1FS4DqdYQ/C2eZmBfsxOuQbzZyVfbtqO14DyeknWosXU+5aKv2QlRiDc7e+H5cyI5e31s3VdjZSfi7OwNoOtr21sCHUH3iewUvCcXXzrITr5DVnfB3mMngqJEdsr2s22HbR5nrr/Agyf32IlhroXslB3fabf8zzWOPXjCYyeKAS/ZKZadUOS13L2Tq7X1/cGTK0eiuFtlp9gdGW7hzy2vTgwzH/s+JzRcg00ykJ03k50wnP1Ty7WF3K4kP/V7Zk4oReIYKZadQtkJN3D7rY5wy/R7PnWoNkcyvU92Sq59a//+DVWVfo+PhqkgkWziIDtFshM+3UWRF/bi73WlLXTXR7JP7dee1gfCXqkFLkSur6uLIiYMy/a60vY1rp6C3LDF39b9rDyfH+ocLsJodic17bDurs89baHJGcu+W8/lb+/2AXuuAZztstnb9bibDp5dAXeVbxEr3dyJZpzrqULQv62PfywtO1NmJJNpfmOJjob2w3h6jxs84SS8i+aYksd6QJr28GJMHgvxg1esTcf7VenR/hZ6tW/lXlBob/V4asGuq9PcpHgfRSc18PKqko2zPi8f/Rpbc4cX1df4ouO+2TsHlp/HfHWOR6fDVc/qK+U3mKCTq3PcZr7s6tB2w4KyIztvMTuPd+60o0fPbl5Duwvv4rw679yq8Xl4f+4TXb0DtJPNEuIS+hpl5+31FXzXzayYMC7Y2xtH8RG3vV3CYwqPCkuk2RmPs2zdw6sxHI8O3+w6PXin8bF36HbRVJWdKOtsT9O1ejhu8L0g287OPEaGo/F4f8S0i+mg6mwxFh/Pc3R7F57nOkCB7QeG01n++dPBCjSV/Vx2Ilm9kxt169kahOH/fvxhkxQq+PPvkmq/1qaPOsbxnb6ufQuXolihMVqG+dTtD1AaG41xTo411wWLsfy+6q2XfObkxDinT3aKBiG3r3rryzfNBY2x/JCdwg+R0NnVdqsjLLru8Rzi+Na+yU7xCthu6XPbe4Na+7ZXdH1eyc5by064ei2fLGuu9x6+sVRcZad4dsLyzZar3LtJqn3e6yOchU0iO28tO62/J/6HsJdcr5cbx7u3oeyUuXqtNldDlS2Wmn4nQqsvkh4T2SmRnY6mxoTNsHs9/X43FSSWcXzZqZSdVmcw7bLT83dd7x77kcwfk51K2Wm1r3j3z/b7HSK7eVSxFCHtZOfbuph0cVH/6nQ6yi78FW81O8/vCux1L9v3e2Dx7UREs4dtK9l5auxetL/Z0wucNuO6ntaVpuV2tRRgtPrWwXc/fuh5dgbD6fAhjWUJQivZee4gueDiP28lUNvASqXshA0NWm60D0fjQbYaEJU2srN76V/lOZShe7KuZmKl7OjwouXshP02KzZ2c1OY62poVMrO7n/EduK0nZ1q4UmysGizy+yE8f2+v62dtrIThuMrhSe/6qy2jTaqZCeM7/e8s5jWsrO3WW3p2y6/2rm+o6yQnTAVtG+bO9BZdnJ9u+XDk2vr1NnOqJCd0FPQ+4EWWsvOXq2tXGPhaTis7hpblezkNg31Bhhay06+yfJYbE+KVnnyr5iu9+VRpbOz7Phl1/Q0O3tdZY8337xYwb33iul6W+gls9NMowvZKdtseXz0zM7fscl8f2v1Wju3SmVn/0g8dmg1O4fhGdzNX79nh7PZ++aiUyI7yWRy0+CBIDulwzO4W5yeoTWaHb7Oo+Y7NmTn9rXGV5KMDl9o1fNFNHSQnf02w1PtZ7lKj5b00xefnNUbnQIvSDzBbGbaz85guLp58bVtmmb5l+CMRqPJy5fe1P969qrZER26yM7BIGkuGtngIRsMR0ffFfWtdjep/YatmB3RoaPsHPY6F9PEoVXLTjRLFokpOy2NlQ/nX0r+xP20iYWCVbJTdFiKfthtttjafnHjxccI7tewQ2thtzMPHY60QNqc3jidF624bReLpu7X7GOpj29X87W7hb061NNMs82k1R0UiqWnweQcGW56xSZd2SyAl2aTWjdvKlpzm/58rp2zWDV6UMP56OZceB8LlPU6yzxxiOuJN5l8Oh2c5coNC6fjMx4fKfvvszQVHDjf8BiOH/97+nM6yB5SpwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDL/B9n0iy4KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlUkdCL1NNYXNrIDQgMCBSL1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDgyOC9IZWlnaHQgMjUzL0JpdHNQZXJDb21wb25lbnQKOC9EZWNvZGVQYXJtczw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvcnMgMy9Db2x1bW5zIDgyOC9QcmVkaWN0b3IgMTU+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoCjE4NDg+PgpzdHJlYW0KeNrt3Gtu2zoQgNG48JK6/xVkT6qBAEZao7FEkeLM8Bz0133gOpRIfqJyfdu27QMAgNh+GQIAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQBAtAEAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgAg2gAAEG0AAIg2AADRBgCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAABEGwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AADRBgCAaAMAQLQBABRzNwSF3W6/f/4Htu1zzR88rKpXBNPHzW8Zp8P9sG2bUVh5wa034fMWmyUYc8cUsJ7zAydtqy+1j3+30jzPXmzAcxYvniANq5mhK8/vtKWf1TLFSg0lbzxz4eTWYADrcdJmhTUmQOhJ7dzIAPLFSVvWRyjjAHgew64h2jDxUvI0CboNO4how2RDeoJuM4yINubNsWKJoHjAYmg1cwog2lBsum34JxedwDWrmW5LmQS+XHeFXJMC4y6EsWWRBWfQrd6w0Jl0HTcIg5mLr/yoOSHNQyCF52Ll4Kd5kff96qKNlMVm7gGpK2TP6qcz+oav8UzE77QVKTa/DgVU6g+aN4KGMXTMKdq4qNjkGqDbODmGuk20MXbOyDXAakmvDcKoijY8jAJY33Kkm24TbfSfKlY0AEZsGbpNtNFtknglCugMdJtoI0GxGS4AdLBow3wDoPI+snMrcdgm2mifGIoNgIDbE6LNlFBsAAxhTxFtmF0AlNpZHLaJNkwGAJwIINpMKgDotMU4XxBt7JoGig0AEG0A5H6y5TyHbaKNDhPAMRsAQboN0YYpBEACDttEGwC0JIIn276Mp2jD8woAINo88QB4suWqrcd1EW0AcKwMPNmyrLshyPWsA1ByaXKQA285aQv3EImdDFa7mfevjSadBU20ARYyuHoKPFrt64/JmIJzh+m8HhUH7Lo0/6xWLhZVl6DmW92ODqINJDWEvtWvyTVzELweBcBTE8ZZtAGAkgDRlotf+ACsbBZPEG0AVE5D6QaiLQrn/4C16226GXBEGwAkoNsQbQDQ6OIXBbqNZfmeNmjZKrzOZoX7fP+t/voF1KM/pDmIaAN2PdnbM3Crv3Zbl/+iboP/8XoUGjcV72hwq5/3CK/nH5cARFvu5RJXDRa5mY/WmwmIaAOAmXnk1A1E2/yHSIMA0HHBdNiGaAMAD7og2gBAt8Xj5FK0AcCobtMZiDY84gAAog0ASMXbatHmjgfAyjmftz2iDXMGABBtAMB4zjtFGwCc5R0Fog0PKwBAFHdDIOmgr9djj6Q3dpkfBOxNNThpc/fD2ND5yPn2qswPYlHFMIo2Os+Nx18xYShZbBlzR5xhb7I3BeT1qGca4ECxPf6uyYu9iSmctAEhYsiHBBBtgCRSbG4bEG0AJTZgZQCINoDoebT/I/mNH3cLiDYgvf1BE2onVmyL3HUg2gASd5uDnMhcHfjOV34Ak7fkWSclR4PAiY5ig7mctAGdHY2bKXuzYgueazsvkOvCUpy0AUO67VAVXXnk1tCIyiBsTINoA7i62y5It7YgUGxhW82lQbQBTOu2QenWfH4jC86P4bi7y0VBtAFM7rbviXBmbz7ZGbIAEG2AbmsMr7ch1etASLEFv6kMAqINYNQW2yWnrnlJpwkUGwTkKz8Ae+1fH1ITuItAtAF23E8fDz0NbbweBSaEkf8VERcIjnLSBjaSOUMXZ/Rcx8iD4IANnpy0AZNDYeKpmxoQkZDIbds2owDvp8pLWNhURo+wJih/FVwXEG2AaNAEQDVejwKBPKOqb71pNUC0AYytt7aGU2mAaAOY33AAC/KVHwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AABEGwCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAAAQbQAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAACiDQBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAADRBgAg2gAAEG0AAKINAIBI/gCkqoRBCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMyMT4+CnN0cmVhbQp42nWRy07EMAxF93yFf6CZa8d5SVUWiIdgh+gOsejMtGwYoVnx+zht0QgBaiPHdXPPtUNnYoI9TEnsBR1Olt3bevs3nsmVEj19WtYVpzHQiTTm7+Sdnunpj1NcsjOELwsxoiUsJLE4scMpuRhiM7B7OIFuPkzkeqDdHZOoSzkxDTNJUCc+UsfsXRCh4fjSA57BYQ/MHjzafjyC1faMNeepdtqv9VKqcL/W/ARRBTRXL1aH1mBhzPV1eFzYnJxw0MZmeAdO1ElyuYQNPZaqTW1qDiqjX2m+v7hpueRWmQ7LEpkt7rc4LbBO4byJs4pDyBd1M8RtVK0n87uQrAdzUeyHLMCe29oY0AKOWrvWI2Yg4NIMuxKCtGaSTT3Z2CUY1m5zxUFNO276q2OjTrM5HX982a9x5kX7dvh1309XXwvwhZwKZW5kc3RyZWFtCmVuZG9iagoxMiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDM0Pj4Kc3RyZWFtCnjaUyhUMFQwAEJDBXMjIDJQSM4F8tyBOJ0gHcgFAIfqDEcKZW5kc3RyZWFtCmVuZG9iagoyNiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDY2Mz4+CnN0cmVhbQp42u1YO2/bMBDe+yv4B8Teg68DDA0F2gDd0norOiSR1aUZ0qV/v0eLkiXGQQzbGRoItqQzTd2L33cnyjwZNKAfNJH0C+bhUX/d6PHr2fXT1nz8ggadZRfIbHvDQpbEmyZGG0HMtvuxASAESAQQA8D9DoDxIN9j+3P71XzeGrAESc8cnZ5dCubbzZHBP5NdsRIoZLNgGoximdJgEXcPbYPIYZMNAN57wOD2B/QMKALYucnwMpyDWg3Kpmeqd9dxmAAtOT9q7dpGghuShZp3DEFH9eDYxs0QgkiLtBlCuOsAHY9TTwqFmGqzPZwZDM906/qLc6oa2dIUDxD1ZSE8SlkITbqKeIc5gNariLu8LG1DUSPLERKWUUlD1I6HcZpml2vYK2lw0Hg0BUs31c+w9FN9bBsnUiQPsEr/i/TaemfIe8YlLmeAH4vZFYBP3qIPNfQzNin5zGkopMUBzggZ8HxVti8c42S1alWevZjSlQDvEvYLVL4N8DlaRKyBv1PgM1OBd8ZyKfja3wYIjwX/TPyXm/M/+UaMI50g94YI+NC1OJ8AQ8sYJuZbXWrR7RtK2/DMSDE8NaET+goFTZpIlY2VWOcDd4GqtwGuEwvhWcXuc8WWcCku76R1BT8cysPM/AFmQuTrhdwnzQlXDq/Yej+ID75GY48XAr7eaESwktxh+9JITKVWQj9gd1+ju5N2Ebyn6EJnT9fcRSSywjK5O99HhJqayr89DzOdXvB/biOxFahtrGxapfO4m1hqvM6ocMVuJc4mcTUluukxq+sO3SW/2xj3GSduFyZazO2stFilS2ixwOwRWpTrk7EsyZu/uVWF4G1kZx5VTzr8/G2+m9tj3cjb4NRWiNGmNL6gc1zbuv3wD3G2l4MKZW5kc3RyZWFtCmVuZG9iagoyOSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDExMD4+CnN0cmVhbQp42lMoVDBUMABCQwVzIyAyUEjOBfLcgTgdJ12ooGdsaWGqUA7k6ZqZmeqZG5so5CqYmFkguDkKwQqBCk4hCvpuhgqWepZmRmYKIWlgDebmehYWFgohKdE2BoYmxiBsFxvipeAaArchkAsAV8Qf1QplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjczPj4Kc3RyZWFtCnjaZZDLTsQwDEX3fIV/oBm/modUZYF4CHYjukMs2pmWDRWaFb+Pk3Y6QiiJ7BvXvfGBCxCgLYLAthFOi6lnO597vO/h8ESQXPLsoZ9BiJ16AY5Ok0B/fu8QhZDaEXEWpMHy4YyklhOumqbcaLfWU8pM3VqTCVkVUWMWtjpqbi0MEZmH3HBIRaWs5fupeGTCbv2fdDe/ojmWynSqh3m2OG5xyh/9Kzz2cAEnKbbwY7OxuoABFlAfr+IL3uC4z258UnQGRlLl5LEIYiBR5xWaelGoHV4WhIfvP703p8b71gXRzWuXq9s/wqUhBBdj3OiyoYqMGDziOFXaez5SnU29OglqvbXFEFxHvj7oePcLlRdthQplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjQwPj4Kc3RyZWFtCnjabVDLTsQwDLzzFf6BBttxXlKUAxIgcVvRG+LQblMu7GFP/D5Osy1IoCQaTyaO7YErEKAugsC6Ec4XZc96Pg58GOH+iSCZ5NnDuOolRyPJwri8ZURLSG5GXC3SpPG0IInGhJ1TLYPkrqdUmHLXbEUWQZRYLKuOUpzCFJF5KgOH1Fgq0t7XVqMQ5v6fzT/1GufYlHreDvOqON+wlvfxBR5HuIKxKTr4agOICRjgAuLjTj7hFU5/pv+dNXjvTLByyztoz/zHp8GHYGKM3Smqy9aLkDPCQfVuIKsbkRGDR5zrZugRz7S3vzd0uvsG3nthdwplbmRzdHJlYW0KZW5kb2JqCjM4IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzcyPj4Kc3RyZWFtCnjadVK7bsMwDNz7FfyBqKREURJgeCjQFugW1FvRwUnsLs2Qqb9f6pVHi9gSJJLi3YkinIAA9ScIVgfC/qjWq86vf+sJTEri4EetTTIsHo7AErvxDe+whacJHl8IkkliBaYV2DrDLsDGBhOTh+nwMSBaQvSoHyPOgrhbEJ365jR+Tm8Fgtg4FpsxdJssK4QziahBRIsYJKeVlOfpVqFYYyV0ic260XhF4FI03glsCMVII9ipnr2KDFxn0ZpGixpbuOl0V1fdnGF8MCFyx1mQnE52SDONWgg3ICWVvqpHScjHUV3FdKEQEC35oC07JJECUU7kfU7K/gvcfKgkNc+V+oyUCn2VnOulI/srMrLS0pAvNnpd5tgDs4w83Mjju/L2/WZFQCfXtyS/qzkz1Sg3uGzn/I6ZtKY01Ji7XBtbtNUJ14qgqGe+gljKgNauvQ2uGlYfxLd2EG+C43M/NPNe02q/5FNBezbG+o60LH8Ztg+/DZ+3BwplbmRzdHJlYW0KZW5kb2JqCjQxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjYwPj4Kc3RyZWFtCnjabZBNTsQwDIX3nMIXaLAd50+KskACJHYjukMs2mnKhlnMiuvjNO2ABGot5/XFTd4HVyBAfQgC64twvqh61vq49YcR7p8IkkmePYyrfuRoJFkYl7eMaAnJzYirRZp0PS1IomvCrqmWQXL3UypMuXu2IosgSiyW1UcpTtsUkXkqA4fUVCrS9td2RiHM/X82/5zXNMfm1PNWzKv2ee+1vI8v8DjCFYxN0cFXCyAmYIALiI+H+IRXOP1J/3tq8N6ZYGWfu8k++Q+nwYdgYoydFNV1u4v1wQiL+h0g0wajA/INYAOxZVZeHcSeqwzeNZazjswOyctWO1ukRY60x/1Pd9/lHWxsCmVuZHN0cmVhbQplbmRvYmoKNDQgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxNDIzPj4Kc3RyZWFtCnjatVjNcuM2DL73KfQCVvkDkuKMx4fOtDvT27a5dXqwLXkv3UN66esXPwRFynKaaZzdOIooiAA+AB9AD6+DHQz+t0Ny+GOG63e8+4Kfb3fX12HMOfrhH7w75BFiGL4PECe9+Wv4ffg6/PQy/PiLHfKYo4vDy20A50fwaTi4NE45DC/zH0djnDUmGPwHxpyjMZfFGI9r53z68+VX3sLC6CE62sPa0WSPW/gxW1u2uCyngzX4x7ycAC+T41d/fuktjW50Mamp5a6ztVHkgxtRypo4xsbSyRmT0EqY0Go0G7Ix10DWkgcnyEfxgJ6JrJpSQRwtwmFQucffPtrhty87i39/2zEKnbBJnrNJdpmNcze8Xu/UPEEdghxD2ug0F2vsDCcC3J7x7/N8CvinXYyNcMLgIgY255OzZTVPxl6CseBl3VXpco28ycHJjs/zxI45BAXOGTemfIfb8/FbtWKeG/C9asycUwHIIhDm5lcgrvjB0sNnxoZpaxHv75t6IqdQBUAqW2PeW0nAE2HJCYg/tI5hIdjR39Xni1xn//EU7ZGOeIt+P4B6/hSoM/JC3uhGPqHUZIyxdglTKLc+MUQM+33K7UI9rUyAMfSY3VTxtP95egvfm30yvt4RCcZH+C6fgu80Zu82uonprF82lZ2MA0zoHAVpSubzzJRRuIFIg9Lcx9PBH6X2gYJxRR7XAK0E8p7geAhjChp2JGhWwKSSpMqwQxzZKP6EixiNWcHazI3WuDDvFX6Qsf0URh/CNlzzpzB2RDnY6GQOIC8JePEacZmMtDRGiih4iVwW6Shs3RIUxY9eFNH3BAQsGpBdJSaBXdgeo+7SUXal7EHEcWWSeoX/qtfytklQyDNWCZu142TVQdRKVtuECRCLa2ukUYoWfVwTjn2ExzYa4BznnUH081VaoeBm93Ere/rUa2O061PZ8239ra/aPQUVnDt0BSoY7GBFFdcwA0+HwC9QNyepiokI1R1bCyjuNIIQLSj95NjFy+/Ey6XpuMZJmx1FhPmApj0qyJqiihrbYWWPO1owbBUxDbOx27BxfhRWMaaFVSphKlWgzBCjGk8m4jBa4VRyKcVUxh/t2zMIun5ypb4ariGElARbC1hHdb/UJMnjeyWRqn7BbWpjLZixICnDUIpTnTOras3GzhBV08ZYOeseEw0zr6Sy0g19ZJRCtUopoSwgaEXoC+W6+oleWAJW+oY7VhCSa3eKTBmNFMHWUtqemhUBNrvMp2p2L8XzQZHcYFVWZXeu+sYOX5wvEVHgr1J9CnPitiosSXWAw5g1TR2SXXXAXoFoc8dvnNb8aVhugwysiPQBpDZYAu18qE0Uiu30GK/Uv7rO0WhU47nHSafVaClhayadqRNm/nyIAnSPVAi50Ouj5iXWOGiKhqThuBkK5zWQTx4IIMdx8mk7ECyfMhCEMdNA0Onk4HFm2Y6/6vHtf84FDZHVvGJy1Z6J5W1bAbNtBUjlFrQ1N0qK4oZd3jOEBByHpgSbYbVvvZKxlDOecszDpr7Ah+Nz8vPcHIOlF2j3XX3dvMvP/dIwx/rZa3sQXJmvkYfy/vlcXNyy5DsDXPCxWiOrRJRNqLTcGQVT2AXyLRD2AdydOu46e+z91OzLUITb/XcSysGt8Hwudu8cC8rDjmvnntMaJMoM0nE1rXwgl9SCbZ8tM62epaxEXi3QMw4XKK+QW6s9PL1h/tM40ZBCN2+wWug22UyY1FRWAPV4J6JL7GfMxEo4T3DLBlIUgJKF3KTi7jiigNG1GVt1y3Y2aJvbfdfUJjhrBEF1V4m4WiOoyeFCnlYv+Q76Oa0CksqpuJ4SygG0nRlCBbtOBw23vQ54lppC+RYz4lHXQ/0as9w++s6Vvuakg3tMaZymqUB4M1sdX3/4F07922UKZW5kc3RyZWFtCmVuZG9iago0NyAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE1ODI+PgpzdHJlYW0KeNq1WbnO4zYQ7vMUegEzPIaUCBguAiQLpNvEXZBCvy2nyRabJq+fGZLDQ4eP/DJ29cviMfd8M6K6753qJP5TXa/xv+wu3/DpC15/5ftP5+7HX1TnhXfadecbDupBgDfd+frHUUqjpLIfUt6MVCP+Hq9SAf5WMj6r6XSAY5z3/qTVMc6ZSWoAKWE4GY3zEk4Wb+MgtR5PB917evInoPUT8TgpeYz0zLHwo2c90Mx0CZfWN7x/pPt0+vP8a/fzufveCeMH2/1LCoDoZd9968AN/PB393v3daG9FAq1lkI7g3+NU91vX1YG/8l2UiAMOB0NdVBaWJsspaZrkunGMu3JDZ1ivW5ZSo0GQr8q55AtXqY/9SjJhw2+UJrtmHwWl64Y37h4JwfqNEY0yZFq2k8dJby1bDwA4Qe1MF66X97B1SihrG1ZZyPm6MXI1T5cT0W/2Yh+pvGhokFpL+930Vkh4ke1UPVVFevsPfRKaLNH+rICyxROOm3qjlsSmzqz+zVdgwam1cBbMfikwIySL4QO2tATuc5QUAMJQPqhABE2wgjGdhRx4BF2ANHBdZQxV5NgCTh/xuQ11VeEOE7uMQu70eQkrQ6LyGq0ZgiM0N4+DjOVR264oZ2tfmALkPPtUz1KAo0h0Gu2KAQcS/Rz6iPRZA2HI/KWLMISr7MJJiVKRTMHcW0ydsKiiiXaA3j7XfNS0BDeUiq7BBmoChn2wvaNmBflO9H+5ASEO1O5hnGtBcViJUiAeYVkekeOsdVOpAlVlLTIquuQ7E2FwHiF38mvZJ0MtMFmCQySvLgsGY9HyBHB3HG+T7LijiGxoRUcGBy7QSKaCKYOW8dtROIVdWRHdlnSynFpbfIoM5uyzbM/s8R16E5r3PUxu4DMz2jxKURUgNPgd4RExMDgf95nn8BEmiebklEuRKtcS4h9BiaVs0LKlA5y0Mn/NjlfzsLKSNt6y0h4CD+8qmRnhAajQk5ldZh8SfnAhqIkEpjHD+NYlqxCCiZ2mSILMLU4ts2pTK3BqSeUbnyBiQ5OHaMnVOOJuOURS9YxMoVonIBEqgapLMBcolKIlHcFiUhtRiQqpDYatcZDm/CwhYe78M6JdomhT2ImsPpUcuyUrlp6AQ52TNeM3gmB0MpPtGU7pKg2gFrrpErPJQjYWzU8NlWDI7RVi4s9OU/TLFIkRbS58WsV7a062XkwJTPOaYyeaNQVizMxUpzcetcRoojJk1oxVuua29aAZWFZ7cZYPpjqBg6fbzuGmXPCafv+Rjl1gLM0/GSPrD22+YN5pku2T8CBcdkV/NS4yvTzVjqMbDnPbMF32LZsIMP6RdvNTEsMhZHYZLJwPFOLXOWy56bKuGPJOu7bGBDKihc7+CDQg/hgjqmTT1VGQd0gRSctLE4UQm8JnMlV68RSrRWD17vdOvnbzvle8i9dGSDhqc6/SeV9zhSM6UVvzNahwvUthwpGaKVmvB+cKsRCXr26pNZoG0r2PSMwzgg6LWP0mPU8z4gqe4gaUqoqzt8SoHJ0EdNCuqqkXimo6ob7KS6mj3ieF04LfXX4NFWdoixFfKxf+AoorZ9VrUGnGQbhgB2FYvqWXA5RyrpS5lbeieS947dlv5XlXB7IrVfLGlQygvIMrLmlLuyl1Jeizk/RmDUN4myHIrXPLYF+VbZXzXKdIhrSKCE0FwFiFqD2UhVjNb0BN0AbocywhRvTm3BDAsx4Uy4Ox2IotuPYOjqc0KQUlRAxmdsvdOuuWAHghSkvz9FVK4Gn/EbXrF7tmqEHNE2fWLqRDzrq1nJ5xtIULUrrOjoxsvkRw1HLplptJ5PyzZnM4qhj60gm9935DfAKmbhqDjpK/i8AhuBQXmzI1v1j3spBWNislbe3xLzFFcOM9+dRf/6mVx8MruEar25KmFspYZ57LLqZvg7Eu59Ydk1Aiy+RvbevGQvea6xlvW/Sfo/vJitvU31pK2epvDhOfQJmrPUCrN7LrlXveyeoeFXVM78YW5sVeevd+n6Vr97i18CKBKEztBX8qT+5Hpyz2P1C+uiaH+Nn17Wodn0vhoFL7i2+9BpwAgaN86WLzqcgcwekD5kJuk4HZ83//iY6U+3rD/8BO6zoLAplbmRzdHJlYW0KZW5kb2JqCjUyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNTgwPj4Kc3RyZWFtCnjatVXLbtswELz3K/gDZvdBUiIg6FCgDdBbWt+KHuxIyiU5JJf+fmcpSrVlG+gjtb2mSYozO/sw3YtjR3izawQfcg/PmN3BHi/GF+dzTup+YLbLPqTonl1I7TJ5cl/dvfuwd+8/scs+J0luP7kg6oM2bieNb3N0++FbRyRMFAmvQHRIRMeRSLF2yP33/ecCwcFrSGIYO8Zx9Zm5HrfH7fghz8eUy7GP+3Mvk3hJzeJmnZ35eUISGDqigIyST5XI/BMMLb4eohEvRGt4PEMoAVrxrYndl7sri6+PVyjhIjfzfqHjcSSRCePDBc0b0FkmYtpwWioYqeeUiA8D0aTECCl+3/ShjoVBT3INPYiT15wrNtIZuxke0KwjoGE59ygH7ea4HtlsWQkZrgRimizFt1y4Sg2pHJpKjbIwnCInwOIRoc0rnhe2iAXNFrG2ncO4XXy9wqTkU4wbulUaaGB9nlVLe1jUr4GAsLJleTbHGvmrOJ+10zD2HLrZA+C/jVBJPhJvqIpQy6VZtpJhoyPRWGzN9R9K/bcukpR9o+22i4b/0kXRZwkbThqGXrRbyruEpUq2ztr6cS2jap2TwvrHU2roGH91jkEB2pK706Rze4Wb7SW/017zKhK37JsOuanjhBz/UcXmSB/rOF4iSjs3IVpgLtHqXIHUVB8zp4W7pYl6pvqsQZTjXPaqA4Y0DoW4jBOqMIQ6n+pv25+2occFobmN9YJIETkM6w1Rp7euMtwgquiI1KAj2qXcpouqvn/3EztQm5cKZW5kc3RyZWFtCmVuZG9iagoxMzggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0OTc+PgpzdHJlYW0KeNpdlF+LozAUxd/9FHmcZRk0UZMWiqBGoQ/7tx2YebSadmWnUaJ96LdfvScdlhEUfubm3nOuuYblXu9tP7Pwpxvag5nZubedM9Nwc61hJ3PpbcAF6/p29kTP9tqMQVh+a8bvzdWw8O1Yvdb111+3vv07NbZ7Lob37vnlWHPJOnNG6PE+GiY87/XhPs3murfnge12AWPh7yXzNLs7e8q74WS+rO9+uM643l7Y00t5oDeH2zi+m6uxM4uCLKN0HNraoTPT2LTGNfZigl20XBnb1cuVBcZ2n9aTFNtO5/ZP4yg8WcKXJ89WEhFIgDgoJoo9pUTJBiRBW5AiSn2WDSgFbYmUr6dBElQRbQSoJsqxtiQjQr0UOnPUS6GzgLIUOosKlBCVqJ5CtdYgqNY+EqorKEuhs46JJNXjUQ2iepzDn4xBCpSAkFNSPR7Dg5QgH6lAPpK6xBNfj6rzFG5lASpAJZGETqlBvgJ1kCt0UFIH+RZrKgIhp4KjLTqo4ChHBxUc5eiSgqMCHVRwVPo1OCrhQcGRhgcFRxo6FRxVj07A43I0/RnkjxP5OMG8Iru8xv448tFY/3yAhYCROM+IciJRgiBPxCB8REGtEgnSC/2/mHVi1jn/GPP25twyd/QzoIleh6+35uN/MQ7juovufyd5D+wKZW5kc3RyZWFtCmVuZG9iagoxMzkgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA1NDY+PgpzdHJlYW0KeNpdlFtvozAQhd/5FX5staqCDdhEiiJxlfKwt6bRPhNwUrQNIIc85N+vmTNtdxcJpM8z9sw52F4Vu3I39LNY/XBju7ezOPVD5+x1vLnWiqM990Mglej6dmaib3tppmBVfG2mb83F+tnZ8+FX9uXnrW9/X5uhe3q259tb454OL7XUorMnZL/cJysU867c36+zveyG0yg2m0CIlZ/WX2d3Fw9ZNx7t4zL23XXW9cNZPByKPY3sb9P0Zi92mEUYbLe0nER77djZ69S01jXD2Qab0D9bsan9sw3s0P0Xj1NMO57a18ZReuzT/VduF1IhSIEkKAKloJgo4lhCFHNMg9YgQ5TwmikoAa2JdAYqiAz3UoI0qCJKFagmyhDzSxOhegINGaon0JCjzwQa8goEDQV6SaChLEHQUHImNNQRkaYKMqxBVEFK6NMRyIBiEFbRVEFG6FprEGcaEGeSSzLmeuSSZM+8WURQq3NQDiIHpYaDugRxPXJQGjioyUG5RsyEIKxpoG8NBw30ZXDQQF8Glwz05ejMQF/BMegroMhAXwlFBvpK9Gmgr+KuNb88qj9H17SZedfK9z38vudlRSbIGgqjkLMR98f53z2vFPRF5KdS2IOqAKFrFYHwpxU5qCKoVTWIM1MQZ1LvKl48U/6vgqBPlaAKMcyLaxDmpXwewr/1Lsd4uX8+rp/25py/DOiSomtmuRH6wX7cY9M4LbPo/QPe/C50CmVuZHN0cmVhbQplbmRvYmoKMTQyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/08d8AMAXstIMQplbmRzdHJlYW0KZW5kb2JqCjE0MyAwIG9iago8PC9MZW5ndGgxIDE5MTgzL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTIyMD4+CnN0cmVhbQp42s18CXRcR5VoVb3e1JK61fve/bpfL5K6tUst2ZKsllqb1bIt72onjiRLtpx4xVsck9ghmYEgwnYI2w/bQDKT4TDhyUlIIE5CIOSEmTlk+IfPZ5n5w/DzGeAwcw5n5gcYcOvfW+91q1uWnYWQ81XWe7eq7qu6W917q96TCSWEVJO7iUBat+1sac9P/EUXtFyB39n5c2fEvl5hlhDqh/onDp1cPHZu4dIFqD9OSK1z8egdh/7P0YUPEmL6e0KSmcMH5xboiblHCNlYA/jpw9Cg79cNQX0Y6tHDx86cX/qX6jqoHybE8KujJ+bnfvSpn/0jIdldhGjuPzZ3/qTwMdN2QsZ+Avji8bljB89pJucIGYcqmzh56uDJDemtJwiZmISGLxAN62ZXiBb6ltg0tOSUO72FtFPkghiI8iMSYoYbVatk6tDIAvkcIb9nws9XdDD3Z2mLSOhHsI8J7Ap/RCCv9XMeynFyHPHZK6yWkJUezWcL32UvrrwK9fDKq0q9iEf+amVDRftza+rF8b5HvloxnlIv4ckkJcpk9/RIXhRzTxHT9pys27lvWu70yfX52UPi0u5pmcXmvmoA/ufnpQO+cFgmeZlkpeHLIIPs7FCTTFOyOHuoSWYpcUGUvz4la+L7LtdTY3ZkfkTWjUyHZSGW33HTdFgK+5amRXlqCpoyeZ8o9yDUk8+Lywr23IJcD01qTZRbsb8VMb8+NS0CNUtzomycmp6FFhH7jAilEUrP+mbz+bxPpsl8XpLJ1PTBfL5JFlIijKOJzQFl2uzUtKyVhmSdNAR85GU62yRrUhLQJS4saw8MidiDFPsUCvAqC7Mj87LQGIbOrLgkLsEEy63aGDC5fXp2yje3Iz8t5cN5Uc7snIY+H7Kmzt8ka1OyPpu8TJgiKR1UpSEJJC4NzcnswCGZzgMVsraxSdanRCS1Ojv/lIYcEHEEOTObR5TZYU6qIXVZX02yI0ON4ZLsq1KVujAqo9AkkJAFvmfFkSVpDvXC5UV8KFNZ9AGRRSpBO9LcsDJF9XUel6PwFPGtslb+UE2KM3S52iiAsn1SON8YbpJrU8uMjcgLc8NNsikFiKIo12Qn8HEApKG8XIu1HVCrhVqTbIZh6rhIRJDAPMwrm7Kz4tKsKJtAaE1yXSq3a3pZszCcj8q1B6XzTbIllds+ndupNPrC0G7j7dbUMjFnd08vm81Zmc4NyeYk2ixY8tByDV5q4SJTJ2hCiE1NL6PwgNuhJdAvTtsYluCxIuxT+vERWArYkgdOxoD+MWitVNV1FLhMiE0CaWVlsukypZTrypYiy4SN7JqWzdKQOCJXg/EZJTC4IXEWpn/CYqHERIaGlmaXrbqk/N6kLwJisgNvtmST7EgtU7w7Qc54d6WWBby7U8savHtSy1q8e1PLOrz7Ust6vPtTywa8B1LLVXhvSElFucu6WZCwJDbLdD8ukCa5sazTWep8h9KZLOuMlzpPKZ3BFJFrk2+CvxDwFwS6ROAP72HgD+8R4A/vEvCH9yjwh/cY8If3OPCH9wTwh/d64A/vqZTYx820KQXTWmbFLOh2NstVCUsvhbbanJKbknITrMIWWABj4nW0KM31SOgRb4jhQ+5bS6qlTrmlcVlLHSPT4MiQwbZyyVzb3Z4Suzi9HYBHR66dBFbnupNjO3E+zqPJ8CapZ7mdOpC5ThAAULw+wbAq5nqa5K5Us6uvSU6/FipY8Dygd4NOiDMmNotjuPJBlpuXlsakMXAV0xAiwLOCO0hT6rCDSHvARTnlOkDTgNeMcTS5Kps8uNQsiWLfEoy3oRJFbFbGkjXQApiiPItOI7N9+jEmCqLvMRYXvPkhdKQG8MkSx5ZGYQln167HWXRmStxg2dkFsL7s3AJ0s+ycD+BZdGRrn5kDssC9S6OgTAlmGAX+4MZngfHWmURSXKYGvAQoQQuWpb1mVBgROYpxIuA6pbjK1blA9xuLchChVRtX5SD1gYh6S12ygfePSmM4KWqvryQ+ZEaVMNk13Sz2QchF6tVGEekqqkAXg9rm8uiuKG89s1Y1JaFt95dRki2qahZTgLUsF9W7CRxFM0pxVK7LTk/5IGSKffnm5WZqhwU6UNG7wzdV0ZtZ99kbPTGYknuSN5pwKCVvSC4BbWhfwNR1UUGhzXIzPJHlLKNtFnWCZinBYmmGdaaMOgx+B0JIEfENGPHYW2W3yAW6qD4JvFCZhYTzKo0j4Ft7kkU5jEJtQzIsqZJQOSkxPQZMO5QFDukFrGVbs9wJ63n8Ou2bYThqt8ldAE+k5G645VBuIyBgcRRiaVFSkyk0YTkH4JbUZXBWAGwFgCKwLXWZ8pYpAHjLdsQZAWAH4iCwE3EQ2IU4COxOPQZebxCgPQBRDu1NPUaVtmmAlLY84lGE9iEeh25CPA7djHgc2o9zZgG4BedEYAbnRGAW50RgDnFGATiAOAjMIw4CC4iDwEFO1xBAhzhdCC1yuhA6zOlC6FZOF0K3cboQOsLpQugopwuhYyDjjSUFHuc1eROAJxRwAMCTKHRey0DtHRBGVZxTCog4pzkOVXHOwMO9pVHP8hp/4pwC4hO3KyCin4dxVIQ7FBARLiggIrwTcPtK493Jaxz9LgVE9IsKiOiX4EkV4W4FRIR3KSAi3AO4/aXx7uU1jv5nCojof66AiP5ueFJFeI8CIsJ9CogI7009VqVhxWR1KCkbDspCdOp8MQ43gc4EUg87MRH2Y9XEScLE+GTQVVejI0Jr0toRbndY7FI40mVJ61zUme6ydEphBs3pBI3rHJZ6iV6WpMJWqZMx+jmm0RYOeLT00wJjhTmmYVekq0uSxM5pNezqXwtUw/Zor96tYWwvwFe/iHvLjUDBZeYitaQ+J8enpjPVYBSuHLQ6yKSP18iMUss/HgszvTOZ1kmROBCS7mh3OiyXI15vBH8lSfLST3vhWpjHzICuTLHple+wl2Hs+LJuYTjjIzjaXuybYQDRbQDWkpqYoHckl3VkmMW7upRhHXad9IA/GJb8AYlNO/02vxMuAQdudYlx5ffsLPsG8ZIAiWUiAaoR6ATRADcaeogIgj3HKKfY7pZsklbvSUZxvEg8kQjrdZz6zm5bOu1qd7pssY4EOxtxWgOGzsL3O/UBi9cn/M4g2q0h/auFW186OFjtDTttd1ywOfzuKiPbY3cyh+3qV77xS8J1B5Jii6A7G/GTGOnKtNsUagSi0QqagwTUsh+4tud0VKsl+xVJBgKBWCCaCAMdeqCOOJG8olA72qGmj8clydHRnu5i6a5ODrNo9r5bfofy/cOzyfqWhtjDjwSb6ro2Nf3N4/TEnuHbb5G8bMgrXW4asX+y4VP1kcKl9tbe6PMglXrY2e9mz5MEac2AxVGBEuEiERgV2J1Am3aGaLX2HJCqmSEaTUAzGU9EYpGoTu9NEoddDwJLxKWITuewOzvau0E/LiQY2+PAQRob2C5zncdiadswerjn0mJ/k9XktZrrzFunDzx0YP9Di/lJtiQ57I4qV++RkXMXXAanzVnn1Sd2fv70oc/flAAaUY52kKNIWjKpG0uPn3OEouGoIr0ol15YlV64Xak6OhRAcoTpr9Eml1FydJtXivgKv/4p3n5Kzacll0dU5Bb2ekJfxMtX+ZkL0mMEenykIRPHFkboQS3VaIT93MKANAdDUnzE2yVFwzq9O2lbndReWiMqQS/9AOf/QczjRzJGsMI2y2GvM/ILpEWhwBnhc6O+3sdeJC1kU6Y3TjVasCcm6ASmu6inOqLV6LQHgQg6A6Lx50BlfIUGuGRaSJMUB73EDag9XEgVenJyYlb1CQpNd3fxFQGWx26NhA6cnX/kwIFH5uc3m81ht9ma3pg5OjBwNOPPuG9Bqh+iFyTv9yRb/9zDBw48PFdv8Jo9MYNr8Pgg/DMa7kFXoMrvz0B+IZLIRNW1eVCnZWWrE6gNkaAtJtli6iqwKGLrCpfJD51BGKljByJRvydaeD7u8UkI0YG4h12J+K4+i3T94hdcpkN4/dnPvJJCA3kJaKgltkwdNyPFgNZzYy8VR5VKo1x9VuXj5+wZWNvxjBS2mowawuiEBhwss+doiZEYicaaY1q9q4wNC/iahC6eECzl3Lhs4Hk62DdjEb9fetjoNdV6jQ+LXo8Y85qDhh/9xOAzsWdg8mfQLOhH/lBjptRcQ7WFBV8EKMt6ouaawjLdVmMu2ekDwGOARDNhj5GtS12A+GPxSuoStJIqind2Lih5TT5d4cMhjxtAc0BPj4bc7IrovvpVr1RloP+9sNstim425pVqjIVW+qhb5MeP3GZfBps1g05DGT+uXNU8BaFonmCVEQ2sk6iuzCTBIptZmTWCx3t5+sG5uQf37sXr9D3p2b7+ma6umf6+2fTvH56dfXh+nl+zxzIDx7PZ4wOZY1mFBpRFB8jCDjSAp9NRDUhIQ3CtsP1aijLBNJJOOiCOOEKOYMAHuFYprgdzIHxpVK7dDmsavS93v/SzN/f03NzxKKpK8r5ii7lcMdujj7Ir/Yv9fYf7n+HaAbspyGKH398R+qeiXHqEGpBLmoySicxYg5tpdXTCQLU6WMWai6AudC0XiQ5uOrpI9HphBuhdXdYe1GB2sHcDDNHVlIpGY1WwWDQKsaDHOC7lUlTrbmYlsQICMOZ0KYt8E+sgqoA748ryZz+PZufimVzcIzpr6mprnRa3JM1vPT+kSD57x9Z+V8ITag54ohad2268+j8VLSga8UedgS7R4zTX4jwxV6I2Zjn4wB5FOXseOGhxCXUmS53ZpLUZaTdXk6IyRVcrK+x+0FU96SDpTEcYwlAMRTEBnh7MWksPkpKvVf1FQ0NDR0N7W0uXFAOH4eaOXwlOSoSs8Lk8QgHvDhAAW9Uiu8tcYw657eMtqacD7kASfLHYeXN3OjmgEzQG09MRpzNi/fGP93lNVrO1uuFitPEbRcX2HOhvn/GnJurMIZ+eaiIbwv4W//8u+usm0DHnhAgaohFAo2h69E7ggs3AavDneKTFOBbQ4prsIO1SvBFtz5N0xhPcAbcrugJiE8XV4So6bFQZLBFXkHHNv3KyzRdx28z1k50926f2/njo1OjAiVgg4jLXePfHBkbGJvcsdo6dGzZGk+6AS6oJB9tjTR214pcG9rfFQ66gS6pySC3xZMpkbtmeHZjpAD6CoJhdoBPIQjNBFLqwX0N5sOOrBoh2ErskRVVHgoGu6ETUCBJm7ZGI79Nxvz/6aZQbvQK+w+sNXf1P7pxrcPEQxW9BDncO/GoI5wKHxb0zY8VcU4kN4DBWnZbiM4r+uugsuNvaI45e3L790mjU7442jjUkc01BL3sGAv3Hdt49Pn73TnobT0s/1pqrr8+10tt8SpxFfu9jz8ESAxocYH10Ajznapzgq8+dSGi4ewBjE4CIODh0RVlFVz4f0/2mSrRaAobfaOsdlqDh208Zghb2bMRda7r6rM1ObVY2bDT7wnZbIUF/aLXj3HUg3c/C3A1ky5OxQI1AIGnMyQFIwG2QrHNXJQihog/3ZZyQr0ESQC6qvWpHPlMLVDaQerCYBOYgRTr14BqE9eh1pVW6hXMNwrd0QatVrPrAB4F+a1D3LaHBYxd1H73HELTZAoZ3PqAL29lzMX9V9dUrFjtsuWm28AwwZLew4eoqf8xhLfTRHqsDzMNa+Dv6vNXB5WoBuY5wuQYyXpsRqAbJglxLgo3WQ8oPetULxUWrkuhydXP1spHq70bcHukfrA0uv0N+2BFwR9kxS+F/cDuijNrdLq/k/49fB6Nexc9KsAabWRjSsQR5X8bogr1OFbgRBkJ1gVA9fB3qMDCGcnpMJmeKolW2PYFyBKSSY/EYFqAg/yBkpEyzlyMoRlqBkM9n7H4/If6EPx4RMSmMR2OGioBbEfRcPKPhqT1f1h2sBjdRYerZ3TJycjBzItu6KxDxvnfHjsHMju2DLAzGnIeMwBtoGLs4NXVpTPJRiDXZmfHx2dnx8Rkug0GQwSR7BXYi9eRQxuiBnYhRlYHCImNOjCsCuCE0rlU5BNDEfNDK8+5FjljRC+wFAgDVBxJSGCbwxWJxhb1SIFqTswGb1jL+6IMKV7v9xf2ie09LG7A2CCyysMJUwq/jyfAZ1PJ3g02FLPKGPHK7Ah3TfwMdJ8iCwlFsvc0MuthQ+W7Gl5HW4BVjzGIZVj5jgkkSJB6DEBtd3ZaBzkrOF3Y/EEbbiywryqSXDnsddXZblTFRk9u9J9vm1jmstZ5Az82dW85msucnWbgr5QxXmbVaw/7c+EyNYDaIHnejZ/zS1u0Xx0q2+wq33Qeutd0AaosrjkeS9e03vBZpHRsOwVxoxYsq7tttxK9Arv6xSiN+wStdvXvViBVZhEHHIshiUWEtDs0UEqWL/KW5lhyETZCOqy2EkYnnSwEB+IuWEDWAAtukxeITZWj5jDkcDsPe2xGPRyNhvk2C/aISThTvY9evSVCj+nAX2AATo+7CV2r2pBuafVprnSPo99/Suuuu4fFz2aGzo4UPOqhOM9ECcaU3a7YIVUG7z+kSR9+5Zc89I+MXxh48pm/sK8YdKoO+G8n7c7IPOAwa9Eyn4/twZ06geOSiAe261F2mr2jtOj3R68hFA9Xrr48M1q7iQTP0g0wWy55QsEDVEIGAgga7BFueqFSl94EcHKUd7JrA3qGeyyhWEJeo6L8JNwI34UpOI5RenIt1++3aap27jl1IuFpCbneo8Bnurw8g3Jy7JRhyQ16hU/Tcw3pAz0nSTd6dMSVAdB4q6KtBf4Lqrxph0TKBMkiOQd0GMFxQeBVVM+RAKV3woPOqLyIjHggAlL8+aj7jTKUISXWn0u2tMH1jPCbVx4zlG1BMvrrTq+lY12tYvTPy8TPBW51tgi5gMVZpbopNbHbmO0ZPDw2+Y6Rj2hfx3r97dza7a1eWu/HshbN2oyOmr3K6BCr1pltD7cpqaAxWr3HpeL4MwqoCW4mQrU+EKNVQVTguwpcwtMzgqUSomCT7Mg4tVbbbixyFlScKERKOwY+aKJR2gJwTyzX+mz4ziepNpnsGik7bt7ODhe84skK4Xkn3QLZDgRlPsf4p2rGyAhol5An2Monwb1cE0Pa/lvaqFuAlTAYzVaLLoNcoWQ/yY1GCkyC4VnOeUlvJ2eW/AnFH4ntIJS1O6CvDjqW4gvUuZkk4vdbH24qkf9/mcUruj395t8cTsT/bdOsq1YUPvGyL2dyO9z1LinSSbwKdxXMD5w3ODb4peT0R/lsa7urHFL0JebDvLnJnproJ4hKdaIe1ullx6U5ct9oZg14naLWuHKR05b7cS7ARUXQz3DOEVjEybmyBPoK7RYwDxS51SXeRzpjyw5f0dbV8HZ23uzA1rK1Q/BoDuCi59veubwUVMD8Lrot2HG8cXrVlG8gkQm5DW+a6R2nYuHuGxBa1zyrCmotbxGuaOZkpmvmbsvNvbUXWmns2DpXY3Nt5HQ45V5ZopxqrYE3zM48+hV5H8eAjVH7w4UMWCbqnxbLW/Fde74FIdvyu3OSd4+N3TubuGj/fMNLYONKgXJ++NDp6CZ3H2KWpti2NjVva2iYbGyfb1HywB/LBMM8HIa9wQ15hLM8rVlNel5pTIGEobQ8t5RUEe69JGssRM6FS4ljeqQrCo+QVb0v2+ALPHg+ihjQV2aMSb4r7g79S+FcFQkEgPl4RlEr+GvGEytKknBpxytIu15rcrBJxNe0q68PHShHp2rQrVpl2rY1A6fXSrkgp62rb5RfC7lLa5YK060GUyYt+Ne+K+lzBwpayQMPXJv0Mz7v+Midbp6afCGDyMOGDOy7UPG/M2NAPl5ZqKTtRdlhgBISeRI8/uxZB2X6oCLyHEM2ssqKLaYtP7cd1TSCG41LhQuXpirKuRRIC/x8tbnRLByM6x7X2Q882iE6zTXDUeFtDRbNx7WmDIOwKhSBBFAeb/m11Sdc2JFEOHthjPAdySJP9CtnR6xzohHLFVycBLVAfWYsGOhdA52VI+UxVSkokJf5iJY0phpJh8POe0rmdq3SqBYyhCyie+MAi8XhNZoctONi8tatn4+au7nx7x6FArc1kdZqsG6KT/mQiPd6+8abWoVPRGavXWmULBYWeQNBcJw52t44l4rE6u8tcbXJ6u50+c7VZHEq3bY6n2pBvM1yOsiXSUMpJYa8k3KuFIMQgv0QnwENR8YCmlJMiFqSXVEf1uovl6KQMGXLSCjzAAFQ9A+e9iqUGsAZSb+MpaRQDWNTpWD8TLctUlbdSdLurN7ZpdzMmo80YkccQGnPaDKaa6nf4nL5Y1x5qF92uUAb1nUGo8GuHTaPl9g++3MhcsPo2KZxZ+aGUq5Q6cjfOGxm9t6wxn6lR3gJBvFEPq1SKS68ylSQSavTnkduPHz/Hc2bYa0S8zAXZx9ELF44WeB7S39vbDxDfI6ysMDvQ4yX9TzhxU6PmSSaN4q9LSRJvIOze0oEQkuMlnoTFVTyn4+dB/ECo4iCI/qdoeFrvs1RZAoav6SMem2hYeq/Bb2HOkKvGWliw2PFch36qrs4etlsLL9Bem50Wafsp0FZPdj4ZxbMrbZE6N9HCKtCSi3odZOuQwzBc00q8xiat5l7YkmnvLbXDbgzIrSeJWMJit7jUl1bKSVsiDundWsJ5fudy8YO358OaT+pCVkPEsnu7JWKwhnSf1IR99oDu6La6hMNl2HJEF3SCiH1VpsKC1UFZ9NVXo4zzVF3jidlshR9/P2a1fZeKNhtfAysF+gPgK0o2ZKogyOs1q3KvFWiF2Hm9LC+NNsYq89LSiXyi8mgLU1P6g7grYD9/tspjcsTN7/tQbcwdsL/zlC3gDpuWPrTN7ol6P/rRmlrRYbd+8bE6u0fyfPLjvrDDaXnkMcVWe7ittpN3ZIxeKmhx11Q85YkWN0KqCsD3rLdfihbVUdxjrYemaKedtMXi0Wh9TNXO2k1SkCmbpDXns9hoUYz+/rORseL2SC8lHGPZzuOdUylcB91dnRvUdbD3nturq9SNkWCq6p8wDrbt7aFRXBorZKC7fwOFFAz2F3huuwf3RDQN5EngYv9C2Wew+0rvojbxd1E+kso0FBny57QU35pqKD/tqANnU+er8zrtgGiK6/SOpLMsB0OXmy4Lsv98x6ZNd+zaxa+ZzZsz+Gvc94UjR76wT7mev3Du3AX85fEUnUqYn6XXZ2KQV4Ah4YseSFMvCsqbqOIRs5M4YjH1iHn1zaHi7brBZshKBM/TN5ktHsli+rjFy67gu0keuX4Ur4q76vyGfVU4Zwtc/gv4biDNmSRMBV5Wc7F49IHcazRl79DBzyakxk6d+iZFeYUO9lpkukRDSSB6fQf9EfjUwpe8QeuPYslMY6DXbfU7Y3Z7fKF5aCE92H3pO8fRr4oej+0X9dsjTUMJ0R1xmEP2eHPPgU397+p9D/cfr9Kfgmw6ycWcbAKbbYLAoBW0egECg0C1AoRPDBDsTrBK3X4IEfZKN9xRwoeoC3knBGWq1dz4KSW4dJJOYC4GlqrsjlZfo6nvX9QXZOX8dxdfbiirl87sbh46PxUd98Uibrsr2RnqkQab7UHBa3F6jTUPvohhh7YHRfe76df65ro3H9toNdsj7npzONQbT/cZqCHkMjlr/xoFFfa53Q+gze6DyxmQiR/2EqC9EP+KRAtrFF8QKsnQ6nuYYACT6DgESX0pEyq+/+pS1EiVZdgR7uhiu4CgRoyIhT8442baZwt5Io2FK5+nKSThXWhJ75LcTiu91w3L8G9e4t8FgY6uAj1pMprJdlBBj1/YCFTQULAo9Bh3gg5A+noBQ7h2f/ETkrJPEdKkK9odjUEms1bW6wm76C7TpU8mJD1mcbuP9E9e3JzY6a2pC3msvkaxYTw50eGKeqyO6kSYhjRhFw2jyH9rs2300u/33zaYPZV1O4zROmvA5o1nYunhmpoqQ2PAqPmtw4ccf7jaVPQT9A/sOb4/Smc6wJPCKgUDAraYsKh+d7L6dUXlFqa+4q2xmpyrLh7Z0a/Zwew9mBm4LTNydGPHe87UVHsjAffAEU97JjQ01NI6ONhKXxw4sgn+bblrbPOXPxUWfAFnWG+9OZMsfGa0s3MUf7lf6Vv5PbNwv4Jv2cGv7L/Gndhjq2+saOlzp7BqxPSXCV3hd/qg1RPT/aLwKjfWm9mVsLfWdPVpK9ipqZYWUErK9019IKg6mM9L4hAI+jMbvTVokxPlR8l8T2Nf3RkCIYmEz5doT7Q1JX1xXyyZLO5nSrLqrnC1+rhOTZNAYBVi+3HXwJFM5sjAnNS0cb6vb35DiyR3dzc2dHc3tA4NteIv3b6zacNsT8/shtk++3Bz983p9M3d7YO2f+mqb+hK19d3FcTexmRvb7KxV30nD4L8A/t2Ue9WfqymKztOYDP4tYA/V/xaq1zvDfVlei/zkd2rO7QKBvas1XgnNwTUeQvonn37Go0rhlChd0bw+nesjp81TKpnIxqqfpzHs1TYloEuHHgQ7oDdlXLwW96ez1h5zAvVBdwOGKi2C2OeVUlUix/dSWxN/WAoFKgNVF7oe0IBC0JwKdyxCoMA/Su3kx+SUxB5/RmPhb9TBerh37zivBKNEXz151TtEpcMF5a+ZA+OH0bSAae3zqbxOyyW6praYMqRajePdtocdbU6ZvZUW/RayEklR3eHos8oXD4MNpoj28j9GeMgNVT5IOAWM6IGi1kHOSpm7iCRalpVZc+Z6moFvd4wU2NkBkMohzsWvglNYAPvJAb94XUeVDHzmcgkrLbJbZPbtm6BiSdGhwf6N27obI+GozHJIUXDVn0gSfXFTcqqfysH1R3NKpAupojloDKEHp5k8WAL7F1dg3bBZ3cHaN1DdsFvdwEQxea00ptRe81fUHvNEjY/E3woSJ98NORy+s/Z3EF3leaWc3ZXyG3Q3IJtvOOU0rHvlNKxj3c8+ij/TpSS58gSmI0n4yx+wal+FYCmhJ9wpteYTn7VYCpspJ38hu6jx0ktCarfhO7GEffzb0K38G9CqzvVAdXxcLjdEKcexWD16G8iyqFrmKh/H6n+1eOMue//wvL9OcJ/+/RHPoT3742994VCpPBdbavms4CrR2sk6nPK31FqdxYiK09qW1f/0lL5YW1sHDzEr/Ab2ZUp3nKJGMnb+MM+SHLsNPqrP2KMPn6e/aehrx3oe+r69LGXr52b2v509LzWj9ChzM3++Y3RwH7zx+ngLZf7TSof/0Hq2ZdvzAvb/cZpZ6dwj3Wdvuf/tPpjf0mCwpfx+5h1+nbhtyVvctwTsFN8O3V0ggwy4fpz3ogeNvynpRX2y0F2xw3mn8Dz4DU/v+Lv9d5aGW1YtSVqem27Ev6bQhfYweAbmufQ26v712MbRRugl2/MC/0p8bwh3X6S/68B158798Zk9yZiQhDC8TX+g/4rMb9Vc7P3Xzs+6LieHiVa5iYtzAj2/QLZx7JkI4uCj9xA+tgk/Eb///Ljb8latpBRin99Ui6LJyAn/h3ZSO9/3cO0w+8mcpR8Asr/enOFttJ7XqP87RspzMBuqyhfKpXv/DFFCEI5cJ3y0FtU/l34d80FzU8qi3b4uuVCRbnyBst/6Q6Xlc/fqOijb7I8gH+7W1beXVF++8ZK1QWjqaIcLpUzr7u8xMsv15bqM1D+cf1Sk3qLyuWay7VDtS9WFtPQdco3KovZ+AbLtPmFYqlz133idZRHSuWXlqjlvJVZJ6xXbE7bVttTduvbVg7ZP6cUxw7H+dddPoc7MTZCDsNu7aNEBzu2RtJL3gce6r5aJ/6lBP9Pcg7Bro9q8ODbyneACFNihZoCM2KgURUWSDtNqbCG+OktKqwlXnpBhXXQ/oAKm0gnlUmWnCAnyR3kFLmVLAI1Z4gIfrKVtEERyS5oOQj37eQs9M+TI+Q0mSPHyQK0TcEzJ8ht0D/PnxoEnDOAfwLaT0O9no92BkY/DbvLFiiLMAZinCUHSDM8dYIcg1ZlvFMwzu2kCbDnAO8oYB4H6Hbe27LO/KNwPwZtR4H2BpKC+W5XRxfJDhjrNPyeIufgirSOwlzHOZVb+XPAk+i/dlQxAHRdO9cQPH0U7h3Q28pLL3B/iIxAW+86+E2lJ9aTW7FvD6fwNPQjbWLZ6DcasShTRaKnAQs1dxLaTsPzp7lEmrkOFqF/G3COpxe5p8hLO6aXKf1AXqbKf1Bwcpnohx4f6wgJpBHBJzca4garQTAotWFdq86v4zXj0BXT16u+rvk6GE4V1GuHrpAML7wukOHlKL1v+7ScuW96WVgYXo5j7WuGu8HMMvfN75pGlDz8PNlnqDfYDUJN41N05c9lzfuXGRl+TLugI8PD/w+Dn6zXCmVuZHN0cmVhbQplbmRvYmoKMTQ2IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/09l8AAAFatREAplbmRzdHJlYW0KZW5kb2JqCjE0NyAwIG9iago8PC9MZW5ndGgxIDE5ODcxL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTc0MD4+CnN0cmVhbQp42t18CXQbx5VgVXWjG2g0jsbFA6QIsAHwAMAbAC9RIEBSIkGR1E1IokhIpCTrjizLtpzIjuXYFpN4k0zG40wcO449iZO8yYByPPbGntjP43idfd44yeaO40x2Mo4niXedzX0Q3F/VAAhKlGx5PMl7izK7f1X9rvpX/f+rumWEEUJGdAviUMv4lua2yfL7ItDyJPzN7Dt9ytP9WSIihKugfs/+EweOnp69+QzUP4+QyXXgyI3773QvOhEyv4BQ6JaDc5lZ/HzmfyDUMwr40YPQIP6NcBPUb4O67+DRUzf89fPm90P9YYQMjx85vi/z8Kcf3YrQ4AxCuvKjmRtOcK+YJxAauQHwPccyR+duuGP8TqjfgxDZe+Lk3Imu6NhxhEb/BP0PIp548AeQDvrmySS0pLQ73oPacDPUaRf7eRCywA3nq2hi/+AsehqhPxLu1SUBIf5+3OxB+K9oH/4DeZI9wqE3+vVC6USdFJ/8K4Fxljr5+3NfI88t/QbqxqXfaPUCHjq21El+DO2/z7ffutS6ol4Y7xfo/6wYT6sXx8uikCeLtk0Opj2e1OPIvCmVFbbsnMx2uLP16Zn9nvltk1niz/xXPdKjffvUvW6vN4vSWZRUBy6ADJIziXAWh7Kemf3hLAl5Zj3ZpyeyfGDnhXosJQf3DWaFwUlvlvOnN++a9Kpe9/ykJzsxAU3xtNuT7aRQZzrtWdCwM7PZemjK1zzZFtrfQjGfnpj0ADXzGU9WmpicgRYP7ZMoFKVQdMY9k06n3VkcTKfVLJqYnEunw1ku5IFxeH8GKNMlJyazOjWRFdQE8JHO4plwlg+pQJdndkG3N+GhPZRit0YBvWa5mcF9Wa7RC51Jz7xnHiZYaNH5gclNkzMT7szm9KSa9qY92fiWSehzU9by84ezulBWTAYvIKJJSoCqmlBB4moikyV792fxPqAiq2sMZ8WQh5JqTO57nEd7PXSEbHwmTVFmBhip+tAF0YiSg4lGb1H2htBKXUjaKDgIJCSB7xnP4LyaoXph8kJuKtOsxw1EFqgE7aiZAW0K42Uez/rgKeReZq30ITnEGLpglDhQtlv1phu94awptEDIYHY2MxDOmkOA6PFk5eQIfRwANZHOmmhtM9RMUAtnLTCMlYnEAxLYB/NmzckZz/yMJ2sGoYWz1lBq6+QCPzuQ9mVNc+oN4awSSm2aTG3RGt1eaLezdltoAVmS2yYXLJZkFmcSWUuQ2ixYcmJBphcTXLLYBZrg/BOTC1R4wG1iHvRLp230qvBYAXZr/fQRWAq0JQ2crAf610PrSlVdRoELCNlVkFYyi/ouYIyZruwhtIDI4NbJrEVNeAazRjA+SQWDS3hmYPpHFQUjM0ok5mcWbEIwez7orgUxOYA3ezCcdYYWML27QM70XhZa4Oi9PLTA03tFaEFH75WhBYHe3aEFkd6rQgt6eq8OLRjovSGkFuSeFWZAwqqnKYun6AIJZxtLOl3FzndoncGSzkCx86TWuSaEsqbgW+CvBvhbA3R5gD969wJ/9F4L/NG7CvzRuw/4o3c/8EfvAeCP3uuAP3qvB/7oPRTy9DIzDYdgWmXGkwTdziSZKmHphaitNoWy4WA2DKuwGRbAes9ltKhmOlXqEa+I4abctxRVi13Z5sYFHXYOToIjowy2lkrm0u62kCfC6G0HPDx46SSwOlednLYj1+dZNBnoUzsX2rCTMtcBAgCKVycYVkWmM5yNhJrKesPZ6BuhggXvA/QY6AS5/J4mz3q68kGWw/Pz69X14ComIUSAZwV3EMXY6QCRdoKLcmWtgMaD1/QztKwhGZybb1I9nt55GK9rJYqnSRsry0MLYHqyM9RpxDdNPkI8nMf9CAlwlekEdaR68Mkqw1aHYAknL16PM9SZaXGDJGdmwfqSmVnoJsmMG+AZ6sgufiYDZIF7V4dAmSrMMAT8wY3NAuOtMomquUwevAQoQQeWpbtkVBiRcuRnRMB1QnOVy3OB7rsLcvBAqy6Ql4PaCyLqKXZl9ax/SF1PJ6Xa6y2KjzKTlzDaOtnk6YWQS6nPN3ooXQUVCH6oDZdGd015q5l1XlMqte21JZQkC6qaoSnAxSwX1NsHjqKJSnEoa01OTrghZHp6000LTdgBC3Tdit7N7okVvfFVn73SE/2hbGfwShMmQtmu4DzQRu0LmLosKii0KdsETyQZy9Q2CzqhZqnCYmmCdaaNOgB+B0JIAfEqjHj922W3lAvqonpV8EIlFuJN52kcBN/aGSzIYQhqXUGvmpdEnpMi0+uBaae2wCG9gLVsb8p2wHrecJn2YRgOO+zZCMAjoWwMbikqt0EQsGcIYmlBUqMhasLZFIAbQxfAWQEwBgCmwHjoAmYtEwCwlk0UZxCAzRSHAlsoDgW2UhwKbAs9Al6vH6DtAGEG7Qg9grW2SYC0tjTFwxTaSfEYtIviMWg3xWPQFJ0zCcAeOicFpumcFJihc1IgQ3GGANhLcSiwj+JQYJbiUGCO0ZUAaD+ji0IHGF0UOsjootA1jC4KHWJ0Uegwo4tCRxhdFDoKMu4uKvAYq2X7ADyugesAPEGFzmpxqL0Dwmge56QGUpxrGQ7O45yCh3uKo17HauyJ0xpIn7heAyn6DTBOHuFGDaQIZzSQItwEuL3F8d7Jagz9XRpI0c9qIEW/GZ7MI9yigRTh3RpIEW4F3LXF8c6xGkO/TQMp+ns0kKLfDk/mEe7QQIpwpwZShPOhRww8KSSriWBWP5flfBM3FOJwGHTGoXrYiXlgP2ZELuRF0mNryqyygLiWoK3d2+ZUHKq3NqJEhTLsikaUDtVLoDlahwOCU6lX8QVVzY2pHYTgjxNel9tbocMf4wjJZQhPnlQX51WVnNbxZPHTHObJdt3iLTwhOwBe/AzdW24ECs4TPTIhe9wK9lCWggYnGvV7iegKRgW1NgBzRtvbXE7lvGIyKewPrvgFCuc6EF66iYwufYV8HMkosCDMDsTdMDBGO+i2dJoAhMcBlJHRz4nO4IKABkggEqFjOp0OQT3uKnPUOx1k1G6TbHY//MFzSz9f6kb34EUgpSLugsfLUjASrsCjjDxHiA4lsGFi0WiRQocgqLzVLPtbKZnBZO1zVpk3WojYHiQ8pXfxl02DfhA3ql5aIofIU6gCVaGGeKAK85wFKCUjiAep8Hg/4jgHzMmE4airtas6sSLoowTXBurqvCK7RzpimM5chv1ejhyyyZKFT+WeGNHbzWYgV693QQMWc2PY9T4Pb7IaDY895jDLnMCR2x1Gw+K7foC3I2YDe4Co3WADDlSNAigSb3MARXgEengdx88hUO8USNWRErBOh6Y0Ja1Zsyawxl/nBTpEoA65KHnevMa8bbQqRgOq6mwHGZFopANgpZ1YR2/cmfslFQc2bJ3uaPH1d//wh9HB5i3bkq+8iud2btibUUzkFpOyeyKy1f6VdX/AA+tyLQMDQ4nc69RmWpZ+Q46QL6EG1BIHC8YcRtxZxBHMkXcCjbpppNNVpYBkfhrxfDU/GqirDahAS2UQOR1UcnUBtVYQnA6Xq70tBgIsc9F2KtIAaJRJlBwRDWa9fmJ607nU6LmJ6XG9wWwQzXUno9MPTO/5eKbzcJDcbDUYjbrI6Pkd6fOpDp2sN1r1lequh66Z+7spTzWieqZyvR/kakWVKBRvYHLkMRWkDnNcQZCKgpBSqVSUuwDRHBXAuJCLiq9EnDYqPyZA/P1z/f3nZpYwFSFaOna67fCmb3yDPDl9/8y++6Y00S3e/MCtm86NL34B5EVpMAANHtQcD11Zo+wMp8bn9Wka9a2iUdXrLACKF/+OLsIPMl0eZwvyAvay+w/xWI9NNlk1cmA5WP9IL1SDKE+TADS5qfVDnXCYzEEPP6XDPO9Igfk7OUqOG1WoQI8glhfsa3l6R9E9ePGv6aSPYA+b/F8Uk5mSdIQ8qZhk5Y9WOvPXaRclpmBDN5HnUAvqi/fUYV4Htk7ouhDOilhAOl7QzQENeBpEBLbE82gaiKlmEmpBTWoATKVOTy3K5bzEdhh5K4wsGotQUoHSdnJIsYSPde1/aM+eh/ZH9tWZFaOkT23ddsfo6B3bgjtq7zPZbKanMCyBXyhSTS0gAWplucFqsukaxs5v23Z+rNz5HPUvBTmeBDnWoKZ4UOYIkFtwIXOCjpQ4ESC8Bq2x+1W7P79YFUGTn7cA5L2YlwIko2CbyWTLHYKbWbGZTTZ8t90EAjUv3gp1E27MfctkU8zkLK3lXsGVJltRt+hjQJOJ+k4TZiRRQ7u8Z7+3MIWtOODirYWx8BKMZUM18So2ChgKKTFXG1L8HTyMuNJWGR/4f1Nj+KhJo36gx2oqmAB44o8V7fAH5ItIpfLzKBKHqdfDHAKnchbC1koBqkh1+gP+vDEW7I8T6kDbXIk5Uo+Mo2XkBWDEbPuZZCKy9DNq/opJtPJYwOApqGkuMlJIIHevCct4/+J3NPpkmyjkrsfnLaRI4xmQQRXyxb3lEkEEj/AQYokjhYukVSG3v86pE8uWKavDpSSVYabWwxabSTTxuS2KUbYqslWP/8Eqkyet8uItFkXgSWLxRaPVaiTnzFbj4hOkQ7YyP0bXy1dgvVjAiKgmwHvklwZ4sfzSCAQCtTyIxrdiNbicTaRkIUAg+Mr2ezKZe7Zr1/jgTePjNw1q198+NDX10IGDD+3e/dDBHedHwbFqV1T0pQ35GAWeX8A8SIdHdJ0ScBtUHjRNx6NOJ0il2lnlrgBcmxoQwTwK/lQtkUm7rRCT8McnW1snYy9qGcZr3Rs2dL/4InmyfVdX155o7jcFs8l9cuu6vrHcj1BeJpu5CpBJFA2h9fGB+jKiE/CIHsNV0OGzoCYeE/4sEiCuC/gALEv4bx8SRW4aSK4SQW3J/p4ueD4SDqk+vwGWJa9RCcoLUPfBwjxE+VgTKYoT+oEh8DLMr9D8ox3lRdsR0HwOZ7D27PB3bWzyd6gmp8UlyYpybsftKU3k/ac2XlPd7GuI19e2lhkk0SIunizVQqfV6Gp0V5Q5bIIo2WSH0GzI3DujaSX94b2KytkVp9Nm1kmCAa8rVZOmI/C6kFO2oWi8vRbCMWZ5DUQZMGUdngNfyk2VZjcNDQ1tDW2tzRE1AJ6pnCY5zJ/WURMKrFCYV+Nf476M6yMaAjnC82a9JFbVjkVftprMDnD95q6d7cloqBNji/JVtde3se/VkEWnF/W8dcP4UJeWf1Cdtm6PxjM2ZVN3X5uEQ1z9QKgrRTWMkQ9snoB+I5QTxPGI59BZZnL4ncAFmYZVUJViGQeNodU6ug4jqEMNhGsD1Me6QIss0Syj6qHaqSvqsRgkqMZgbZStIUzz//N4h2yXZWnsug3TzaM98R3RrgPJtYc9Focsie6drcO7Jzev39nVc01SammXzLJD2j4QC3b57PamjT2Rzc0NAUU22kVPfX9nd1+lM7Qp0b6lRfPLtaCbbtANZPnxNVT4HKQiVBHaqgEcF3Koqi/vRBwliyUfvLykAaT2IvXWL7KY/xJ4DpPJsvhRJs05q4m5C+qzln5LDrO4BHOBs2L+Hxz3chSFYAQOY9lhaT6jmEnnLZr5rJ3K0A0bhm8YUiyyLToVjU3FrDQQmXJ7h88MDZ0ZxvexqL+3c08stqeT1hgNKvB7PfknVI5q4zUOwmIjuM3lUATXclRWV8cz/wBmh7Wlh/Nas9tBVWTOxuV+zVsNBguf+w1nMzoNv3hNZ9GTf1KMon7xVoNRMpB3CZLJ6lp8miQMRjb3GpDuwxBXfKgt3kwzU2+lBEEF8nuI0YRjsWWlA/dBbKnzBfKxReTYEuA4RhCnEeSiFJVF2a2du9tGfsBZDGXi3/+9wWmwQMUpS1bu2YcNdsj6P/WM3kW+aDVDjDFIdvzZ3DY70HmLIJgVybD4LH7QgbHRkJsivXbqy8Jg6zIxQhgJoYP/CEFGx+ORVLZ8YjJeLYCRlKUKFl+TEmnCOJ2n3B33XtxPhcuQWIioxqPpuKMa0uHqUHXQr9JIFfD79aWRKhJZmUBRbkmJP6PWgP/I9n4Vsz3Jw2v7Dvf3zlYopnu3NDdv6ejY0ty0JYKXIA3po5aQDPcNnRkdvXGgu7kPMpjmWKa3eyYWne7tzcSA13HgNUz+Nc9rRYHXWsorMOCirHDTlKtSXqsZrxf306WTR9Is+xJe/f6AxmvRszsdK5IfYNl2Ma+3HVm79nCiK7OmsOV17+1uZrxGtjY1b4kQ48CNo6mbhrqaEzRdJJ9mC+C7rb05tTPT0zsdjcwwZpktgm7xy6DbMPNjq+yXqPeqKd0wwWNhFPLD+szniq78xjMflopZLYs+bQXONP3hXZtaLUbJpDfJltaq2K6OtnSXL+gUFb0syuaWre3DJ9fFT6WI0elzGm16vUkQDZ0z3b0zMdnIm0XRIit1VYNnRodv3KDFWc02f3xZ23S9gW263lbbVK5gm/t6E4f7wDZ7ZitLbBOu5MeQ7E1SJQ01xYG31JnBnmbsh33aSDTT2zMTi830gACK/ELOa4SdWAPqjEegBfZHkE/Qd/Y6NEe9FFMUsz6WS1Rzo16vt8Fb76I7RC/bl0AuXFAS09DKPYqrDLZU3gikZrBs5Nztrbv6WkbLjJJklTyZ6MbTif4ja3uvSeDcy/vMeJuuLVWPFaV3OlZfY7BKRqmuLXH92Oab+juPjHx+IqUPJ1WgEcSIt5J/Aar3p7JrQDt+JIhIFNBZPRZFti13QfoOyoG4Q49UQCNOAlpSC3jQDP3A71zJExpWOk4jSwOq96k+iFGqQXQHbYLTqVnfJZGqXXOYhY3Yj9QTRkUxnqBaGpatVnl4eG1Vi1UymFwm8tlG/wGrLFtzGRbT7leMJsuBdYOKXbbqBKaPTlIN+gihXjQcH6qvJIJOATLJiAh7VWBDp2NaqEnpQTXM0KqpaphLqECj4TAsp95wT6QdhggG/OGAobiBYDqhWQI7htDyhDfhDIms9L9jWN0Y40UDLwiKsy+anqs40jN4PB4/PrDuGnCNn9jR2rojFqXXKF5SzLnxsePdtiqLaJAETjSUz23vi67VTHFdKE7dZCSzdu1MpGCJGI3D5aew7lQUjjd6tH0cW00Y89M6xnrp1qgWdkYXb406NJKVSzwe/tAk1UVfojHVVPRxM22Ee0c6929MDe7+TfXJOq1CHmb+7fvBGFpaQv0w3YfJ/ZDPwOxYBA09B62GBYwfX1rKtgcBh53fPUg+DjgcO98i6JvMF26Dy2vAk5fupTxlepFHdMPHvDqNYnnPAU5b5bVclBpQnXiRz/bn15RYhl9zGkyGH6QKTGCvQTbajF/5bhAqxp/G/6aE/s7fS3ajbPyHV1GBFvRBoKVw9um6wg75g6Vnn9pwi5OajrgE5BOd6MZ/jDSzFEeLZC660HTTelHgdLqyFGQbmktMZVuhtxLRRooiAAoRhBKMeOWKdkQdaqEzrS3DThQDCVF902V4BX2vpn6nZtY0tXptG2VpXcEIeuMNw+GiNexu795qc57oItzxXXmbKE9sqR+sz716iYHgp+m1uyHaGQ0lCrb7K1izKpp4VDNdjfEypuWiBdcULNgNPcuNbFOb70nHTVdn3pQ//LEdNtmk9A8EN7YUGZqDsH10Z+57jGBVo/4Hy9RDFr8c7+qA9ov22jVvZa9dlzi1fv2phHbtbUtHo5Pt7ZPRaLrt0TODg2dSKZpAp3ppAKJhKDrTq9EwDj4vDHZFY25PvDOfJLE4KtCjh7KSpIeKswKPvlHac6mULpP2dGeqCzKr3NtTTHuatkYIl7x+JHX9QKwp9zu2rt5Hs5+B5miuKbKnp3sq0jHV07MnkvfZl8tnl7moKUkFUpqzXiWfvQTnjXMG5c3ns5fPGbDNtHiK2Yd5OWnoB08dvjhn0Oz9JPC7Bp191E0jaJ7ZsqJXK9q2FnS15QDbFAx2Ts5evCwKoXkZYcXqYJKhUVlbHWtQtT9Q61g+pK3V+HRerPIY3uyxGnXVJv9wc0HHZVPriNFqhX1J186m3y6vh8muFGa8NUI+9GngrZ2d96++D69JFU7+YRseVOuCtT563h/NB9b8/rtuxRmtuLz/duX339DQaBIkWerZ27I+0bNlT9N4W3BHjUESjZK+PBFoTpLBZMdA8ODGMxv2GEyiII2Fg42NFmeyv6Hf5/WJJtkg6N1VoVB9o2LydLf0b9zFeKCHte1kHhKYTCobZpLX8bpz4GM5jp8SWDClWioI1g3JE0UoHEWuQETLeMW0CHIin6/WTv2xHXbPwG8h/QlcmhUVsqZHqsoEm85g8rjcjXXDsqLIw1Qjs0bFKuMv5RYCbp1FMtulNtAbzZDYEf9xm1G2MJtb+j3+Gf4TcqM+zZpsbKNfVrrRd2uNBJ8raUzHZXayX+n3+3Ur101x+08VRmv4e8qxzMxRStbo4NBGMI4/QSR9Ze811+zFlSyqvrIhldpAYe3MZgniu4Qq6bmDCxe3/DXLW/5KVFm/vOWn+2wBdtgdJVvsaBn+vo1/lrfoJSv/Jc5qga3/Zz7LWyRiMBsN+lyH3oglCb9A9LyswCb6MP5rg1GzVZifvADzBwr7frVavnTfX1Oy7w8gv78uUF5YO5SgOrrlLxBWQpd2JNFOnlC4v9VZDQYzf+46SqTC3cfZTAYL957rIVHRv+uc4CKS1YzlXAfQJRlwR+4FINlowC8IoolS/A4ctNtz38bvd9BzoaU/4WcIDzHOE6+urbBCTkRAbJh6+TydvkbfynyocC5ZOOAqiy1nRM/YZLPxIx8xWIw28aFPCXbZYrj3bslisoifeMgvyXbzc/9NtshG/de/rZdkm+nLXzZZjEb9N7+p2VQn5Jx61Ibi8bUVWMfLYDuEnsjTN0RnRYGUZtzVRVOrYLJsQ61gUrX1gfybGaVwlkrdQNEPRIRLbS1vbN9V+o4NNg6XOwln1gtCvHtLpmJPbMdOlqYkG1KQnRA92Nz68RPdNovJSvSSxKkHd6qN7QfTuJ3Z47c2jDQkA7jRpEBWCmGC2w57olocpVkEjuIMyyYweUbLXbk7We7KLeeubB/16+VnwIYzGi6pY7ikgAtxLga5QhU7l3fn3y8ycVSx14t4mr5qhE2uFZyE1W2tdDkA0Ryg7xddJUkDlRKLTtpRZPv3jsSiR8fHj8ZiR8e3T01t3zY1tU3a8+CBg5/YM/XgwQMP7ul74Pz8Aw/Mn3+A2Tz9YPx18kXkQuVxp1UieAM0woLPZ9I0mbUtr/C86URjsWjZjyx2s8n2LlE0geP6tGQGy5bz70SGR3iHLJr5/QKhc4wBsxLwWY864q2VYBM0ac+fr+c3wZRnni95NVSP6urUxg66spZfDoHNFlgtUlI4wxBFL/49OMHcebNN/5PO6Obh1o12o8Xo0AuVB/vmTvYOPo7buxXZBNHKKC31TjcNjDW32KySYNVHe4+lY9eOvpg/b/k6eRLi1UktF68rmC/sannMYZE7ABYsTCFBcKx0lmGIbZjjYbOP6QPvhAcg4F0OX3P+7aitw++lLyS1ZHz5DcLy2XMh9civWm/+OFdbse04munpPzEQnKgy22TZ1DjSsrmldTwkB3SyRXoq91MaGPCE1SI9JuAnOmYHBg71VFVJZtlpDIcm2mIjqgjrQ/oGPf2lR9cvgF3Ss2bC3lmxN5M17GsCHaxeSCYgcB9ApefOa6pZEgUhTCxmEGo+d4hoSsPaWm33tiv4F0BO0kZf6X5Ptok4AQtSSeb+y//FVhqjvkDN5wtAhx7/nQzL8SSOg05iSzn8Q6Anikbi69sxJ/qAIvq1xWXELQi6KZD5srg1k4qiiC+m+tW6S2RdEHZB2iUvb+gpcuGdtUg3B2sP9PSfGmncUiOIimw0Vq6t6Uq37t1cE/GWixY7DhIQd5gKPfdqbeV6P/5a14H40PG+qkreIkp2g8MFqfDolM0i2006DlslC33J/aLJpvkD/DvyNZBnEO1+tIKJXUs4KnWQFnI8AeboezuaSSzbXSXN8s4VMUo703E7S3aD1Y2+Wqqn+hXv0/JZ7vIhk8gS+5Wp7ux0pGu2L3WwfcP8tF5nspVPvL9yzbbWzp3+oZaOscb60Xb8RPxQT8+BvqGTiW3//KCPWC1OvfdTe9SG3HVTw+GxlubxltBIWMt1e5cW8SvsPUZDPACegBi1L2cAmuK014AFfbmQw3/x8T61psICwN+2cLnXeKtBtoMh5J5iln6Cvg7VGRZvNhitMiReu9hrDZAtDHgbxHC6LwNfS30rExJLeLhp6nGdnOZra6zV5U5ANEWor7Vp3xuxzIuaNrmoPmyzKaKy8oIfcNicNif8Z3Pkph02l83BLizHOI/uRf2QyPQ8asvvbSXQsMK+ezpe2C/C0nJTB4HRbSVN6Uf9wVoOki5XXhjRaMEhivlUw3lvdchptEhOndkiS1aj7HNWeiu6/EbIgQVOdFuNZoNktrm91dpesRwup0Efg2gYbYtv9rgIZHwjikXksADZDv2yQ4Z8yZEy68GXG6asJiNnMJSl8gIbGkJoaHhoeMN6GGGgf11vT2e0vdXr86kO+uWHTawuuASxcNinnWVGYrESKJ/hLgPMq4N3KwIcoJNZm828K7DTDLdZN7HKJhsuf9aNFQZsMtlt5t3+tNluN89WEsVoVbiyZysBjQITT/mfDRDIX0zWl2xw+ahstpv178vf7OCQXqJ9d8vmMuVO7Zp75aWXmM12wPXdaC+YhPY9GfsyLf/WjZoJ/Z6s7SKzGCoaA7MCZg90LP3SWfwHrgb2FNXxSvaB2whtPkdHPAXjKchax7EQzxxnfmVS4y+38vgR0WKEtDa3UTRLtypg39yUyWiRDYY/fUKWGK2RpTjeBflJBTuXosmEtsFfU09DOa/5uuUFT19eMrXgbv2Zc++5URRhuIOnTx2SzfLTfN8v7pr/2QZekcyG3u/deNNLXYLVmH9HWLnUj/vJP8M8mkyqSr6xq0Dla4o8RLW9W8HD0kgtqA0W08HT110DqaZePHPb7TeI+qdWTsKve/2u+Z+v59lc3ejf8ZewikxoTf77QHr6hqeY+OhHiCZk7KATRpcjI7jrlKKY8UZ6yJB75N/pV0T0TxvvJ3gjrn2z4xUMdwQGYB95fOcn9HMQW/F96Roio7tBFpWoKl5h03RKT/3JLPu2YzS/aG3F1y2a4NvbYvlNXmRN6aI1m9iiJfu7fCtXrcJWLfgQmO9eNt/qPgR8KXu9XeJDlpuKPsT2Jn1IgZxrVicHfEj90h7uY5DfjYNH/aX29sDqwRLxu00cLyWwIHIjbtbElTalNdQWJCIBicJZI6SEGMEG5iDU9YJ+H8Rww7SMDQYwYkki02xXI9HjDw881/GmnmNHI/RhpD0bj8FmTiKcdPZNT6s9mU5TO9+9c9sW4HOszhcI1PvArk3MwxXCKc3PVp4e0aXGNoZOx8rPPPKnfKt9wWiLdBRwGAr53H2b+o72ByOYq52LNiYD/ccSbUNmiXe7cTN225o2tYzcsfP8yzcPfvBY+8ZISBBkgdjW7R+55eGxu351dzDeHt3SFGto2t2HyXNb75rcfP9sU8Cgq+iJh1JN8Tt3RsNxd4XI576hM1RUbD+/fuzG5LEX37v1QzstLhdnFjizocZ78FOZe/7tptxt5o51qePt0b74XEf+35fm/9XotKX31yBtdjz+35/4qw/Q+zfWn382d8dSvc7PH4UqPe3XfvT7BfbvUHVboP+rOv/yv1TVfmQT2QB7gG/Rb4yXbkK/WPo5uQNVoz/jj7wX7SHvRy2X7X+RfSt35TE63xjnLdMXBfoeuwJ9X11l7j+8/fQQx5sbk+vR8Mh3ro4Gkrs8j3+JH9mq0c+JqIXcd2VeSBvyXfX4u+n+6zJ9X/7Psyc2/keQyj1Hv395m8fdicJ/Vh3tROOw9Qu/FXpI6D+XVpxB1eTIFebvpO8DLvp9i703/Y//wI8W5yljWY/2e6UEvtz6/YBGF0msQt+VdLHlz6v7N2MbBRvA774yL/ibqPGqdLuFviu4wtxdVye7q+ZNgdzw9Ut9Dv4xql3Vrq7ix92jxV8SuzQOg45jkDjroG+M6FEY1lAt8aMYqYA/AfWi/19/T6AYemalvMldsKd+lO0ZL9WPhPRvaEOnUQT+Khmcg71Kof32ZfiKv2fAfwNN3At/EYnUw18fmkHz6Av08P8tlUn8uRXl9YsL6b6qcoa8XFq4+mIZe9Pl7Crlq9xXedtlyta3qdzL36sL6N53UfnV5YrQuKIcucryGZG86XLDWyyv6ydWlOdLi8F3leUDkryiTBbLoTdRTrPyJCsvX1yMh6A8v3qRpbepHILyv0wTF5ULqxdz1UVl/1WWT1pQsQxZPvcG5XkoLxeK1WPdbH1YaVROKq/YJm0f/rOW79g9+XLB/p3l4tBfUnodJ6H8LSvPrFL+4Ez8JYqLvsege8pDsAv+EKJfJjaiHvRe8JYfMrnovzIBSI/2w24a8wbw9ja2s6YwRjaoaTBBZuzLwxzqxG15mEe1+FAe1qFK/L48LED7J/OwGXXg51ESHUcn0I3oJLoGHUAH0SnkQW2ww2qF4kFboWUO7pvQddC/Dx1G16IMOoZmoW0CnjkO9M9BO32qH3BOAf5xaL8W6vVstFMw+rUQqZqhHIAxKMZ1aC9qgqeOo6PQqo13Esa5HjLDE1A/gI4A5jGArme9zavMPwT3o9B2BGhvQCGY7/r86B60Gca6Fv5OotNwpbQOwVzHGJVj7DngyVN16aieaqDr0rnoeAeg9QjUT6J2wGlhpQdksB8NAkbPKk+FL3puNRmuxNjOaL4WsCi1npKZ3nj0gqw1SV8LuFSjJ6DtWhjlWiapJqabA9A/DhKhJ7Opx9HzmycXML4rncXa/1DjxAISE59f317DoUYKPtatD+htek6v1QaEFqFKYDUp8aT5acPT/NNgUAaomxJPojgrrM6hgQUfvnPTZDZ+5+QCNzuwEKC1L+hvAfOL37lv6yRFScPvsV59PaxVTm58HC+9J8u/f4GggUd0swIaGPh//3z47gplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8L1R5cGUvT2JqU3RtL04gMTI3L0ZpcnN0IDEwNTAvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzNjAwPj4Kc3RyZWFtCnjazVtrc9s2Fv2+vwLfarUTCe9HJ+NZJ65bz6ZNNo9Nuqw+KBbtaCtLHknuJv9+zwVAiZRIWUnU2WaigMTjPs49uABJJDDOhGLeMIG/CjeWSY3LwJTlTHKmvWBSMMslk5I5/CT6a4VuLBjPJDpzh9IxIQKGQYZ0kikFecpADBMaclRA6RXTEqqMZaTEQo32KINkBuOcNcwIJnzwzEADh3ALhRz3aJLSOmahSkG4g1kK+hzqNeodDDeOMxeYtFDmMc5hPFyTXgjmUR+EYwGmcI1SMSWkZcEyJZVkZLpSMIajQWuNC82UcXCLkxewA9YrBxw8Ghz89BjqAAG0Kgc98Ep5oGkcSohCk/IW9+jvvWce9UFgPOqD5iwIlGQ60ArBMKCgOaAyQIUDFwRAc/hlBdNkDURpAVOtRolGCxQFhEGElgicI3RhuUM7hQC2a8UBiUcp0Q9yFXD1kAtDGf5qzQML6K8VIDEogXPAOA18gLo2iL2ADG00AsgxIkECUy1wMRhiKdQctlhD8GGQpS7AXDtYL+Cx9oBdEDQc/wgBHwUCKIRGnA31IVECw/GDAklcAg6OyARHJVQJYiH8QBNYYBE6ASZaT8OJmRxmCwTcSUAiJMEAc8FFUCTWAKAAbwWQ8pKTzWAJgEYTLgyZGoNKxkuKliN3HJhDBEBBlBUgEOooDIGTCwrTgAQIKoEkRgbpiFygmKKeAJIsoY5E1Ag0WokAJtCsA+KWYo6OxFgNUjrQVVBPj3gB+eAtVaAl0IRRMShQKakEdekeZIUVdGUAuSBruYdXFAtF/mqKgQZMBLijeEbACWTiu+SwTpDzChA9fjx49/z9f8qrFa4ubxExpIqXp6eDi/mMqi4QjVzzYjG/elWuisGL84vB6/LjCv1HN+XTVDxJxeXw9PRvGPdZnV9/uisHZ7PZfDV4df9+RXfPJrPfB0/mi3G5KDgM4MPBT4PLwdNCpJszDHs1+HH+ej44P7n6MLpblYu+6MHMl/ClALWM8n2B9IDI9EFMEI/3rTJHVikbKoXtS0xbYWTfAWIjPZVHUrmElsl81pc1P73tBwTVcN1X4LkUvM9DMsRZeXTFcluxDrKvkPiQw/saiY4M8fz4HqsdxZ73FTKXkqYvVbTDm+M7rHf0Wt/XtCxKOEqZF3b44I7MKlVnFZJ138iYPfsGk18b3w8uHNlXtcsqrXQ/Jhvoo+yuXZ9LfXS9u6SSsm9powKFcaFRps+tz4q3EtPgQlE2+4IU9ZUZbnd4eyL9P9r0V8HmaHZ8uaDPoSundbai65uXl/Q7uR1Npqv59x/K6XT+9/lq/n7en8zXzMVOqW+xSzJc9RX2kMJxzBksOpizXthjGfFhtbpbfj8Y7OgPvm9o1+YDZo6O6mkrYWAWlvtjg/lscjtZLYuT8/nVo1er0WLVO7lDM9LWcPDL6LZsNGF1gIoqtX2LNGNMvYYqbKNC9oxrVKgetpxUEbWgf9jcyZ7lmzvVs5RsXm4ZGtt0ttJsrMz12HGvJZie1V0SbJbgtiTYnrUbCa5nXZeESZYwmWyJmPRszSk0O94iIyfNb+F1Y1Vey6p1wMpB8uq7Bqe2qtBL74GrqeIfk/GysDF29HhGhROpMN22xsW7saJuGxt7OLdlmu45v0cqLVeNNWRHKvXwvCGV+vk2fizv39dwiqKbNXX52319RnV7hNcPa1JbmvQeTarn7a4mTRa4tnpY4B+My67yGGYXyUhP17FIQffhIYd0i0zd4RD1DaLNcN0LskPTuuO3laZazZamRt+g15oaI4J5WJPZ0WQ7NZlecG2abC/4hzW5HU2hU5Pr0QN7iyrfowf4lobQowf6Q0O4ZUSkRYhUp5cpsUgkoVcpG6EpSyTeuNyP537rCVHoOGTw7td/s/iopvoIxOx+Oh1ut2nn+uBxe5vABrFqkn7TJJCSMMxWbcrVhznJ2+XVG0JHQ+cAW2+wQeABrL1Nc96X7U1K6D6mXqVKHKRLyoBHobZBOzDowyDabtN8T5va02b3tIXDZIIdDg/wor1NGTwbdYyTGo8Nvh2zGphCH2bkjiGhSVOk6A5l1iJJi/Y2E/BQFzrapO8jLO0ksgh6F4scFosO8klv6lOt2QZiGtOGSx0wzPHzcrlaxhemcfMYt7aT1bR8fF1eX3NuFOfOcG7H+YdEhfHchdM9721ejBblbBVfxZHeX7AHje/uWlVom0SS6KgC6pxDeZ3r32+p2lm1axoFr2kUssMpnrUpkp6vXdas9muTLdpeLMo/4tvTmmrVoRoZw3r8QnYO9xJOO17DVhO+qOdkTgLC2lzvNv2s2W+q6jZV7ol2SFpJm82Rj5bIDJDIjAibuipstsxW7oDYfN91MVksV2vEno2Wa8QGT+f3MPeR2nAo1GHVHRzK/IlwhRRZMlpX8JUJwtjmkgMV56Kjoep3uvd92ZZRGc0G5zomks4TaQ3t9Qbaz7cyjYu8LTOJSI5I187W2lQOTdXH5vssc63D7A2b6vZe1723Hd6TxqtNjNbeqBwzU6O1SlNEjdKPLCbPjEgEbeurK9QqPbpjJjc2kvXpUc9UIhzfC1ObNlXe6fLG5DJmQPBAqs1vg8Z+73SLdzlgvuaq5H9CwMKGlpFWfuNqpFwlq8w0V1/moul2sZ4zpPjzOVnN6GomfQkfbac7nUFSTa1r676Gp3sDtW/B0c3c7mu5PYWgyu1646Wtx0l27w8qrOseOttcdPQ4Z8ec1SICJq/21xsk6lRT8E6R9zz9aCnWbiPXVtkxo1dRu1ocY5ut7SbM/hi7eow7Hd4T1m2ndwm5P0SyFiKp6iFqLL9iO0R5XtWzpNTd82rbzC+d4r6Bl35gA3ndDE6Vg9YY5eUx7lZC22K//fBcw8rUsTIHYJWiW2HVtS5+Fdd2U27E/TrvavOYdZ+O+dGIy5Fyoh7XdiC13XVzo7g/9qER+78wgKbaBbu8K87AHbbB3H5fVuOcq3POHcI5vT+jfO4Gc+2ZrSFo6hvL071fW6u1oOGIbV8LmptKcyxHTvd866/M4/XHkC7z6gsyb2yh/MO2Rpsy7XZ53/xsu6Z8XYnq2AKYWmTWDz/7HmRU80EmK8n06dr3kuU5wUak9emeb90Ve0MN1WR+harsQLWmPgvhjV2ErwlRqd/Lcjm/X1yVS5bUxc9yL0Y35VqFknnUbIX7ZVF/dbsZnZ8+Hx4u6m9d192X2aqNZ/ndXXyFmt60ivXXiiLRmyWusbRbZWmXx9JeiaXlg6VlmaWJzdLCM2yanjNDi+mqaXqaecP01XIZz0Gt8d6Iy6E6QFxoRVKpA8ervUiqViRFxiF9slKi3QLbZYHZssC0jw+Hjm/nkpYHjtfi8xFIQWPpFS/TvN0C02WB3bJAt4/3h45ffx0tTKKvES0UNepAeUZuUdTVMtJhAKUXxyy9DmU67INYiEyrxMWKo1WkKvuGg5/L8WT0ZP4xfte3yAEuVAeUni7K0Wq+OHk2el2+Y/+drD6wD9CzWJTXva9+3ozPI/W98v3qw3xR5f4qJVfvFPM6EF/z5Ld5pnoR5vLmCzfaxzMC4/urcnHycfzH5G58ffuR/XYiuZT0fu+3Xi+5hQXjfLQqT86/R5PlWmoeNNa177j6hvNvegmB53fl7CyuLvmLysVkNYw4/zwfl4M3y/L5/Wo6mQF2qnw2el9Olxj3y/3tsuBxHTk/PZXxYnF6qqsaAJy+l8WzqiS4krNZOCiY6/jH+D4drUbT+U38MlVYFYZKFnScw0o31KEwTg6dLIylDzt26HnhRBh6U0hnhlj9C49bPL0WTuFeodng3trCcoUS9STLu6FwrjABZeCFlRalKxw3QylFYZ1nQStce/SxQ0kaBdq8LYznQyU4Jr9jVilco4+3MFMVUqHUGtbBbO1gE/oaWwQpUSZZykGf0EOEAlxHKVyhvRxqiXsehlrBLtinrYheOutxTX0ci/WwwRoFLATJQbakE72WmXgil87yBmaQAAydOfGerofGwDanGGFkYIcNdJg8DOFLoWDTMGKtXcJasCg/IUuQw4IIuQXkJkIueYTc8CFCWxglE/QIUYRe+gS9tRF6cjtC7wA9IInQW5mg5zpBL1SCnk5D2wpynSA3NkJOJ6kxARLkMCpCjj5Ki0JqkaBH2CP0KkMvMvTOR+gNPCDolTcJeoSKoFcqQ0/3BL2kg+4yQw+IKQxeI5Q8hsBYF0NA54npcDzuEQLO6KA9Hdw2SH1GJOgFQieCTtAbzYQXQ2MNdMihcbpQjo63o51wETyHBSXwoQPONBbJoQjg/nCdCOkI0frs0tPLc7qnBjl4MlqWsfXX1z+8u7j47p/3k6vfl6PZ+NGT+XQcB56Xy6vF5A6JLx5Sjkn88vzVp+WqvL2cXc9j+r+ZLFeLTydn4/n7sjd4TgejJrObk8sxkvZk9akH7Xd30/KWcjjHZD9/i/Cowdt4JjqLfD3/8fL859HdoBpVS+VNQwZny6u0qeScPmvFm0fg2OAVjPoXdlsGyeHup3Jy8yH3Ovvj5u1kjIwN9KO0J5TjH2lM30fx/DWdwQcj1XBwiawyuTqb3UxLxgcX09ENdl5Wiij+E5L8YySj2XxZPubVH88bf07zSWxKaR3IEoTliv73Rcqj6H0xmZZ0NFxtLYSN6FENfyhsP8yu5mPgv0by0U8ZpvEIeua0/qblfPB6/mY2Qe8SCPh9ittp8+Ls5Zu3ZzX9oML9dLTYZY4+InO4jMwxx2eOd93E0bpGHOUcxgn6bwkinuHvII7t5IzZw5lOWNe0sTu0cZ9Bm075hzAnve9tUqd6nvsf1IjRdAplbmRzdHJlYW0KZW5kb2JqCjE0OCAwIG9iago8PC9UeXBlL1hSZWYvSURbPDk2MjVhMDkxMTUzNWM1ZDc0ZWQzOWQxNjAzNTg3MTRhPjw5NjI1YTA5MTE1MzVjNWQ3NGVkMzlkMTYwMzU4NzE0YT5dL1Jvb3QKMSAwIFIvSW5mbyAyIDAgUi9TaXplIDE0OS9XWzEgMiAyXS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMyND4+CnN0cmVhbQp42iXS1zLDQRSA8T266BFSJFoQJUL03nuv0YkuRG9BeAAzXsKNcesdPI07L8D/m735zfnOzuzNrlLq7y9GmdQd3MKuqAylxBRVinyCBzG/61QSjehpTywePQkcQgzEwgtEIQ7iIQESIQmSwSSWN31LChyJNaQzFUJic+pMgxOxX+lMh7A4PnRmwKk4gzoz4Vxcnzqz4ELcLzrNcAXZYJGKX32QAz4YhSrwQjU0QCM0QS40QwtYoRXawAbdUAl2qIN26AAH5EEndIETeqAXXOCBcsiHCqiBWiiAQvBDPRRBH/RDMQzAILhhCIZhBEqgFMpgDHZgHDZhGiZgEqZgBmZhAwIwB/OwAIuwDEuwCiuwDmuwDVsQhBvYh2M4gDO4hkvxPhmf0Peln+wR7sXvMHb+sN49Q0QWv41dwGrw+qPUP4ndNMsKZW5kc3RyZWFtCmVuZG9iagpzdGFydHhyZWYKMzU1NjMKJSVFT0YK</File>
    </Filelist>
</otrs_package>