<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>AppointmentToTicket</Name>
    <Version>11.1.2</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-10-26 12:33:28" Version="11.1.2">- Update to OTOBO 11.1.1.
- Add hungarian and japanese translation. Thanks to all translators!</ChangeLog>
    <ChangeLog Date="2026-07-22 15:34:25" Version="11.1.1">Update to OTOBO 11.1.</ChangeLog>
    <Description Lang="en">This package brings the functionality to automatically create a ticket with configurable parameters to a freely chooseable point in time in relation to an appointment.</Description>
    <Description Lang="hu">Ez a csomag azt a funkciót adja hozzá, hogy automatikusan létre lehessen hozni egy beállítható paraméterekkel rendelkező jegyet egy szabadon választható időpontra egy naptáridőponttal kapcsolatban.</Description>
    <Framework>11.1.x</Framework>
    <CodeUninstall Type="pre">

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

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildCommitID>93bf58565aa2edceb681da44dd74905c414673c7</BuildCommitID>
    <BuildDate>2026-10-26 12:33:32</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AgentAppointmentEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhNDJiMmNlNGNkYWJiNWY2NTExYzRmZDhjNTM0NjU4MWZhMmZkOTU2IC0gS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXBwb2ludG1lbnRFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ID0gJy0nOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9OwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIG1ldGhvZHMgd2hpY2ggYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgJFNlbGYtPntGaWVsZE1ldGhvZHN9ID0gWwogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnRGVzdCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VG9zCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGF0ZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0UHJpb3JpdGllcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNlcnZpY2VzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NMQUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTTEFzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VHlwZXMKICAgICAgICB9LAogICAgXTsKCiAgICAjIGRlcGVuZGFuY2llcyBvZiBzdGFuZGFyZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIHZpYSBBQ0xzCiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7CiAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgU0xBSUQgICAgID0+IDEsCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLCAgICAjQ3VzdG9tZXJVc2VyIHVwZGF0ZXMgY2FuIGJlIHN1Ym1pdHRlZCBhcyBFbGVtZW50Q2hhbmdlZDogU2VydmljZUlECiAgICAgICAgfSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgfTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBQQVJBTU5BTUU6CiAgICBmb3IgbXkgJEtleSAoQFBhcmFtTmFtZXMpIHsKCiAgICAgICAgIyBza2lwIHRoZSBBY3Rpb24gcGFyYW1ldGVyLCBpdCdzIGdpdmluZyBCdWlsZERhdGVTZWxlY3Rpb24gcHJvYmxlbXMgZm9yIHNvbWUgcmVhc29uCiAgICAgICAgbmV4dCBQQVJBTU5BTUUgaWYgJEtleSBlcSAnQWN0aW9uJzsKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwoKICAgICAgICBteSAlU2FmZUdldFBhcmFtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgIE5vQXBwbGV0ICAgICA9PiAxLAogICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgICAgIE5vU1ZHICAgICAgICA9PiAxLAogICAgICAgICAgICBOb0ltZyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9JbnRTcmNMb2FkID0+IDEsCiAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAxLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkU2FmZUdldFBhcmFte1N0cmluZ307CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgaGFzaCBmb3IgY2hlY2sgZHVwbGljYXRlZCBlbnRyaWVzCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgRnJvbS1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyID0gJEdldFBhcmFteydDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXInfSB8fCAwOwogICAgIyBDb250YWlucyB1c2VyIG5hbWUKICAgIG15ICRTZWxlY3RlZCA9ICRHZXRQYXJhbXsnQ3VzdG9tZXJTZWxlY3RlZCd9IHx8ICcnOwoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDAgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgID0gJEdldFBhcmFteydDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudH07CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gJFNlbGVjdGVkID09ICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkR2V0UGFyYW17J0N1c3RvbWVyS2V5XycgLiAkQ291bnR9IHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0Zyb219ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudCkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCIpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICBteSAlUGVybWlzc2lvbkxldmVsID0gKAogICAgICAgICdybycgICAgICAgID0+IDEsCiAgICAgICAgJ21vdmVfaW50bycgPT4gMiwKICAgICAgICAnY3JlYXRlJyAgICA9PiAzLAogICAgICAgICdub3RlJyAgICAgID0+IDQsCiAgICAgICAgJ293bmVyJyAgICAgPT4gNSwKICAgICAgICAncHJpb3JpdHknICA9PiA2LAogICAgICAgICdydycgICAgICAgID0+IDcsCiAgICApOwoKICAgIG15ICRQZXJtaXNzaW9ucyA9ICdydyc7CgojUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9yIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiNFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjawogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCBtYXNrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdE1hc2snICkgewoKICAgICAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgICAgICk7CiAgICAgICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICApOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBzZWxlY3QgYm94CiAgICAgICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIH0KICAgICAgICB9IEBDYWxlbmRhcnM7CgogICAgICAgICMgdHJhbnNmb3JtIGRhdGEgZm9yIElEIGxvb2t1cAogICAgICAgIG15ICVDYWxlbmRhckxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57Q2FsZW5kYXJJRH0gPT4gJF8tPntDYWxlbmRhck5hbWV9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJEYXRhKSB7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgIG15ICRDYWxlbmRhclBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57S2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRDYWxlbmRhclBlcm1pc3Npb259IDwgMyApIHsKCiAgICAgICAgICAgICAgICAjIHBlcm1pc3Npb25zIDwgY3JlYXRlCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICBteSAoICVZZWFyUGVyaW9kUGFzdCwgJVllYXJQZXJpb2RGdXR1cmUgKTsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyAoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gNTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IHVzZSBkYXRlIHNlbGVjdGlvbiB0aW1lIHpvbmUgY2FsY3VsYXRpb24gYnkgZGVmYXVsdAogICAgICAgIG15ICRPdmVycmlkZVRpbWVab25lID0gMTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50OwogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5vbi1leGlzdGVudCBhcHBvaW50bWVudAogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVzZSB0aW1lIHpvbmUgY2FsY3VsYXRpb24gaWYgZWRpdGluZyBleGlzdGluZyBhcHBvaW50bWVudHMKICAgICAgICAgICAgIyBidXQgb25seSBpZiBub3QgZGVhbGluZyB3aXRoIGFuIGFsbCBkYXkgYXBwb2ludG1lbnQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3ZlcnJpZGVUaW1lWm9uZSA9ICRBcHBvaW50bWVudHtBbGxEYXl9IHx8IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgJFBlcm1pc3Npb25zID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgc3RhcnQgdGltZSBjb21wb25lbnRzLgogICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lU2V0dGluZ3MgPSAkU3RhcnRUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZUNvbXBvbmVudHM7CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFN0YXJ0VGltZVNldHRpbmdzfSApIHsKICAgICAgICAgICAgICAgICRTdGFydFRpbWVDb21wb25lbnRzLT57IlN0YXJ0JEtleSJ9ID0gJFN0YXJ0VGltZVNldHRpbmdzLT57JEtleX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGVuZCB0aW1lIGNvbXBvbmVudHMuCiAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWVPYmplY3QgPCAkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEVuZFRpbWVTZXR0aW5ncyA9ICRFbmRUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVDb21wb25lbnRzOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRFbmRUaW1lU2V0dGluZ3N9ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVDb21wb25lbnRzLT57IkVuZCRLZXkifSA9ICRFbmRUaW1lU2V0dGluZ3MtPnskS2V5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gKCAlQXBwb2ludG1lbnQsICV7JFN0YXJ0VGltZUNvbXBvbmVudHN9LCAleyRFbmRUaW1lQ29tcG9uZW50c30gKTsKCiAgICAgICAgICAgICMgR2V0IHJlY3VycmVuY2UgdW50aWwgY29tcG9uZW50cy4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU2V0dGluZ3MgPSAkUmVjdXJyZW5jZVVudGlsVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsQ29tcG9uZW50czsKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEVuZFRpbWVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbENvbXBvbmVudHMtPnsiUmVjdXJyZW5jZVVudGlsJEtleSJ9ID0gJFJlY3VycmVuY2VVbnRpbFNldHRpbmdzLT57JEtleX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gKCAlQXBwb2ludG1lbnQsICV7JFJlY3VycmVuY2VVbnRpbENvbXBvbmVudHN9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgeWVhciBib3VuZGFyaWVzIGZvciBidWlsZCBzZWxlY3Rpb24gbWV0aG9kLgogICAgICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgICAgICBteSAkRGF0ZVRpbWVTZXR0aW5ncyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydCBFbmQgUmVjdXJyZW5jZVVudGlsKSkgewogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7IiR7RmllbGR9WWVhciJ9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREaWZmID0gJEFwcG9pbnRtZW50eyIke0ZpZWxkfVllYXIifSAtICREYXRlVGltZVNldHRpbmdzLT57WWVhcn07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlmZiA+IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IGFicyAkRGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGlmZiA8IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17RGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJEdldFBhcmFte0RheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheSAoQERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ICs9ICREYXlPZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSA4ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtEYXlzfSA9IGpvaW4oICIsIiwgQERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoRGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkR2V0UGFyYW17TW9udGhEYXlzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1vbnRoRGF5IChATW9udGhEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ICs9ICREYXlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0ZVRpbWVTZXR0aW5ncy0+e0RheX0gPT0gMzIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNb250aERheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9ID0gam9pbiggIiwiLCBATW9udGhEYXlzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoc30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkR2V0UGFyYW17TW9udGhzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aHMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSBqb2luKCAiLCIsIEBNb250aHMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudC4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldElEfSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgR2V0IGRhdGUgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUnVsZS0+eyRUeXBlfSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnUGVuZGluZ1RpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seVN0YXJ0fSAgICA9IDEgaWYgJFR5cGUgZXEgJ1N0YXJ0RGF0ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlEdXJhdGlvbn0gPSAxIGlmICRUeXBlIGVxICdFbmREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlLT57JFR5cGV9ID1+IC9eUGx1c19bMC05XSskLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlbGVjdGVkIHRpbWVzdGFtcAogICAgICAgIG15ICRTZWxlY3RlZFRpbWVzdGFtcCA9IHNwcmludGYoCiAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICApOwoKICAgICAgICAjIEdldCBjdXJyZW50IGRhdGUgY29tcG9uZW50cy4KICAgICAgICBteSAkU2VsZWN0ZWRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNlbGVjdGVkVGltZXN0YW1wLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJFNlbGVjdGVkU3lzdGVtVGltZVNldHRpbmdzID0gJFNlbGVjdGVkU3lzdGVtVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICMgU2V0IGN1cnJlbnQgZGF0ZSBjb21wb25lbnRzIGlmIG5vdCBkZWZpbmVkLgogICAgICAgICRBcHBvaW50bWVudHtEYXlzfSAgICAgIC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntEYXlPZldlZWt9OwogICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9IC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntEYXl9OwogICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ICAgIC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntNb250aH07CgogICAgICAgICMgY2FsZW5kYXIgSUQgc2VsZWN0aW9uCiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gLy8gJEdldFBhcmFte0NhbGVuZGFySUR9OwoKICAgICAgICAjIGNhbGVuZGFyIG5hbWUKICAgICAgICBpZiAoJENhbGVuZGFySUQpIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyTmFtZX0gPSAkQ2FsZW5kYXJMb29rdXB7JENhbGVuZGFySUR9OwogICAgICAgIH0KCiAgICAgICAgIyBjYWxlbmRhciBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Q2FsZW5kYXJJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFsbCBkYXkKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9IHx8CiAgICAgICAgICAgICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICYmICRBcHBvaW50bWVudHtBbGxEYXl9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0FsbERheVN0cmluZ30gID0gVHJhbnNsYXRhYmxlKCdZZXMnKTsKICAgICAgICAgICAgJFBhcmFte0FsbERheUNoZWNrZWR9ID0gJ2NoZWNrZWQgJzsKCiAgICAgICAgICAgICMgc3RhcnQgZGF0ZQogICAgICAgICAgICAkUGFyYW17U3RhcnREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydERheX0gICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBlbmQgZGF0ZQogICAgICAgICAgICAkUGFyYW17RW5kRGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRZZWFyfSAgLy8gJEdldFBhcmFte0VuZFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1vbnRofSAvLyAkR2V0UGFyYW17RW5kTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZERheX0gICAvLyAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlTdHJpbmd9ICA9IFRyYW5zbGF0YWJsZSgnTm8nKTsKICAgICAgICAgICAgJFBhcmFte0FsbERheUNoZWNrZWR9ID0gJyc7CgogICAgICAgICAgICAjIHN0YXJ0IGRhdGUKICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9ICAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSAvLyAkR2V0UGFyYW17U3RhcnRNaW51dGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBlbmQgZGF0ZQogICAgICAgICAgICAkUGFyYW17RW5kRGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kWWVhcn0gICAvLyAkR2V0UGFyYW17RW5kWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9ICAvLyAkR2V0UGFyYW17RW5kTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZERheX0gICAgLy8gJEdldFBhcmFte0VuZERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kSG91cn0gICAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTWludXRlfSAvLyAkR2V0UGFyYW17RW5kTWludXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgZGF0ZSBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhcnREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBTdGFydEhvdXIgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgU3RhcnRNaW51dGUgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0+ICdFbmQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSAmJiAkR2V0UGFyYW17UmVhZE9ubHlTdGFydH0gPyAwIDogMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGVuZCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtFbmREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdFbmQnLAogICAgICAgICAgICBFbmRIb3VyICAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kSG91cn0gICAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgIEVuZE1pbnV0ZSAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ID0+ICdTdGFydCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gJiYgJEdldFBhcmFte1JlYWRPbmx5RHVyYXRpb259ID8gMCA6IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtFbmR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtFbmR9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYWluIG9iamVjdAogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICBteSAkVGVhbUlEcyA9ICRBcHBvaW50bWVudHtUZWFtSUR9OwogICAgICAgICAgICBpZiAoICEkVGVhbUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgICAgICAgICAgJFRlYW1JRHMgPSBcQFRlYW1JRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZXNvdXJjZUlEcyA9ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfTsKICAgICAgICAgICAgaWYgKCAhJFJlc291cmNlSURzICkgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgICAgICRSZXNvdXJjZUlEcyA9IFxAUmVzb3VyY2VJRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgZ2V0IGFsbG93ZWQgdGVhbSBsaXN0IGZvciBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPkFsbG93ZWRUZWFtTGlzdCgKICAgICAgICAgICAgICAgIFByZXZlbnRFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGVhbSBuYW1lcwogICAgICAgICAgICBteSBAVGVhbU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkVGVhbUxpc3R7JFRlYW1JRH0gaWYgJFRlYW1MaXN0eyRUZWFtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBUZWFtTmFtZXMgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VGVhbU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSAkU2VsZi0+e0VtcHR5U3RyaW5nfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0ZWFtIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtUZWFtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVGVhbUxpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlYW1JRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlYW1JRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggc2VsZWN0ZWQgdGVhbXMKICAgICAgICAgICAgbXkgJVRlYW1Vc2VyTGlzdEFsbDsKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzb3VyY2UgbmFtZXMKICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7JFJlc291cmNlSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9IGlmICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBSZXNvdXJjZU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gam9pbiggJzxicj4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSB1c2VyIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVzb3VyY2VJRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc291cmNlSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gMDsKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSA9ICdDdXN0b21EYWlseSc7ICAgICMgZGVmYXVsdAoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBmcm9tIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwogICAgICAgICAgICBpZiAoICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID1+IC9DdXN0b20vICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZTsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gJ0N1c3RvbSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdOZXZlcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBEYXknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1dlZWtseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFdlZWsnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBNb250aCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgWWVhcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlVHlwZXM7CiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZUxvb2t1cHskU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIHR5cGUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBSZWN1cnJlbmNlVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlVHlwZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0RhaWx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrbHknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbU1vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aGx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21ZZWFybHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZWFybHknKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVSZWN1cnJlbmNlQ3VzdG9tVHlwZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFJlY3VycmVuY2VDdXN0b21UeXBlczsKICAgICAgICBteSAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgIGxjICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICApIGlmICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJzsKCiAgICAgICAgIyByZWN1cnJlbmNlIGN1c3RvbSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQFJlY3VycmVuY2VDdXN0b21UeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjdXJyZW5jZUN1c3RvbVR5cGUnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBpbnRlcnZhbAogICAgICAgIG15ICRTZWxlY3RlZEludGVydmFsID0gJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgMTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICkgewogICAgICAgICAgICBteSAlUmVjdXJyZW5jZUludGVydmFsTG9va3VwID0gKAogICAgICAgICAgICAgICAgJ0N1c3RvbURhaWx5JyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2RheShzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVdlZWtseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd3ZWVrKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnQ3VzdG9tTW9udGhseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdtb250aChzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVllYXJseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd5ZWFyKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZXZlcnknKQogICAgICAgICAgICAgICAgICAgIC4gJyAnIC4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRSZWN1cnJlbmNlSW50ZXJ2YWxMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbnRlcnZhbCBzZWxlY3Rpb24gKDEtMzEpCiAgICAgICAgbXkgQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbDsKICAgICAgICBmb3IgKCBteSAkRGF5TnVtYmVyID0gMTsgJERheU51bWJlciA8IDMyOyAkRGF5TnVtYmVyKysgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbCwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJERheU51bWJlciwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkSW50ZXJ2YWwsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VJbnRlcnZhbCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0CiAgICAgICAgbXkgJFJlY3VycmVuY2VMaW1pdCA9IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdCA9IDI7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcyB0aW1lKHMpJywgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgbGltaXQgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VMaW1pdFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ3VudGlsIC4uLicpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnZm9yIC4uLiB0aW1lKHMpJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlY3VycmVuY2VMaW1pdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlTGltaXQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAwOwogICAgICAgIGlmICggISRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAgICAgIyBHZXQgY3VycmVudCBhbmQgc3RhcnQgdGltZSBmb3IgZGlmZmVyZW5jZS4KICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgICAgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJFN0YXJ0VGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gJFN0YXJ0VGltZSAtICRTeXN0ZW1UaW1lICsgNjAgKiA2MCAqIDI0ICogMzsgICAgIyBzdGFydCArMyBkYXlzCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxEYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd1bnRpbCAlcycsICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIHVudGlsIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICA9PiAnUmVjdXJyZW5jZVVudGlsJywKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgICAgID0+ICRSZWN1cnJlbmNlVW50aWxEaWZmVGltZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvblRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBub3RpZmljYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uVGVtcGxhdGVzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvblRlbXBsYXRlfSB8fCAnMCc7CiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSA9ICROb3RpZmljYXRpb25UZW1wbGF0ZUxvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgbm90aWZpY2F0aW9uIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25UZW1wbGF0ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cwogICAgICAgIG15IEBOb3RpZmljYXRpb25DdXN0b21Vbml0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGUocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnaG91cihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnZGF5cycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2RheShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0czsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0ID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0gfHwgJ21pbnV0ZXMnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVVuaXRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICB8fCAnYmVmb3Jlc3RhcnQnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRXh0cmFjdCB0aGUgZGF0ZSB1bml0cyBmb3IgdGhlIGN1c3RvbSBkYXRlIHNlbGVjdGlvbi4KICAgICAgICBteSAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9IHt9OwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApIHsKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVNldHRpbmdzID0gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIgICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e1llYXJ9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e01vbnRofSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkgICAgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntEYXl9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIgICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e0hvdXJ9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZSA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e01pbnV0ZX0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7U3RhcnR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSByYWRpbyBidXR0b24gZm9yIGN1c3RvbSBkYXRlIHRpbWUgYW5kIHJlbGF0aXZlIGlucHV0CiAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gfHw9ICcnOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQgJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkICc7CiAgICAgICAgfQoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gc3RyaW5nIHZhbHVlCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSB8fD0gMDsKICAgICAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJwogICAgICAgICAgICAgICAgICAgIC4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdExvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lTG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBteSAlRnV0dXJlVGFzazsKICAgICAgICBpZiAoICVBcHBvaW50bWVudCApIHsKICAgICAgICAgICAgbXkgJFRhc2tJRDsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICRUYXNrSUQgPSAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIE9ubHkgZm9yIHBhcmVudCBhcHBvaW50bWVudHMKICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgICMgQ2hlY2sgYWxsIGFwcG9pbnRtZW50cyBvZiBzZXJpZXMgZm9yIGZ1dHVyZSB0YXNrIGlkCiAgICAgICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICB1bnNoaWZ0IEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICAgICAgQVBQT0lOVE1FTlRMSVNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWN1cnJpbmdBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmluZ0FwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlRMSVNUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRUYXNrSUQgKSB7CiAgICAgICAgICAgICAgICAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgdGlja2V0IHRlbXBsYXRlCiAgICAgICAgbXkgQFRpY2tldFRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyB0aWNrZXQgY3JlYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVRpY2tldFRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBAVGlja2V0VGVtcGxhdGVzOwoKICAgICAgICBteSAkU2VsZWN0ZWRUaWNrZXRUZW1wbGF0ZSA9IGRlZmluZWQgJEZ1dHVyZVRhc2t7RGF0YX0gPyAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSA6ICcwJzsKICAgICAgICAkUGFyYW17VGlja2V0VmFsdWV9ID0gJFRpY2tldFRlbXBsYXRlTG9va3VweyRTZWxlY3RlZFRpY2tldFRlbXBsYXRlfTsKCiAgICAgICAgIyB0aWNrZXQgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1RpY2tldFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFRpY2tldFRlbXBsYXRlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldFRlbXBsYXRlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldFRlbXBsYXRlJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgY3VzdG9tIHVuaXRzCiAgICAgICAgbXkgQFRpY2tldEN1c3RvbVVuaXRzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ21pbnV0ZShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnaG91cnMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdob3VyKHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdkYXlzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZGF5KHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlVGlja2V0Q3VzdG9tVW5pdExvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFRpY2tldEN1c3RvbVVuaXRzOwogICAgICAgIG15ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXQgPSAoICRGdXR1cmVUYXNre0RhdGF9ID8gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9IDogJycgKSB8fCAnbWludXRlcyc7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tVW5pdHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBUaWNrZXRDdXN0b21Vbml0cywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgY3VzdG9tIHVuaXRzIHBvaW50IG9mIHRpbWUKICAgICAgICBteSBAVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFRpY2tldEN1c3RvbVVuaXRzUG9pbnRPZlRpbWU7CiAgICAgICAgbXkgJFNlbGVjdGVkVGlja2V0Q3VzdG9tVW5pdFBvaW50T2ZUaW1lID0gKCAkRnV0dXJlVGFza3tEYXRhfSA/ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gOiAnJyApCiAgICAgICAgICAgIHx8ICdiZWZvcmVzdGFydCc7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBFeHRyYWN0IHRoZSBkYXRlIHVuaXRzIGZvciB0aGUgY3VzdG9tIGRhdGUgc2VsZWN0aW9uLgogICAgICAgIG15ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzID0ge307CiAgICAgICAgaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEN1c3RvbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9ICRUaWNrZXRDdXN0b21EYXRlVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgfQoKICAgICAgICAjIHRpY2tldCBjdXN0b20gZGF0ZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpY2tldEN1c3RvbURhdGVUaW1lJywKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVZZWFyICAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntZZWFyfSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVNb250aCAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNb250aH0sCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lRGF5ICAgID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57RGF5fSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVIb3VyICAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntIb3VyfSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1N0YXJ0fSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgcmFkaW8gYnV0dG9uIGZvciBjdXN0b20gZGF0ZSB0aW1lIGFuZCByZWxhdGl2ZSBpbnB1dAogICAgICAgIGlmICggJEZ1dHVyZVRhc2t7RGF0YX0gKSB7CiAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSB8fD0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGdXR1cmVUYXNre0RhdGF9ICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dFJhZGlvfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZ1dHVyZVRhc2t7RGF0YX0gJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgdGlja2V0IGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRGdXR1cmVUYXNre0RhdGF9ICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17VGlja2V0VmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9CiAgICAgICAgICAgICAgICAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldFZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0Q3VzdG9tVW5pdExvb2t1cHskU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0Q3VzdG9tVW5pdFBvaW50T2ZUaW1lTG9va3VweyRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICAjIGdldCBwbHVnaW4gbGlzdAogICAgICAgICRQYXJhbXtQbHVnaW5MaXN0fSA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCiAgICAgICAgIyBuZXcgYXBwb2ludG1lbnQgcGx1Z2luIHNlYXJjaAogICAgICAgIGlmICggJEdldFBhcmFte1BsdWdpbktleX0gJiYgKCAkR2V0UGFyYW17U2VhcmNofSB8fCAkR2V0UGFyYW17T2JqZWN0SUR9ICkgKSB7CgogICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkR2V0UGFyYW17UGx1Z2luS2V5fSB9IGtleXMgJXsgJFBhcmFte1BsdWdpbkxpc3R9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWFyY2ggdXNpbmcgcGx1Z2luCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gPSBbXTsKICAgICAgICAgICAgICAgIG15IEBMaW5rQXJyYXkgPSBzb3J0IGtleXMgJXskUmVzdWx0TGlzdH07CgogICAgICAgICAgICAgICAgIyBhZGQgcG9zc2libGUgbGlua3MKICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEIChATGlua0FycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtJRCAgID0+ICRMaW5rSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtOYW1lID0+ICRSZXN1bHRMaXN0LT57JExpbmtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtVUkwgID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpblVSTH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGlua0lECiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZWRpdCBhcHBvaW50bWVudCBwbHVnaW4gbGlua3MKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgICAgIGZvciBteSAkUGx1Z2luS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewogICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15IEBMaW5rQXJyYXk7CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkRhdGF9LT57JFBsdWdpbktleX0gPSBbXTsKICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9IH0sICRMaW5rTGlzdC0+eyRMaW5rSUR9OwogICAgICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5MaXN0fS0+eyRQbHVnaW5LZXl9LT57TGlua0xpc3R9ID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxATGlua0FycmF5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAojICAgICAgICAgIyBodG1sIG1hc2sgb3V0cHV0CiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdFZGl0TWFzaycsCiMgICAgICAgICAgICAgRGF0YSA9PiB7CiMgICAgICAgICAgICAgICAgICVQYXJhbSwKIyAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAojICAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQsCiMgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbCA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICk7CgogICAgICAgICMgQnVpbGQgdGlja2V0IGZpZWxkcwogICAgICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgRmV0Y2ggZHluYW1pYyBmaWVsZCBjb25maWdzCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZENvbmZpZ3M7CiAgICAgICAgaWYgKCBkZWZpbmVkICRDb25maWctPntEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICBARHluYW1pY0ZpZWxkQ29uZmlncyA9IGRlZmluZWQgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPyBAeyAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiB9IDogKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtEZXN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEdldFBhcmFte0Rlc3R9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICVGdXR1cmVUYXNrICkgewogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1F1ZXVlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTdGF0ZUlEfTsKICAgICAgICAgICAgJEdldFBhcmFte1R5cGVJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1R5cGVJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZXJ2aWNlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17U0xBSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTTEFJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWV9ID0gIiRHZXRQYXJhbXtUaWNrZXRRdWV1ZUlEfXx8JFVzZXJEZWZhdWx0UXVldWUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBEeW5hbWljRmllbGRDb25maWdzICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0IHdpdGggYXBwcm9hY2ggZm9yIGFycmF5CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4geyAkRHluYW1pY0ZpZWxkQ29uZmlnLT4lKiwgTmFtZSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnW10nIH0sCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQER5bmFtaWNGaWVsZENvbmZpZ3MgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgIyB0byBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gZGF0YWJhc2UgKG9yIHVuZGVmaW5lZCkKICAgICAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgYSB1c2VyIHNwZWNpZmljIGRlZmF1bHQgdmFsdWUgZm9yCiAgICAgICAgICAgICMgdGhlIGR5bmFtaWMgZmllbGQsIG90aGVyd2lzZSB3aWxsIHVzZSBEeW5hbWljIEZpZWxkIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICVGdXR1cmVUYXNrICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30tPnskRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfS0+eyREeW5hbWljRmllbGRDb25maWctPntOYW1lfX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUxEYXRhOwogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICQjRHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnc1skaV0gKTsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnc1skaV07CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MRGF0YXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkT3JkZXJ9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEhUTUw7CiAgICAgICAgZm9yIG15ICRLZXkgKHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVEeW5hbWljRmllbGRIVE1MRGF0YSkgewogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRIVE1MLCAkRHluYW1pY0ZpZWxkSFRNTERhdGF7JEtleX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgZnV0dXJlIHRhc2sgZXhpc3RzLCB0cmFuc2Zvcm0gZXhpc3RpbmcgZGF0YSBpbnRvIG5lZWRlIHN0cnVjdHVyZQogICAgICAgIGlmICglRnV0dXJlVGFzaykgewogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU3RyaW5ncyA9IHNwbGl0IC8sLywgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21lclVzZXJ9OwogICAgICAgICAgICBpZiAoIEBDdXN0b21lclVzZXJTdHJpbmdzICkgewogICAgICAgICAgICAgICAgbXkgJENvdW50ID0gMTsKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyU3RyaW5nICggQEN1c3RvbWVyVXNlclN0cmluZ3MgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlclN0cmluZywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJUN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgPT4gJENvdW50KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgPT4gJyInIC4gJEN1c3RvbWVyVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSAuICciIDwnIC4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9IC4gJz4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAoICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9IGVxICRDdXN0b21lclVzZXJTdHJpbmcgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCA9PiAkQ291bnQrKywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCA9PiAkQ3VzdG9tZXJVc2VyU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAoICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9IGVxICRDdXN0b21lclVzZXJTdHJpbmcgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycnJvck1zZyA9PiAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZWxlY3RlZEN1c3RvbWVyVXNlcn07CiAgICAgICAgfQoKCiAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgIG15ICRRdWV1ZVZhbHVlcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFByaW9yaXR5VmFsdWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN0YXRlVmFsdWVzID0gJFNlbGYtPl9HZXRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZVZhbHVlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkU2VydmljZVZhbHVlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkU0xBVmFsdWVzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBCdWlsZCBxdWV1ZSBodG1sIHN0cmluZwogICAgICAgIG15ICRRdWV1ZUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICRRdWV1ZUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdNYW5kYXRvcnkgVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+ICRRdWV1ZVZhbHVlcywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgPT4gMCwKICAgICAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFF1ZXVlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ01hbmRhdG9yeSBWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJFF1ZXVlVmFsdWVzLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICAgICAgbXkgJFR5cGVIVE1MU3RyaW5nOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAgICAgJFR5cGVIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFR5cGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RhdGUgc3RyaW5nCiAgICAgICAgbXkgJFN0YXRlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhdGVWYWx1ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSB8fCAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYW5kYXRvcnkgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlcnZpY2UgYW5kIFNMQSBzdHJpbmcKICAgICAgICBteSAkU2VydmljZUhUTUxTdHJpbmc7CiAgICAgICAgbXkgJFNMQUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICAgICAkU2VydmljZUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSURJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlVmFsdWVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNMQUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBVmFsdWVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgoKCiAgICAgICAgIyBnZXQgcHJpb3JpdHkgZGF0YQogICAgICAgIGlmICggISRHZXRQYXJhbXtQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eX0gPSAkQ29uZmlnLT57UHJpb3JpdHl9OwogICAgICAgIH0KICAgICAgICBpZiAoICVGdXR1cmVUYXNrICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1ByaW9yaXR5SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBwcmlvcml0eSBodG1sIHN0cmluZwogICAgICAgIG15ICRQcmlvcml0eUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUHJpb3JpdHlWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICQjTXVsdGlwbGVDdXN0b21lciAhPSAtMSA/ICcnIDogJ0hpZGRlbic7CiAgICAgICAgJFBhcmFte0FydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gKCRQYXJhbXtUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSB8fCAoICVGdXR1cmVUYXNrICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0pKSA/ICdjaGVja2VkPWNoZWNrZWQnIDogJyc7CgogICAgICAgIGlmICggJUZ1dHVyZVRhc2sgKSB7CiAgICAgICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEZ1dHVyZVRhc2t7RGF0YX0gfHwgXHt9fSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwgPT4gJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9LAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSFRNTFN0cmluZyA9PiAkUXVldWVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SFRNTFN0cmluZyA9PiAkUHJpb3JpdHlIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFR5cGVIVE1MU3RyaW5nID0+ICRUeXBlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTdGF0ZUhUTUxTdHJpbmcgPT4gJFN0YXRlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSFRNTFN0cmluZyA9PiAkU2VydmljZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICAgICBTTEFIVE1MU3RyaW5nID0+ICRTTEFIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNMQU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgPT4gXEBEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbCA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiAgICAgICAgICAgICAgICAgICAgUXVldWVIVE1MU3RyaW5nID0+ICRRdWV1ZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlIVE1MU3RyaW5nID0+ICRQcmlvcml0eUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUhUTUxTdHJpbmcgPT4gJFR5cGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSFRNTFN0cmluZyA9PiAkU3RhdGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIVE1MU3RyaW5nID0+ICRTZXJ2aWNlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgIFNMQUhUTUxTdHJpbmcgPT4gJFNMQUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcQER5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgICAgICBpZiAoIEBNdWx0aXBsZUN1c3RvbWVyICkgewogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBATXVsdGlwbGVDdXN0b21lciApIHsKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICAgICAgfSwKICAgICAgICApOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFZGl0QXBwb2ludG1lbnRJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSAvLyAnJywKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VkaXRQYXJlbnRJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gLy8gJycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcmVnaXN0ZXJlZCBsb2NhdGlvbiBsaW5rcwogICAgICAgIG15ICRMb2NhdGlvbkxpbmtDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50QXBwb2ludG1lbnRFZGl0OjpMb2NhdGlvbjo6TGluaycpIC8vIHt9OwogICAgICAgIGZvciBteSAkQ29uZmlnS2V5ICggc29ydCBrZXlzICV7JExvY2F0aW9uTGlua0NvbmZpZ30gKSB7CgogICAgICAgICAgICAjIHNob3cgbGluayBpY29uCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYXRpb25MaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uID0+ICRBcHBvaW50bWVudHtMb2NhdGlvbn0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgJXsgJExvY2F0aW9uTGlua0NvbmZpZy0+eyRDb25maWdLZXl9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFKQVggPT4gMSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZC9lZGl0IGFwcG9pbnRtZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdEFwcG9pbnRtZW50JyApIHsKCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIGlmICgkR2V0UGFyYW17VGlja2V0VGVtcGxhdGV9KSB7CiAgICAgICAgICAgICMgVmFsaWRhdGUgaW5jb21pbmcgdmFsdWVzCiAgICAgICAgICAgIG15ICRRdWV1ZVZhbHVlcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUXVldWVWYWx1ZXMtPnskR2V0UGFyYW17RGVzdH19ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0IScgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3RhdGVWYWx1ZXMgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN0YXRlVmFsdWVzLT57JEdldFBhcmFte05leHRTdGF0ZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIG5leHQgc3RhdGUhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU2VydmljZVZhbHVlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAoJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9KSAmJiAhJFNlcnZpY2VWYWx1ZXMtPnskR2V0UGFyYW17U2VydmljZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU0xBVmFsdWVzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgKCRHZXRQYXJhbXtTTEFJRH0gfHwgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0pICYmICEkU0xBVmFsdWVzLT57JEdldFBhcmFte1NMQUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIFNMQSEnICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRUeXBlVmFsdWVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICAhJFR5cGVWYWx1ZXMtPnskR2V0UGFyYW17VHlwZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUHJpb3JpdHlWYWx1ZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRQcmlvcml0eVZhbHVlcy0+eyRHZXRQYXJhbXtQcmlvcml0eUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHByaW9yaXR5IScgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBBcHBvaW50bWVudFRpY2tldAoKICAgICAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgICRQZXJtaXNzaW9ucyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRSZXF1aXJlZFBlcm1pc3Npb24gPSAyOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDYWxlbmRhcklEfSAmJiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gIT0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9ICkgewoKICAgICAgICAgICAgICAgICMgaW4gb3JkZXIgdG8gbW92ZSBhcHBvaW50bWVudCB0byBhbm90aGVyIGNhbGVuZGFyLCB1c2VyIG5lZWRzICJjcmVhdGUiIHBlcm1pc3Npb24KICAgICAgICAgICAgICAgICRSZXF1aXJlZFBlcm1pc3Npb24gPSAzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSA8ICRSZXF1aXJlZFBlcm1pc3Npb24gKSB7CgogICAgICAgICAgICAgICAgIyBubyBwZXJtaXNzaW9uCgogICAgICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICAgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte0FsbERheX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRZZWFyfSwgJEdldFBhcmFte1N0YXJ0TW9udGh9LCAkR2V0UGFyYW17U3RhcnREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgIGlmICggJEVuZFRpbWVPYmplY3QgPCAkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QgPSAkU3RhcnRUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE1ha2UgZW5kIHRpbWUgaW5jbHVzaXZlLCBhZGQgd2hvbGUgZGF5LgogICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMuCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ0VuZFRpbWUnICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJFN0YXJ0VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17RW5kWWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1vbnRofQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kSG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRIb3VyfSwgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDb252ZXJ0IGVuZCB0aW1lIHRvIGxvY2FsIHRpbWUuCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgYWxyZWFkeSBjYWxjdWxhdGVkIGxvY2FsIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQXBwb2ludG1lbnR7RW5kVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gJiYgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbE9iamVjdCA8ICRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgIGlmICggJEdldFBhcmFte1JlY3VycmluZ30gJiYgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSApIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tJyApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBEYXlzID0gc3BsaXQgLywvLCAkR2V0UGFyYW17RGF5c307CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxARGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheU9mV2Vla30gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCAvLC8sICRHZXRQYXJhbXtNb250aERheXN9OwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheX0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TW9udGhzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRocyA9IHNwbGl0IC8sLywgJEdldFBhcmFte01vbnRoc307CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxATW9udGhzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZVNldHRpbmdzID0gJFN0YXJ0VGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFsgJFN0YXJ0VGltZVNldHRpbmdzLT57TW9udGh9IF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gPSAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVudGlsIC4uLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUxpbWl0fSBlcSAnMScKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxZZWFyfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbE1vbnRofQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9LCAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxEYXl9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZVVudGlsT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlQ291bnR9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VMaW1pdH0gZXEgJzInICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgbm90aWZpY2F0aW9uIGN1c3RvbSB0eXBlLCBpZiBzdXBwbGllZC4KICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ2RhdGV0aW1lJzsKCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVpvbmUgPT4gJFNlbGYtPntVc2VyVGltZVpvbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIG15ICVGdXR1cmVUYXNrOwogICAgICAgIGlmICggJUFwcG9pbnRtZW50ICkgewogICAgICAgICAgICBteSAkVGFza0lEOwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgT25seSBmb3IgcGFyZW50IGFwcG9pbnRtZW50cwogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBhbGwgYXBwb2ludG1lbnRzIG9mIHNlcmllcyBmb3IgZnV0dXJlIHRhc2sgaWQKICAgICAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkQXBwb2ludG1lbnR7UGFyZW50SUR9IHx8ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICAgICAgQVBQT0lOVE1FTlRMSVNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWN1cnJpbmdBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmluZ0FwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlRMSVNUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRUYXNrSUQgKSB7CiAgICAgICAgICAgICAgICAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ29uZmlnczsKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gJiYgZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWY9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICBARHluYW1pY0ZpZWxkQ29uZmlncyA9IGRlZmluZWQgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPyBAeyAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiB9IDogKCk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFZhbGlkYXRlIGR5bmFtaWMgZmllbGQgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSA/ICRQb3NzaWJsZVZhbHVlcyA6IHVuZGVmLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgIHx8IChyZWYoJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0pIGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9KSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3Qgd2l0aCBhcHByb2FjaCBmb3IgYXJyYXkKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiB7ICREeW5hbWljRmllbGRDb25maWctPiUqLCBOYW1lID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdbXScgfSwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRDb25maWctPntOYW1lfX0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWU9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBQYXJzZSBwb3NzaWJseSBtdWx0aXBsZSBjdXN0b21lciB1c2VycwogICAgICAgIGlmICggQE11bHRpcGxlQ3VzdG9tZXIgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyIChATXVsdGlwbGVDdXN0b21lcikgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklkZW50aWZpZXIgPSAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJLZXl9ID8gJEN1c3RvbWVyVXNlci0+e0N1c3RvbWVyS2V5fSA6ICRDdXN0b21lclVzZXItPntDdXN0b21lckVsZW1lbnR9OwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJZGVudGlmaWVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSAuPSAiLCRDdXN0b21lclVzZXJJZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlcklkZW50aWZpZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggY3VzdG9tZXIgaWQgZm9yIHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAlU2VsZWN0ZWRDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJVNlbGVjdGVkQ3VzdG9tZXJVc2VyRGF0YSA/ICRTZWxlY3RlZEN1c3RvbWVyVXNlckRhdGF7Q3VzdG9tZXJJRH0gOiAnJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sICAgICMgYmFzZSBvbiBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBDYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIE1pbnV0ZXMgPT4gJFByZXNldCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRFbmRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyByZXNldCBlbXB0eSBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW19ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwYXNzIGN1cnJlbnQgdXNlciBJRAogICAgICAgICRHZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAjIEdldCBwYXNzZWQgcGx1Z2luIHBhcmFtZXRlcnMuCiAgICAgICAgbXkgQFBsdWdpblBhcmFtcyA9IGdyZXAgeyAkXyA9fiAvXlBsdWdpbl8vIH0ga2V5cyAlR2V0UGFyYW07CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBpZiAoICFAUGx1Z2luUGFyYW1zICkgewogICAgICAgICAgICAjIENvbWluZyBmcm9tIGVpdGhlciBkcmFnIGFuZCBkcm9wIG9yIHJlc2l6ZSwgZmlsbGluZyBwYXJhbXMgd2l0aCBleGlzdGluZyBkYXRhIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRnV0dXJlVGFza0lEOwogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0lEID0gJEFwcG9pbnRtZW50e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9IHx8ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSB8fCAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwogICAgICAgICAgICAgICAgICAgIEFQUE9JTlRNRU5UUkVDVVJSSU5HOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyaW5nQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyaW5nQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UUkVDVVJSSU5HOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEZ1dHVyZVRhc2tJRCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFza0lELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIHRpY2tldCBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpY2tldFRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0gPSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSGFuZGxlIFRpY2tldCBDcmVhdGlvbiBvbiBBcHBvaW50bWVudAogICAgICAgIGlmICgkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9KSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0gPSB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXN0fSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+ICRHZXRQYXJhbXtUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b219LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZEN1c3RvbWVyVXNlciAgICAgID0+ICRHZXRQYXJhbXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiAkR2V0UGFyYW17VGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRzfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICBpZiAoJUFwcG9pbnRtZW50KSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGFsbCByZWxhdGVkIGFwcG9pbnRtZW50cyBiZWZvcmUgdGhlIHVwZGF0ZS4KICAgICAgICAgICAgICAgIG15IEBSZWxhdGVkQXBwb2ludG1lbnRzICA9ICggJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcGFyZW50LCBpbmNsdWRlIGFueSBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJF8tPntQYXJlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJF8tPntQYXJlbnRJRH0gZXEgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBSZW1vdmUgYWxsIGV4aXN0aW5nIGxpbmtzLgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50QXBwb2ludG1lbnRJRCAoQFJlbGF0ZWRBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEN1cnJlbnRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkIGZvciBhcHBvaW50bWVudCAkQ3VycmVudEFwcG9pbnRtZW50SUQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9IDogJFN1Y2Nlc3M7CgogICAgICAgIGlmICgkQXBwb2ludG1lbnRJRCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBmcmVzaCBhcHBvaW50bWVudCBkYXRhLgogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgbXkgQFJlbGF0ZWRBcHBvaW50bWVudHMgID0gKCRBcHBvaW50bWVudElEKTsKICAgICAgICAgICAgICAgIG15IEBDYWxlbmRhckFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYXJlbnQsIGluY2x1ZGUgYW55IGNoaWxkIGFwcG9pbnRtZW50cyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgQUpBWCB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJERlc3QgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgIyBUT0RPIENoZWNrIGhvdyB0aGlzIGlzIHVzZWQgbGF0ZXIgb24gc2luY2UgaW4gY2FzZSBvZiBleHRlcm5hbCBjdXN0b21lciB1c2VyLCBzZWxlY3RlZCBpcyBub3QgaW4gU2VsZWN0ZWRDdXN0b21lciBidXQgaW4gQ3VzdG9tZXJTZWxlY3RlZAogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICAgID0gJyc7CgogICAgICAgICRRdWV1ZUlEID0gJERlc3Q7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAkRWxlbWVudENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICRFbGVtZW50Q2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CgogICAgICAgIG15ICRMb29wUHJvdGVjdGlvbiA9IDEwMDsKICAgICAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gKAogICAgICAgICAgICBWaXNpYmlsaXR5ID0+IHt9LAogICAgICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgICAgICk7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Nlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tUaWNrZXRTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17JFF1ZXVlSUR9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBjdXJyZW50IHNlbGVjdGlvbiBvZiBRdWV1ZUlEIChEZXN0IHdpbGwgYmUgZG9uZSB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17UXVldWVJRH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPntEZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICRJbmRleCAoIHNvcnQga2V5cyAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5bJEluZGV4XTsKCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICA/ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0KICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRJbmRleH17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBkeW5hbWljIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gKSApIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdHJpY3Rpb25zX1Zpc2liaWxpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFKQVggcmV0dXJuIGZvciB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgQFN0ZEZpZWxkQUpBWDsKICAgICAgICBteSAlQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgRGVzdCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFR5cGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgZGVsZXRlICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVzeyRGaWVsZH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXskRmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEF0dHJpYnV0ZXN7JEZpZWxkfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIEBTdGRGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0gQENhbGVuZGFyQXBwb2ludG1lbnRzOwoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIGFsbCBleGlzdGluZyBsaW5rcy4KICAgICAgICAgICAgICAgIGZvciBteSAkQ3VycmVudEFwcG9pbnRtZW50SUQgKEBSZWxhdGVkQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRDdXJyZW50QXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCBmb3IgYXBwb2ludG1lbnQgJEN1cnJlbnRBcHBvaW50bWVudElEISIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yID0gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9ucyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgPT4gJEVycm9yLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVQcmVmZXJlbmNlcycgKSB7CgogICAgICAgIG15ICRTdWNjZXNzID0gMDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59ICYmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gfHwgJEdldFBhcmFte0NhbGVuZGFyU2VsZWN0aW9ufQogICAgICAgICAgICAgICAgfHwgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RlZmF1bHRWaWV3fSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ID0gJ0RlZmF1bHRWaWV3JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdDYWxlbmRhclNlbGVjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgICAgICAgPSAnU2hvd25SZXNvdXJjZXMnOwogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAiLSRHZXRQYXJhbXtUZWFtSUR9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkR2V0UGFyYW17JFByZWZlcmVuY2VLZXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5OwogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gZXEgJ1Nob3duUmVzb3VyY2VzJyAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYmxhbmsgdXNlciBwcmVmZXJlbmNlcwogICAgICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyJyAuICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gLiAkUHJlZmVyZW5jZUtleSAuICRQcmVmZXJlbmNlS2V5U3VmZml4LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVhbSBsaXN0IHNlbGVjdGlvbiB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZWFtVXNlckxpc3QnICkgewogICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CgogICAgICAgICMgQ2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZC4KICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICBURUFNSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGVhbUlEIChAVGVhbUlEcykgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVhbVVzZXJMaXN0ID0+IFwlVGVhbVVzZXJMaXN0QWxsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCnN1YiBfRGF5T2Zmc2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IG9yaWdpbmFsIGRhdGUgY29tcG9uZW50cy4KICAgIG15ICRPcmlnaW5hbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkT3JpZ2luYWxUaW1lU2V0dGluZ3MgPSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5HZXQoKTsKCiAgICAjIEdldCBkZXN0aW5hdGlvbiB0aW1lIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lLgogICAgbXkgJERlc3RpbmF0aW9uVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAkRGVzdGluYXRpb25UaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gKTsKICAgIG15ICREZXN0aW5hdGlvblRpbWVTZXR0aW5ncyA9ICREZXN0aW5hdGlvblRpbWVPYmplY3QtPkdldCgpOwoKICAgICMgQ29tcGFyZSBkYXlzIG9mIHR3byB0aW1lcy4KICAgIGlmICggJE9yaWdpbmFsVGltZVNldHRpbmdzLT57RGF5fSA9PSAkRGVzdGluYXRpb25UaW1lU2V0dGluZ3MtPntEYXl9ICkgewogICAgICAgIHJldHVybiAwOyAgICAjIHNhbWUgZGF5CiAgICB9CiAgICBlbHNpZiAoICRPcmlnaW5hbFRpbWVPYmplY3QgPiAkRGVzdGluYXRpb25UaW1lT2JqZWN0ICkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvczsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdUb3MgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFNlbGVjdGlvblR5cGUgUXVldWUgb3IgU3lzdGVtQWRkcmVzcz8KICAgICAgICBteSAlVG9zOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NRdWV1ZUxpc3QoKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgKTsKICAgICAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVRvcyApIHsKCiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGlmICggISRRdWV1ZURhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBzZXR0aW5nIGN1c3RvbWVyIHVzZXIgaWQKICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkUGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CgogICAgIyBjaGVjayBpZiBubyBDdXN0b21lclVzZXJJRCBpcyBzZWxlY3RlZAogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAwIGxlYXZlIEN1c3RvbWVyVXNlcklEIGVtcHR5LCBpdCB3aWxsIG5vdCBnZXQgYW55IHNlcnZpY2VzCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDEgc2V0IEN1c3RvbWVyVXNlcklEIHRvIGdldCBkZWZhdWx0IHNlcnZpY2VzCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZXMgaWYgdGhleSB3ZXJlIG5vdCBkZXRlcm1pbmVkIGluIGFuIEFKQVggY2FsbAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17U2VydmljZXN9ICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlc30gPSAkU2VsZi0+X0dldFNlcnZpY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCjE7Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentAppointmentEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudEFwcG9pbnRtZW50RWRpdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCI+CiAgICA8Zm9ybSBpZD0iRWRpdEFwcG9pbnRtZW50Rm9ybSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJDaGFsbGVuZ2VUb2tlbiIgbmFtZT0iQ2hhbGxlbmdlVG9rZW4iIHZhbHVlPSJbJSBFbnYoIlVzZXJDaGFsbGVuZ2VUb2tlbiIpIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBY3Rpb24iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlN1YmFjdGlvbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdEFwcG9pbnRtZW50Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkFwcG9pbnRtZW50SUQiIG5hbWU9IkFwcG9pbnRtZW50SUQiIHZhbHVlPSJbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmluZyIgbmFtZT0iUmVjdXJyaW5nIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJpbmcgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VEYXlzIiBuYW1lPSJSZWN1cnJlbmNlRGF5cyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZURheXMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aHMiIG5hbWU9IlJlY3VycmVuY2VNb250aHMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aHMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aERheXMiIG5hbWU9IlJlY3VycmVuY2VNb250aERheXMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aERheXMgfCBodG1sICVdIi8+CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBSkFYQWN0aW9uIiBuYW1lPSJBSkFYQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFzaWMgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpdGxlIlslIElGIERhdGEuUGVybWlzc2lvbkxldmVsID49IDIgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+WyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXTxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIEVORCAlXVslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGl0bGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9wPgpbJSBFTFNFICVdClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGl0bGUiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIG5hbWU9IkRlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxvY2F0aW9uIj5bJSBUcmFuc2xhdGUoIkxvY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTG9jYXRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkxvY2F0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTG9jYXRpb24iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Mb2NhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTG9jYXRpb25MaW5rIEhpZGRlbiBbJSBEYXRhLkNTU0NsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5VUkwgfCBodG1sICVdWyUgRGF0YS5Mb2NhdGlvbiB8IHVyaSAlXSIgZGF0YS1iYXNlLXVybD0iWyUgRGF0YS5VUkwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGV4dCkgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIFslIERhdGEuSWNvbk5hbWUgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJMb2NhdGlvbkxpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIlslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+ClslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIEVORCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXToKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMyAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkNhbGVuZGFySUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJJRFN0cmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIElGIERhdGEuVGVhbUlEU3RyZyAlXQogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRlYW1JRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuVGVhbU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlRlYW1JRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZXNvdXJjZUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZXNvdXJjZU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlSURTdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXJ0RGF5Ij5bJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seVN0YXJ0ICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iU3RhcnREYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlN0YXJ0RGF0ZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGFydERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyaW5nICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJFbmREYXkiPlslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seUR1cmF0aW9uICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRW5kRGF5IiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5FbmREYXRlIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkVuZERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGVTdHJpbmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFsbERheSI+WyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJBbGxEYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5BbGxEYXlTdHJpbmcpIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQWxsRGF5IiBuYW1lPSJBbGxEYXkiIFslIERhdGEuQWxsRGF5Q2hlY2tlZCAlXSAvPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjdXJyZW5jZVR5cGUiPlslIFRyYW5zbGF0ZSgiUmVwZWF0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08L2E+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZWN1cnJlbmNlVHlwZSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuUmVjdXJyZW5jZVZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdClslIElGIERhdGEuUGFyZW50SUQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VUeXBlU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyZXF1ZW5jeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFdmVyeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUludGVydmFsU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlJlY3VycmVuY2VJbnRlcnZhbFRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dERheSBIaWRkZW4iPlslIFRyYW5zbGF0ZSgiZGF5KHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFdlZWsgSGlkZGVuIj5bJSBUcmFuc2xhdGUoIndlZWsocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0TW9udGggSGlkZGVuIj5bJSBUcmFuc2xhdGUoIm1vbnRoKHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFllYXIgSGlkZGVuIj5bJSBUcmFuc2xhdGUoInllYXIocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkRheXMiIG5hbWU9IkRheXMiIHZhbHVlPSJbJSBEYXRhLkRheXMgJV0iIC8+CgojIFdlZWtseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSIxIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNb25kYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlR1ZXNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUdWUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIldlZG5lc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIldlZCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVGh1cnNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaHUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZyaWRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2F0dXJkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTYXQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1bmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1biIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIFdlZWtseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRoRGF5cyIgbmFtZT0iTW9udGhEYXlzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aERheXMgJV0iIC8+CgojIE1vbnRobHkgdGFibGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkJ1dHRvblRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBDb3VudCA9IDEgJV0KWyUgV0hJTEUgQ291bnQgPCAzMiAlXQpbJSBJRiBDb3VudCAlIDcgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBFTkQgJV0KCiMgam9pbiBzdHJpbmdzIChNb250aGx5MSwgTW9udGhseTIsLi4uKQpbJSBNb250aGx5Q291bnQgPSAiTW9udGhseSIgXyBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgQ291bnQgJV0iIHRpdGxlPSJbJSBDb3VudCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBJRiBDb3VudCAlIDcgPT0gMCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgRU5EICVdCgpbJSBDb3VudCA9IENvdW50ICsgMSAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIE1vbnRobHkgdGFibGUgZW5kCgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRocyIgbmFtZT0iTW9udGhzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aHMgJV0iIC8+CgojIFllYXJseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkphbnVhcnkiKSB8IGh0bWwgJV0iIHZhbHVlPSIxIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkphbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBodG1sICVdIiB2YWx1ZT0iMyIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IGh0bWwgJV0iIHZhbHVlPSI0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWF5X2xvbmciKSB8IGh0bWwgJV0iIHZhbHVlPSI1IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJKdW5lIikgfCBodG1sICVdIiB2YWx1ZT0iNiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJKdW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVseSIpIHwgaHRtbCAlXSIgdmFsdWU9IjciID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1Z3VzdCIpIHwgaHRtbCAlXSIgdmFsdWU9IjgiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IGh0bWwgJV0iIHZhbHVlPSI5IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTAiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlY2VtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgWWVhcmx5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VMaW1pdERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VMaW1pdFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZVVudGlsRGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VVbnRpbFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZUNvdW50RGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUmVjdXJyZW5jZUNvdW50IiBuYW1lPSJSZWN1cnJlbmNlQ291bnQiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgoKICAgICAgICAgICAgPGxhYmVsIGZvcj0iTm90aWZpY2F0aW9uVGVtcGxhdGUiPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTm90aWZpY2F0aW9uVGVtcGxhdGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLk5vdGlmaWNhdGlvblZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25TdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYiPgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiPlslIFRyYW5zbGF0ZSgiUmVsYXRpdmUgcG9pbnQgb2YgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiIHZhbHVlPSIiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpbyAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgdmFsdWU9IlslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICA8L2ZpZWxkc2V0PgoKWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBLZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlslIEtleSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1wbHVnaW4tdXJsPSJbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5VUkwgfCBodG1sICVdIiBjbGFzcz0iUGx1Z2luRmllbGQgVzkwcGMiIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIG5hbWU9IlBsdWdpbl9bJSBLZXkgfCBodG1sICVdIiB2YWx1ZT0nWyUgRGF0YS5QbHVnaW5MaXN0LiRLZXkuTGlua0xpc3QgfHwgIltdIiAlXScgLz4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBsdWdpbkRhdGEuJEtleS5zaXplID09IDAgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJSZWFkT25seVZhbHVlIj4tPC9wPgpbJSBFTkQgJV0KWyUgRU5EICVdCiMga2VlcCBmb2xsb3dpbmcgYmxvY2sgb24gYSBzaW5nbGUgbGluZSwgc28gOmVtcHR5IENTUyBzZWxlY3RvciB3b3VsZCB3b3JrIQogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGx1Z2luQ29udGFpbmVyX1slIEtleSB8IGh0bWwgJV0iWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iUGx1Z2luQ29udGFpbmVyIlslIEVORCAlXT5bJSBGT1JFQUNIIExpbmsgSU4gRGF0YS5QbHVnaW5EYXRhLiRLZXkgJV08ZGl2IGNsYXNzPSJMaW5rX1slIExpbmsuTGlua0lEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgTGluay5MaW5rVVJMICVdIj5bJSBMaW5rLkxpbmtOYW1lIHwgaHRtbCAlXTwvYT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgZGF0YS1wbHVnaW4ta2V5PSJbJSBLZXkgfCBodG1sICVdIiBkYXRhLWxpbmstaWQ9IlslIExpbmsuTGlua0lEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPlslIEVORCAlXQogICAgICAgICAgICAgICAgPC9kaXY+WyUgRU5EICVdPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIEVORCAlXQogICAgICAgIDwvZmllbGRzZXQ+ClslIEVORCAlXQojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJUaWNrZXQgQ3JlYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpY2tldFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIlRpY2tldCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBUaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpY2tldFRlbXBsYXRlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaWNrZXRWYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0U3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJSZWxhdGl2ZSBwb2ludCBvZiB0aW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24gQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgdmFsdWU9IiIgaWQ9IlRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQiIFslIERhdGEuVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvICVdPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQiIG5hbWU9IlRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbVVuaXRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiBBcHBvaW50bWVudFRpY2tldEN1c3RvbVRpbWUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5UaWNrZXRDdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbURhdGVUaW1lU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgaWQ9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRTZWxlY3RlZEN1c3RvbWVyVXNlciB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRnJvbUN1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJGcm9tQ3VzdG9tZXIiIHZhbHVlPSIiIGNsYXNzPSJDdXN0b21lckF1dG9Db21wbGV0ZSBXNzVwYyBbJSBEYXRhLkZyb21JbnZhbGlkIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGluY2x1ZGUgYXQgbGVhc3Qgb25lIGN1c3RvbWVyIGZvciB0aGUgdGlja2V0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkZyb21TZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCB0aGlzIGN1c3RvbWVyIGFzIHRoZSBtYWluIGN1c3RvbWVyLiIpIHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyU2VsZWN0ZWQiIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleSIgaWQ9IkN1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclNlbGVjdGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyBjdXN0b21lciBhcyB0aGUgbWFpbiBjdXN0b21lci4iKSB8IGh0bWwgJV0iIGlkPSJDdXN0b21lclNlbGVjdGVkX1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiBbJSBEYXRhLkN1c3RvbWVyU2VsZWN0ZWQgfCBodG1sICVdICBbJSBEYXRhLkN1c3RvbWVyRGlzYWJsZWQgfCBodG1sICVdIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiIG5hbWU9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJETlMgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGVycm9yIGxvZy4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lciIpICVdCgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIGlkPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIvPgpbJSBJRiBEYXRhLlR5cGVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGlja2V0VHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnVHlwZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZUhUTUxTdHJpbmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdRdWV1ZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBJRiBEYXRhLlNlcnZpY2VIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlSFRNTFN0cmluZyAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIFslIElGIERhdGEuU0xBTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNMQU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUHJpb3JpdHkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdQcmlvcml0eScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5leHRTdGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnU3RhdGUnKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlSFRNTFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyIj5bJSBUcmFuc2xhdGUoJ0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iVGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciIgaWQ9IlRpY2tldEFydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXIiIHZhbHVlPSIiIFslIERhdGEuQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciB8IGh0bWwgJV0gdHlwZT0iY2hlY2tib3giIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBGT1JFQUNIIER5bmFtaWNGaWVsZCBJTiBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICBbJSBEeW5hbWljRmllbGQuTGFiZWwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRHluYW1pY0ZpZWxkLkZpZWxkICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgIDwvZmllbGRzZXQ+CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgPC9mb3JtPgo8L2Rpdj4KCjxkaXYgY2xhc3M9IkNvbnRlbnRGb290ZXIgQ2VudGVyIj4KWyUgSUYgIURhdGEuUGVybWlzc2lvbkxldmVsIHx8IERhdGEuUGVybWlzc2lvbkxldmVsID4gMSAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1TdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNvcHkiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybURlbGV0ZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtQ2FuY2VsIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo=</File>
        <File Location="Custom/Kernel/System/Calendar/Appointment.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNzg2Y2NmN2E4YmFhNjAxODg2ZmFlNzI5ZmMzNzJjYThhMjQwMDg3IC0gS2VybmVsL1N5c3RlbS9DYWxlbmRhci9BcHBvaW50bWVudC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIERpZ2VzdDo6TUQ1ICgpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCAtIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgYXBwb2ludG1lbnQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQXBwb2ludG1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlcyBhIG5ldyBhcHBvaW50bWVudC4KCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHZhbGlkIFBhcmVudElEIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIHZhbGlkIENhbGVuZGFySUQKICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgPT4gJ2p3aW9qaS1md2ppbycsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgcHJvdmlkZSBkZXNpcmVkIFVuaXF1ZUlEOyBpZiB0aGVyZSBpcyBhbHJlYWR5IGV4aXN0aW5nIEFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIHdpdGggc2FtZSBVbmlxdWVJRCwgc3lzdGVtIHdpbGwgZGVsZXRlIGl0CiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpdGxlCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsICAgICAgICAgIyAob3B0aW9uYWwpIERlc2NyaXB0aW9uCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIExvY2F0aW9uCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICA9PiBbIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICA9PiBbIDEsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmbGFnIHRoZSBhcHBvaW50bWVudCBhcyByZWN1cnJpbmcgKHBhcmVudCBvbmx5ISkKICAgICAgICBSZWN1cnJpbmdSYXcgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgc2tpcCBsb29wIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzIChkbyBub3QgY3JlYXRlIG9jY3VycmVuY2VzISkKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgPT4gJ0RhaWx5JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBSZWN1cnJpbmcpIFBvc3NpYmxlICJEYWlseSIsICJXZWVrbHkiLCAiTW9udGhseSIsICJZZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCgogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICA9PiBbMSwgMywgNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIEN1c3RvbSBSZWN1cnJpbmcpIFJlY3VycmVuY2UgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21XZWVrbHk6IDEtTW9uLCAyLVR1ZSwuLi4sIDctU3VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbU1vbnRobHk6IDEtMXN0LCAyLTJuZCwuLiwgMzF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21ZZWFybHk6IDEtSmFuLCAyLUZlYiwuLi4sIDEyLURlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEhvdyBtYW55IEFwcG9pbnRtZW50cyB0byBjcmVhdGUKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUmVwZWF0aW5nIGludGVydmFsIChkZWZhdWx0IDEpCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVudGlsIGRhdGUKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRXhwZWN0ZWQgc3RhcnQgdGltZSBmb3IgdGhpcyBvY2N1cnJlbmNlCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICAgID0+IFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFdoaWNoIHNwZWNpZmljIG9jY3VycmVuY2VzIHRvIGV4Y2x1ZGUKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgdGltZSB0byBleGVjdXRlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgPT4gJ0N1c3RvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGVtcGxhdGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVHlwZSBvZiB0aGUgY3VzdG9tIHRlbXBsYXRlIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJyZWxhdGl2ZSIsICJkYXRldGltZSIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyBjb3VudCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgdW5pdCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIGV4ZWN1dGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgImJlZm9yZXN0YXJ0IiwgImFmdGVyc3RhcnQiLCAiYmVmb3JlZW5kIiwgImFmdGVyZW5kIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBOb3RpZmljYXRpb24gZGF0ZSB0aW1lIGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgSUQgKGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERhdGEgZm9yIHRpY2tldCBjcmVhdGlvbgogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIHRpY2tldCBjcmVhdCBldmVudAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBDdXN0b20gPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgdGlja2V0IHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnICAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgICAgIEN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgcXVldWUKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIGlkCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAndGVzdEB0ZXN0LmNvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0+ICd0ZXN0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgVXNlcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHVzZXIgaWQKICAgICAgICAgICAgT3duZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IG93bmVyIGlkCiAgICAgICAgICAgIExvY2sgPT4gJ3VubG9jaycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBsb2NrIHN0YXRlCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBwcmlvcml0eQogICAgICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc3RhdGUKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgU0xBSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2VyIHNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50CiAgICAgICAgICAgIFR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCB0eXBlIGlkCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5hbWUgdmFsdWUgY29tYmluYXRpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTEgPT4gVmFsdWUxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTIgPT4gVmFsdWUyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBJZiB0aGUgZmlyc3QgVGlja2V0IEFydGljbGUgaXMgdmlzaWJsZSBmb3IgdGhlIEN1c3RvbWVyCiAgICAgICAgfSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICApOwoKcmV0dXJucyBwYXJlbnQgQXBwb2ludG1lbnRJRCBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBBcHBvaW50bWVudENyZWF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgIGlmICggJFBhcmFte1VuaXF1ZUlEfSAmJiAhJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFte1VuaXF1ZUlEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlECiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUGFyZW50SUQKICAgIGlmICggJFBhcmFte1BhcmVudElEfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17UGFyZW50SUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQYXJlbnRJRCBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDaGVjayBTdGFydFRpbWUuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBTdGFydFRpbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFVuaXF1ZUlECiAgICBpZiAoICEkUGFyYW17VW5pcXVlSUR9ICkgewogICAgICAgICRQYXJhbXtVbmlxdWVJRH0gPSAkU2VsZi0+R2V0VW5pcXVlSUQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBFbmRUaW1lLgogICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRW5kVGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYXJyYXkgcmVmcwogICAgbXkgJUFycmF5czsKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhUZWFtSUQgUmVzb3VyY2VJRCBSZWN1cnJlbmNlRnJlcXVlbmN5IFJlY3VycmVuY2VFeGNsdWRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiBAeyAkUGFyYW17JFBhcmFtZXRlcn0gLy8gW10gfSApIHsKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbm90IEFSUkFZUkVGISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17JFBhcmFtZXRlcn0gfTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgQEFycmF5ID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAQXJyYXk7CgogICAgICAgICAgICAkQXJyYXlzeyRQYXJhbWV0ZXJ9ID0gam9pbiggJywnLCBAQXJyYXkgKSBpZiBAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbnVtYmVycwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFJlY3VycmluZyBSZWN1cnJlbmNlQ291bnQgUmVjdXJyZW5jZUludGVydmFsKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUmVjdXJyZW5jZVVudGlsCiAgICBpZiAoICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAjIFVzdWFsbHkgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgPSAwLiBJbiB0aGlzIGNhc2UsIHRha2UgdGltZSBmcm9tIFN0YXJ0VGltZS4KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICB8fCAkU3RhcnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyB0aGUgcGFyZW50X2lkIGlzIG9ubHkgc3VwcGxpZWQgZm9yIHJlY3VycmluZyBldmVudHMKICAgIG15ICggJFBhcmVudElEQ29sLCAkUGFyZW50SURWYWwgKSA9ICggJycsICcnICk7CiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgJFBhcmVudElEQ29sID0gJ3BhcmVudF9pZCwnOwogICAgICAgICRQYXJlbnRJRFZhbCA9ICc/LCc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtQYXJlbnRJRH07CgogICAgICAgICMgdHVybiBvZmYgYWxsIHJlY3VycmluZyBmaWVsZHMKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmluZ307CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlVHlwZX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VDb3VudH07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVVudGlsfTsKICAgIH0KCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtUaXRsZX0sIFwkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgIFwkUGFyYW17TG9jYXRpb259LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9LCAgIFwkUGFyYW17QWxsRGF5fSwKICAgICAgICBcJEFycmF5c3tUZWFtSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VDb3VudH0sICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUlEfSwgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRXhjbHVkZX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH07CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAoJFBhcmVudElEQ29sIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieSkKICAgICAgICBWQUxVRVMgKCRQYXJlbnRJRFZhbCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pCiAgICAiOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgIyByZXR1cm4gcGFyZW50IGlkIGZvciBhcHBvaW50bWVudCBvY2N1cnJlbmNlcwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRBcHBvaW50bWVudElEID0gJFBhcmFte1BhcmVudElEfTsKICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBpZCBmb3IgdGhlIGFwcG9pbnRtZW50IHRoYXQgd2FzIGp1c3QgYWRkZWQKICAgIGVsc2UgewogICAgICAgICgkQXBwb2ludG1lbnRJRCkgPSAkREJPYmplY3QtPlNlbGVjdFJvd0FycmF5KAogICAgICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBpZAogIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgIEFORCB1bmlxdWVfaWQgICA9ID8KICAgIEFORCB0aXRsZSAgICAgICA9ID8KICAgIEFORCBwYXJlbnRfaWQgICBJUyBOVUxMCiAgT1JERVIgQlkgaWQgREVTQwpFTkRfU1FMCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGFwcG9pbnRtZW50IGNyZWF0ZWQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnRJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCBnZXQgQXBwb2ludG1lbnRJRCBmcm9tIElOU0VSVCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIHJlY3VycmluZyBhcHBvaW50bWVudHMuIFRoZSBBcHBvaW50bWVudENyZWF0ZSBldmVudAogICAgIyB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgZWFjaCBhZGRlZCBhcHBvaW50bWVudC4KICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gJiYgISRQYXJhbXtSZWN1cnJpbmdSYXd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgaWYgKCAkUGFyYW17VGlja2V0VGVtcGxhdGV9ICYmICEkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9IDA7CiAgICAgICAgbXkgJEV4ZWN1dGlvblRpbWU7CiAgICAgICAgbXkgJEN1cnJlbnREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgICAgICMgR2V0IG5lYXJlc3QgdXBjb21pbmcgZXZlbnQKICAgICAgICAgICAgIyBJZiBhbGwgZXZlbnRzIGFyZSBpbiB0aGUgcGFzdCwgbm8gZnV0dXJlIHRhc2sgaXMgY3JlYXRlZAogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJFNlbGYtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElEICk7CiAgICAgICAgICAgIHVuc2hpZnQgQEFwcG9pbnRtZW50TGlzdCwgXCVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRMaXN0KSB7CgogICAgICAgICAgICAgICAgIyBUYWtlIHNtYWxsZXN0IHBvc2l0aXZlIGRpc3RhbmNlIGZyb20gY3VycmVudCB0aW1lCiAgICAgICAgICAgICAgICAjIFRha2UgZXhlY3V0aW9uIHRpbWUgb2YgZnV0dXJlIHRhc2sgYXMgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNlbGYtPkFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgPiAwICkgewogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBBUFBPSU5UTUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b219LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRJRDsKICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQpIHsKICAgICAgICAgICAgbXkgJFRhc2tJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tBZGQoCiAgICAgICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQXBwb2ludG1lbnRUaWNrZXQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT4lKiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgPT4gJEZ1dHVyZVRhc2tBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRUYXNrSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGdXR1cmVUYXNrSUR9ID0gJFRhc2tJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRpY2tldCB0YXNrIGZvciBhcHBvaW50bWVudCAkQXBwb2ludG1lbnRJRCBjb3VsZCBub3QgYmUgY3JlYXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNRTCA9ICIKICAgICAgICAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICI7CiAgICAgICAgICAgIEBCaW5kID0gKCBcJFRhc2tJRCwgXCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCApOwoKICAgICAgICAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICAgICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudENyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRMaXN0KCkKCmdldCBhIGhhc2ggb2YgQXBwb2ludG1lbnRzLgoKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0aXRsZSwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZGVzY3JpcHRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGxvY2F0aW9uLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0ZWFtCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcmVzb3VyY2UKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcGFyZW50IGlkLCByZXR1cm5zIG9ubHkgY2hpbGRyZW4KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgICA9PiAnSEFTSCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSwgSEFTSHxBUlJBWQogICAgKTsKCnJldHVybnMgYW4gYXJyYXkgb2YgaGFzaGVzIHdpdGggc2VsZWN0IEFwcG9pbnRtZW50IGRhdGEgb3Igc2ltcGxlIGFycmF5IG9mIEFwcG9pbnRtZW50SURzOgoKUmVzdWx0ID0+ICdIQVNIJzoKCiAgICBAQXBwb2ludG1lbnRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgcmVjdXJyaW5nIChwYXJlbnQpIGFwcG9pbnRtZW50cyBvbmx5CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMiwKICAgICAgICAgICAgUGFyZW50SUQgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJlZCAoY2hpbGQpIGFwcG9pbnRtZW50cyBvbmx5CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE4MDAwMC1BNzhCNTdAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MTA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgICAgICAgICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAgICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgfSwKICAgICAgICAuLi4KICAgICk7CgpSZXN1bHQgPT4gJ0FSUkFZJzoKCiAgICBAQXBwb2ludG1lbnRzID0gKCAxLCAyLCAuLi4gKQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBhcnJheSBvZiBoYXNoZXMgYnkgZGVmYXVsdAogICAgJFBhcmFte1Jlc3VsdH0gPSAkUGFyYW17UmVzdWx0fSB8fCAnSEFTSCc7CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIG15ICRDYWNoZUtleVRpdGxlICAgID0gJFBhcmFte1RpdGxlfSAgICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleURlc2MgICAgID0gJFBhcmFte0Rlc2NyaXB0aW9ufSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUxvY2F0aW9uID0gJFBhcmFte0xvY2F0aW9ufSAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVN0YXJ0ICAgID0gJFBhcmFte1N0YXJ0VGltZX0gICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgICAgID0gJFBhcmFte0VuZFRpbWV9ICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVRlYW0gICAgID0gJFBhcmFte1RlYW1JRH0gICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVJlc291cmNlID0gJFBhcmFte1Jlc291cmNlSUR9ICB8fCAnYW55JzsKCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgbXkgJENhY2hlS2V5UGFyZW50ID0gJFBhcmFte1BhcmVudElEfSB8fCAnYW55JzsKCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtUaXRsZX0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleVRpdGxlID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Rlc2NyaXB0aW9ufSAmJiAkUGFyYW17RGVzY3JpcHRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlEZXNjID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0xvY2F0aW9ufSAmJiAkUGFyYW17TG9jYXRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlMb2NhdGlvbiA9ICdhbnknOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgbXkgJENhY2hlS2V5ID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJFBhcmFte1Jlc3VsdH0iOwogICAgbXkgJENhY2hlS2V5ID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJENhY2hlS2V5UGFyZW50LSRQYXJhbXtSZXN1bHR9IjsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gQHskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKIyAgICAgICAgICAgICBlbmRfdGltZSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIGFsbF9kYXksIHJlY3VycmluZywgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQKIyAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKIyAgICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkPT8KIyAgICAgJzsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkLCBmdXR1cmVfdGFza19pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgICc7CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgIG15IEBCaW5kOwoKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CgogICAgIyBGaWx0ZXIgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZCBsb2NhdGlvbiBmaWVsZHMgYnkgdXNpbmcgUXVlcnlDb25kaXRpb24gbWV0aG9kLCB3aGljaCB3aWxsCiAgICAjICAgcmV0dXJuIGJhY2tlbmQgc3BlY2lmaWMgU1FMIHN0YXRlbWVudHMgaW4gb3JkZXIgdG8gcHJvdmlkZSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoIGFuZAogICAgIyAgIHdpbGRjYXJkIHN1cHBvcnQuCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlciAocXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24pKSB7CiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRQYXJhbXskRmlsdGVyfTsKICAgICAgICAkU1FMIC49ICcgQU5EICcgLiAkREJPYmplY3QtPlF1ZXJ5Q29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gbGMgJEZpbHRlciwKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICRQYXJhbXskRmlsdGVyfSwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ID0+ICcqJywKICAgICAgICAgICAgU2VhcmNoU3VmZml4ID0+ICcqJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EICgKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPj0gPyBBTkQgc3RhcnRfdGltZSA8ID8pIE9SCiAgICAgICAgICAgIChlbmRfdGltZSA+ID8gQU5EIGVuZF90aW1lIDw9ID8pIE9SCiAgICAgICAgICAgIChzdGFydF90aW1lIDw9ID8gQU5EIGVuZF90aW1lID49ID8pCiAgICAgICAgKSAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICEkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgZW5kX3RpbWUgPj0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggISRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBzdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgQFJlc3VsdDsKCiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyB0ZWFtIGlkCiAgICAgICAgbXkgQFRlYW1JRCA9IHNwbGl0KCAvLC8sICRSb3dbOV0gLy8gJycgKTsKICAgICAgICBpZiAoICRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtUZWFtSUR9IH0gQFRlYW1JRDsKICAgICAgICB9CgogICAgICAgICMgcmVzb3VyY2UgaWQKICAgICAgICAkUm93WzEwXSA9ICRSb3dbMTBdID8gJFJvd1sxMF0gOiAwOwogICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFJvd1sxMF0gPX4gLywvID8gc3BsaXQoIC8sLywgJFJvd1sxMF0gKSA6ICggJFJvd1sxMF0gKTsKICAgICAgICBpZiAoICRQYXJhbXtSZXNvdXJjZUlEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgIWdyZXAgeyAkXyA9PSAkUGFyYW17UmVzb3VyY2VJRH0gfSBAUmVzb3VyY2VJRDsKICAgICAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAjIHBhcmVudCBpZAogICAgICAgICRSb3dbMV0gPSAkUm93WzFdID8gJFJvd1sxXSA6IDA7CiAgICAgICAgbXkgJFBhcmVudElEID0gJFJvd1sxXTsKICAgICAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICggJFBhcmFte1BhcmVudElEfSAhPSAkUGFyZW50SUQgKTsKICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzddLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTJdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTNdIHx8ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTRdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTVdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRSb3dbMTZdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRSb3dbMTddLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRSb3dbMThdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRSb3dbMTldIHx8ICcnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICRSb3dbMjBdLAojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgRnV0dXJlVGFza0lEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzIxXSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgKTsKICAgICAgICBwdXNoIEBSZXN1bHQsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgIyBpZiBSZXN1bHQgd2FzIEFSUkFZLCBvdXRwdXQgb25seSBJRHMKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBteSBAUmVzdWx0TGlzdDsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAUmVzdWx0KSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdExpc3QsICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgIH0KICAgICAgICBAUmVzdWx0ID0gQFJlc3VsdExpc3Q7CiAgICB9CgogICAgIyBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudERheXMoKQoKZ2V0IGEgaGFzaCBvZiBkYXlzIHdpdGggQXBwb2ludG1lbnRzIGluIGFsbCB1c2VyIGNhbGVuZGFycy4KCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgc3RhcnQgZGF0ZQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGVuZCBkYXRlCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBVc2VySUQKICAgICk7CgpyZXR1cm5zIGEgaGFzaCB3aXRoIGRheXMgYXMga2V5cyBhbmQgbnVtYmVyIG9mIEFwcG9pbnRtZW50cyBhcyB2YWx1ZXM6CgogICAgJUFwcG9pbnRtZW50RGF5cyA9IHsKICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAnMjAxNi0wMS0xMycgPT4gMiwKICAgICAgICAnMjAxNi0wMS0zMCcgPT4gMSwKICAgIH07Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREYXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlS2V5U3RhcnQgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgID0gJFBhcmFte0VuZFRpbWV9ICAgfHwgJ2FueSc7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICApOwoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdXNlciBncm91cHMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgKTsKICAgIG15IEBHcm91cElEcyA9IHNvcnQga2V5cyAlR3JvdXBMaXN0OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgU0VMRUNUIGNhLnN0YXJ0X3RpbWUsIGNhLmVuZF90aW1lCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBjYQogICAgICAgIEpPSU4gY2FsZW5kYXIgYyBPTiBjYS5jYWxlbmRhcl9pZCA9IGMuaWQKICAgICAgICBXSEVSRSBjLmdyb3VwX2lkIElOICggJHtcKGpvaW4gJywgJywgQEdyb3VwSURzKX0gKQogICAgIjsKCiAgICBteSBAQmluZDsKCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EICgKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPj0gPyBBTkQgY2Euc3RhcnRfdGltZSA8ID8pIE9SCiAgICAgICAgICAgIChjYS5lbmRfdGltZSA+ID8gQU5EIGNhLmVuZF90aW1lIDw9ID8pIE9SCiAgICAgICAgICAgIChjYS5zdGFydF90aW1lIDw9ID8gQU5EIGNhLmVuZF90aW1lID49ID8pCiAgICAgICAgKSAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICEkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5lbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgY2Euc3RhcnRfdGltZSA8PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICdPUkRFUiBCWSBjYS5pZCBBU0MnOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJVJlc3VsdDsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgKCAkU3RhcnRUaW1lLCAkRW5kVGltZSApOwoKICAgICAgICAjIFN0YXJ0VGltZQogICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkUm93WzBdIGx0ICRQYXJhbXtTdGFydFRpbWV9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIEVuZFRpbWUKICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkUm93WzFdIGd0ICRQYXJhbXtFbmRUaW1lfSA/ICRQYXJhbXtFbmRUaW1lfSA6ICRSb3dbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICAjIEdldCBzeXN0ZW0gdGltZXMuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbmRUaW1lLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGZvciAoCiAgICAgICAgICAgIG15ICRMb29wVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRMb29wVGltZU9iamVjdCA8ICRFbmRUaW1lT2JqZWN0OwogICAgICAgICAgICAkTG9vcFRpbWVPYmplY3QtPkFkZCggRGF5cyA9PiAxICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJExvb3BUaW1lID0gJExvb3BUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgICAgICAgICAgJExvb3BUaW1lID1+IHMvXHMuKj8kLy9nc207CgogICAgICAgICAgICBpZiAoICRSZXN1bHR7JExvb3BUaW1lfSApIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7JExvb3BUaW1lfSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgID0+ICIkQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQiLAogICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJVJlc3VsdDsKfQoKPWhlYWQyIEFwcG9pbnRtZW50R2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhLgoKICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICMgKHJlcXVpcmVkKSB3aWxsIHJldHVybiBvbmx5IHBhcmVudCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKUmV0dXJucyBhIGhhc2g6CgogICAgJUFwcG9pbnRtZW50ID0gKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgID0+IFsKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDowMCcsCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRDb3VudCAgICAgICA9PiAnMTInLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgICAgICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIEZ1dHVyZVRhc2tJRCA9PiAxLAojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICk7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKAogICAgICAgICEkUGFyYW17QXBwb2ludG1lbnRJRH0KICAgICAgICAmJiAhKCAkUGFyYW17VW5pcXVlSUR9ICYmICRQYXJhbXtDYWxlbmRhcklEfSApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBcHBvaW50bWVudElEIG9yIFVuaXF1ZUlEIGFuZCBDYWxlbmRhcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERhdGE7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JERhdGF9OwogICAgfQoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15IEBCaW5kOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKIyAgICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiMgICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAojICAgICAgICAgICAgIGNoYW5nZV9ieQojICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICBXSEVSRQojICAgICAnOwogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIGFsbF9kYXksIHRlYW1faWQsIHJlc291cmNlX2lkLCByZWN1cnJpbmcsIHJlY3VyX3R5cGUsIHJlY3VyX2ZyZXEsIHJlY3VyX2NvdW50LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbCwgcmVjdXJfdW50aWwsIHJlY3VyX2lkLCByZWN1cl9leGNsdWRlLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwKICAgICAgICAgICAgY2hhbmdlX2J5LCBmdXR1cmVfdGFza19pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRQogICAgJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnaWQgPSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJ3VuaXF1ZV9pZCA9ID8gQU5EIGNhbGVuZGFyX2lkID0gPyBBTkQgcGFyZW50X2lkIElTIE5VTEwgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoIC8sLywgJFJvd1sxMF0gLy8gJycgKTsKCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgIG15IEBSZXNvdXJjZUlEID0gc3BsaXQoIC8sLywgJFJvd1sxMV0gLy8gJzAnICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBmcmVxdWVuY3kKICAgICAgICBteSBAUmVjdXJyZW5jZUZyZXF1ZW5jeSA9ICRSb3dbMTRdID8gc3BsaXQoIC8sLywgJFJvd1sxNF0gKSA6IHVuZGVmOwoKICAgICAgICAjIHJlY3VycmVuY2UgZXhjbHVkZQogICAgICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9ICRSb3dbMTldID8gc3BsaXQoIC8sLywgJFJvd1sxOV0gKSA6IHVuZGVmOwoKICAgICAgICAkUmVzdWx0e0FwcG9pbnRtZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkUmVzdWx0e1BhcmVudElEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkUmVzdWx0e0NhbGVuZGFySUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkUmVzdWx0e1VuaXF1ZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szXTsKICAgICAgICAkUmVzdWx0e1RpdGxlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkUmVzdWx0e0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkUmVzdWx0e0xvY2F0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkUmVzdWx0e1N0YXJ0VGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkUmVzdWx0e0VuZFRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkUmVzdWx0e0FsbERheX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICAkUmVzdWx0e1RlYW1JRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBUZWFtSUQ7CiAgICAgICAgJFJlc3VsdHtSZXNvdXJjZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFxAUmVzb3VyY2VJRDsKICAgICAgICAkUmVzdWx0e1JlY3VycmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxMl07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlVHlwZX0gICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VGcmVxdWVuY3k7CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlQ291bnR9ICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTVdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUludGVydmFsfSAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE2XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VVbnRpbH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxN107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMThdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUV4Y2x1ZGV9ICAgICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uRGF0ZX0gICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzIwXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvblRlbXBsYXRlfSAgICAgICAgICAgICAgICAgID0gJFJvd1syMV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b219ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjJdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICAgPSAkUm93WzIzXSB8fCAwOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSAgICAgICAgPSAkUm93WzI0XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9ID0gJFJvd1syNV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gICAgICAgICAgICA9ICRSb3dbMjZdIHx8ICcnOwogICAgICAgICRSZXN1bHR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICAgICAgICAgICAgICAgPSAkUm93WzI3XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZVRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOF07CiAgICAgICAgJFJlc3VsdHtDcmVhdGVCeX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjldOwogICAgICAgICRSZXN1bHR7Q2hhbmdlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMwXTsKICAgICAgICAkUmVzdWx0e0NoYW5nZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szMV07CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICRSZXN1bHR7RnV0dXJlVGFza0lEfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMyXTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICB9CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aGVhZDIgQXBwb2ludG1lbnRVcGRhdGUoKQoKdXBkYXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVGl0bGUKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywgICAgICAgICAjIChvcHRpb25hbCkgRGVzY3JpcHRpb24KICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTG9jYXRpb24KICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGVmYXVsdCAwCiAgICAgICAgVGVhbSAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgID0+IFsgMSwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGZsYWcgdGhlIGFwcG9pbnRtZW50IGFzIHJlY3VycmluZyAocGFyZW50IG9ubHkhKQoKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgPT4gJ0RhaWx5JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBSZWN1cnJpbmcpIFBvc3NpYmxlICJEYWlseSIsICJXZWVrbHkiLCAiTW9udGhseSIsICJZZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCgogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIEN1c3RvbSBSZWN1cnJpbmcpIFJlY3VycmVuY2UgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21XZWVrbHk6IDEtTW9uLCAyLVR1ZSwuLi4sIDctU3VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbU1vbnRobHk6IDEtSmFuLCAyLUZlYiwuLi4sIDEyLURlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEhvdyBtYW55IEFwcG9pbnRtZW50cyB0byBjcmVhdGUKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUmVwZWF0aW5nIGludGVydmFsIChkZWZhdWx0IDEpCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVudGlsIGRhdGUKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgdGltZSB0byBleGVjdXRlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgPT4gJ0N1c3RvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGVtcGxhdGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVHlwZSBvZiB0aGUgY3VzdG9tIHRlbXBsYXRlIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJyZWxhdGl2ZSIsICJkYXRldGltZSIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyBjb3VudCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgdW5pdCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIGV4ZWN1dGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgImJlZm9yZXN0YXJ0IiwgImFmdGVyc3RhcnQiLCAiYmVmb3JlZW5kIiwgImFmdGVyZW5kIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBOb3RpZmljYXRpb24gZGF0ZSB0aW1lIGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgSUQgKGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgRnV0dXJlVGFza0lEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIElEIG9mIGZ1dHVyZSB0YXNrCiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERhdGEgZm9yIHRpY2tldCBjcmVhdGlvbgogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIHRpY2tldCBjcmVhdCBldmVudAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBDdXN0b20gPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgdGlja2V0IHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnICAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgICAgIEN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgcXVldWUKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIGlkCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAndGVzdEB0ZXN0LmNvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0+ICd0ZXN0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgVXNlcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHVzZXIgaWQKICAgICAgICAgICAgT3duZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IG93bmVyIGlkCiAgICAgICAgICAgIExvY2sgPT4gJ3VubG9jaycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBsb2NrIHN0YXRlCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBwcmlvcml0eQogICAgICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc3RhdGUKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgU0xBSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50CiAgICAgICAgICAgIFR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCB0eXBlIGlkCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5hbWUgdmFsdWUgY29tYmluYXRpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTEgPT4gVmFsdWUxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTIgPT4gVmFsdWUyLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRVcGRhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgaWYgUmVjdXJyaW5nIGlzIHByb3ZpZGVkLCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSBwcmVzZW50CiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICBteSBAUmVjdXJyZW5jZVR5cGVzID0gKAogICAgICAgICAgICAiRGFpbHkiLCAgICAgICAiV2Vla2x5IiwgICAgICAgIk1vbnRobHkiLCAgICAgICAiWWVhcmx5IiwKICAgICAgICAgICAgIkN1c3RvbURhaWx5IiwgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17UmVjdXJyZW5jZVR5cGV9CiAgICAgICAgICAgIHx8ICFncmVwIHsgJF8gZXEgJFBhcmFte1JlY3VycmVuY2VUeXBlfSB9IEBSZWN1cnJlbmNlVHlwZXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VUeXBlIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICEkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VGcmVxdWVuY3kgbmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHw9IDE7CgogICAgIyBDaGVjayBTdGFydFRpbWUuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhcnRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIEVuZFRpbWUuCiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBpZiBhcnJheSByZWZzCiAgICBteSAlQXJyYXlzOwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFRlYW1JRCBSZXNvdXJjZUlEIFJlY3VycmVuY2VGcmVxdWVuY3kpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmIEB7ICRQYXJhbXskUGFyYW1ldGVyfSAvLyBbXSB9ICkgewogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBub3QgQVJSQVlSRUYhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXskUGFyYW1ldGVyfSB9OwoKICAgICAgICAgICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgICAgICAgICBAQXJyYXkgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBBcnJheTsKCiAgICAgICAgICAgICRBcnJheXN7JFBhcmFtZXRlcn0gPSBqb2luKCAnLCcsIEBBcnJheSApIGlmIEBBcnJheTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBudW1iZXJzCiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoUmVjdXJyaW5nIFJlY3VycmVuY2VDb3VudCBSZWN1cnJlbmNlSW50ZXJ2YWwpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmICFJc0ludGVnZXIoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBSZWN1cnJlbmNlVW50aWwKICAgIGlmICggJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gKSB7CgogICAgICAgICMgVXN1YWxseSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCA9IDAuIEluIHRoaXMgY2FzZSwgdGFrZSB0aW1lIGZyb20gU3RhcnRUaW1lLgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUmVjdXJyZW5jZVVudGlsT2JqZWN0CiAgICAgICAgICAgIHx8ICRTdGFydFRpbWVPYmplY3QgPiAkUmVjdXJyZW5jZVVudGlsT2JqZWN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVW50aWwgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByZXZpb3VzIENhbGVuZGFySUQKICAgIG15ICRQcmV2aW91c0NhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzZXQgcmVjdXJyZW5jZSBleGNsdWRlIGxpc3QKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIGdldCBSZWN1cnJlbmNlSUQKICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHVzZSBleGNsdWRlIGxpc3QgdG8gZmxhZyB0aGUgcmVjdXJyaW5nIG9jY3VycmVuY2UgYXMgdXBkYXRlZAogICAgaWYgKCRSZWN1cnJlbmNlSUQpIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoJFJlY3VycmVuY2VJRCk7CiAgICB9CgogICAgIyByZXNldCBleGNsdWRlIGxpc3QgaWYgcmVjdXJyZW5jZSBpcyB0dXJuZWQgb2ZmCiAgICBlbHNpZiAoICEkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoKTsKICAgIH0KCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhCiAgICBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApIHx8IHVuZGVmOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHJlY3VycmVkIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHJlY3VycmluZyBBcHBvaW50bWVudCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKIyAgICAgICAgIFNFVAojICAgICAgICAgICAgIGNhbGVuZGFyX2lkPT8sIHRpdGxlPT8sIGRlc2NyaXB0aW9uPT8sIGxvY2F0aW9uPT8sIHN0YXJ0X3RpbWU9PywgZW5kX3RpbWU9PywgYWxsX2RheT0/LAojICAgICAgICAgICAgIHRlYW1faWQ9PywgcmVzb3VyY2VfaWQ9PywgcmVjdXJyaW5nPT8sIHJlY3VyX3R5cGU9PywgcmVjdXJfZnJlcT0/LCByZWN1cl9jb3VudD0/LAojICAgICAgICAgICAgIHJlY3VyX2ludGVydmFsPT8sIHJlY3VyX3VudGlsPT8sIHJlY3VyX2V4Y2x1ZGU9Pywgbm90aWZ5X3RpbWU9Pywgbm90aWZ5X3RlbXBsYXRlPT8sCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbT0/LCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQ9Pywgbm90aWZ5X2N1c3RvbV91bml0PT8sCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50PT8sIG5vdGlmeV9jdXN0b21fZGF0ZT0/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZD0/LAojICAgICAgICAgICAgIGNoYW5nZV90aW1lPWN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnk9PwojICAgICAgICAgV0hFUkUgaWQ9PwojICAgICAnOwoKIyAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiMgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAojICAgICAgICAgU1FMICA9PiAkU1FMLAojICAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiMgICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICAgICAgICBcJFBhcmFte0FsbERheX0sICAgICAgXCRBcnJheXN7VGVhbUlEfSwKIyAgICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmluZ30sICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVR5cGV9LAojICAgICAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VGcmVxdWVuY3l9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAojICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKIyAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSwgICAgICAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiMgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAojICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAojICAgICAgICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKIyAgICAgICAgIF0sCiMgICAgICk7CiAgICBteSAkU1FMID0gJwogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVAogICAgICAgICAgICBjYWxlbmRhcl9pZCA9ID8sIHRpdGxlID0gPywgZGVzY3JpcHRpb24gPSA/LCBsb2NhdGlvbiA9ID8sIHN0YXJ0X3RpbWUgPSA/LCBlbmRfdGltZSA9ID8sIGFsbF9kYXkgPSA/LAogICAgICAgICAgICB0ZWFtX2lkID0gPywgcmVzb3VyY2VfaWQgPSA/LCByZWN1cnJpbmcgPSA/LCByZWN1cl90eXBlID0gPywgcmVjdXJfZnJlcSA9ID8sIHJlY3VyX2NvdW50ID0gPywKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwgPSA/LCByZWN1cl91bnRpbCA9ID8sIHJlY3VyX2V4Y2x1ZGUgPSA/LCBub3RpZnlfdGltZSA9ID8sIG5vdGlmeV90ZW1wbGF0ZSA9ID8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20gPSA/LCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQgPSA/LCBub3RpZnlfY3VzdG9tX3VuaXQgPSA/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQgPSA/LCBub3RpZnlfY3VzdG9tX2RhdGUgPSA/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCA9ID8sCiAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgIFdIRVJFIGlkID0gPwogICAgJzsKCiAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX0sICAgICAgICAgXCRQYXJhbXtBbGxEYXl9LCAgICAgIFwkQXJyYXlze1RlYW1JRH0sCiAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VGcmVxdWVuY3l9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgICAgICAgICAgICAgICAgICBcJFJlY3VycmVuY2VFeGNsdWRlLCAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0Z1dHVyZVRhc2tJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgYWRkIHJlY3VycmVkIGFwcG9pbnRtZW50cyBhZ2FpbgogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdDcmVhdGUoCiAgICAgICAgICAgIFBhcmVudElEICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkQ3VycmVudERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQ7CgogICAgIyBTZXQgZnV0dXJlIHRhc2sgaWQgdG8gTlVMTCBhbmQgZGVsZXRlIGZ1dHVyZSB0YXNrIGlmIG5vIGlkIHByb3ZpZGVkLCBlbHNlIHVwZGF0ZSBleGlzdGluZyBmdXR1cmUgdGFzawogICAgaWYgKCAhJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKCiAgICAgICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgICAgICBEYXRlIFRlbXBsYXRlIEN1c3RvbSBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0IEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgQ3VzdG9tRGF0ZVRpbWUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RnV0dXJlVGFza0lEfSAmJiAhJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJFBhcmFte0Z1dHVyZVRhc2tJRH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtGdXR1cmVUYXNrSUR9ID0gdW5kZWY7CiAgICB9CgogICAgIyBGdXR1cmVUYXNrIGlzIHRvIGJlIChyZSljcmVhdGVkCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0gKSB7CgogICAgICAgICMgQ29sbGVjdCBkYXRhIGZvciBjcmVhdGluZyBvciB1cGRhdGluZyBmdXR1cmUgdGFzawogICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICgKICAgICAgICAgICAgVHlwZSA9PiAnQXBwb2ludG1lbnRUaWNrZXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50VGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT4lKiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgcmVjdXJyaW5nIGFuZCBpZiBleGVjdXRpb24gdGltZSBpcyBpbiBmdXR1cmUKICAgICAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJFNlbGYtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFByZXZpb3VzQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCggQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKICAgICAgICAgICAgdW5zaGlmdCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUgPSAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAjIHdoZW4gdGhlIGFwcG9pbnRtZW50IHdhcyBqdXN0IHVwZGF0ZWQgaW4gZGF0YWJhc2UsIG1heWJlIHRoZSBkYXRhIGlzIHN0aWxsIGluY29ycmVjdCBoZXJlCiAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9ID09ICRQYXJhbXtBcHBvaW50bWVudElEfSA/ICRQYXJhbXtTdGFydFRpbWV9IDogJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPT0gJFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJFBhcmFte0VuZFRpbWV9ICAgOiAkQXBwb2ludG1lbnQtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+Q29tcGFyZSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnREYXRlVGltZU9iamVjdCApID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtFeGVjdXRpb25UaW1lfSAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgU2luZ2xlIGFwcG9pbnRtZW50LCBjaGVja2luZyBpZiBpdHMgZXhlY3V0aW9uIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lID0gJFNlbGYtPkFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGltZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgKSB7CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSA9ICRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgID0gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RXhlY3V0aW9uVGltZX0gICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgJEZ1dHVyZVRhc2tEYXRhe1Rhc2tJRH0gPSAkUGFyYW17RnV0dXJlVGFza0lEfTsKCiAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQgd2l0aCBleGVjdXRpb24gdGltZSBpbiB0aGUgZnV0dXJlLCB1cGRhdGUgZnV0dXJlIHRhc2sKICAgICAgICAgICAgaWYgKCAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza1VwZGF0ZSglRnV0dXJlVGFza0RhdGEpOwogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGdXR1cmUgdGFzayAkRnV0dXJlVGFza0RhdGF7VGFza0lEfSBvZiB0eXBlIGFwcG9pbnRtZW50IHRpY2tldCBmb3IgYXBwb2ludG1lbnQgJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH0gY291bGQgbm90IGJlIHVwZGF0ZWQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBEZWxldGUgZXhpc3RpbmcgZnV0dXJlIHRhc2sgc2luY2UgdXBkYXRlZCBleGVjdXRpb24gdGltZSBpcyBub3QgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSB1bmRlZjsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrRGF0YXtUYXNrSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBObyBmdXR1cmUgdGFzayBpZCBwcmVzZW50LCBjcmVhdGUgZnV0dXJlIHRhc2sgaWYgZXhlY3V0aW9uIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrQWRkKCVGdXR1cmVUYXNrRGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgaWRzIGZyb20gYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGFuZCB1cGRhdGUgaXQgd2hlcmUgaXQgYmVsb25ncyBhZnRlcndhcmRzCiAgICBteSAkRGVsZXRlRnV0dXJlVGFza0lEU1FMID0gIgogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVCBmdXR1cmVfdGFza19pZCA9IE5VTEwKICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICBPUiBwYXJlbnRfaWQgPSA/CiAgICAiOwogICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKCiAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICREZWxldGVGdXR1cmVUYXNrSURTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIGlmICgkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQpIHsKICAgICAgICBteSAkVXBkYXRlRnV0dXJlVGFza0lEU1FMID0gIgogICAgICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAiOwogICAgICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0Z1dHVyZVRhc2tJRH0sIFwkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQgKTsKCiAgICAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICRVcGRhdGVGdXR1cmVUYXNrSURTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICk7CiAgICB9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICBteSBAQ2FsZW5kYXJJRHMgPSAoICRQYXJhbXtDYWxlbmRhcklEfSApOwogICAgcHVzaCBAQ2FsZW5kYXJJRHMsICRQcmV2aW91c0NhbGVuZGFySUQgaWYgJFByZXZpb3VzQ2FsZW5kYXJJRCBuZSAkUGFyYW17Q2FsZW5kYXJJRH07CiAgICBmb3IgbXkgJENhbGVuZGFySUQgKEBDYWxlbmRhcklEcykgewogICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwogICAgfQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnRVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnREZWxldGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgQ2FsZW5kYXJJRAogICAgbXkgJENhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjaGVjayB1c2VyJ3MgcGVybWlzc2lvbnMgZm9yIHRoaXMgY2FsZW5kYXIKICAgIG15ICRQZXJtaXNzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBSZXF1aXJlZFBlcm1pc3Npb25zID0gKCAnY3JlYXRlJywgJ3J3JyApOwoKICAgIGlmICggIWdyZXAgeyAkUGVybWlzc2lvbiBlcSAkXyB9IEBSZXF1aXJlZFBlcm1pc3Npb25zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlcigkUGFyYW17VXNlcklEfSkgaGFzIG5vIHBlcm1pc3Npb24gdG8gZGVsZXRlIEFwcG9pbnRtZW50KCRQYXJhbXtBcHBvaW50bWVudElEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2F2ZSBleGNsdXNpb24gaW5mbyB0byBwYXJlbnQgYXBwb2ludG1lbnQKICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSAmJiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSApIHsKICAgICAgICAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0sCiAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVSZWN1cnJpbmdTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVSZWN1cnJpbmdTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50cyBjb3VsZG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZiBwcmVzZW50CiAgICAjIFRPRE8gSGFuZGxlIGRlbGV0aW9uIG9mIGEgcmVjdXJyaW5nIGNoaWxkIGV2ZW50IGFuZCBzaGlmdCBmdXR1cmUgdGFzawogICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgQXBwb2ludG1lbnRUaWNrZXQgY291bG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgRmlyZSBldmVudC4KICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50RGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBBcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoKQoKZGVsZXRlcyBhIHNpbmdsZSByZWN1cnJpbmcgYXBwb2ludG1lbnQgb2NjdXJyZW5jZS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKAogICAgICAgIFVuaXF1ZUlEICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLCAgICAjIChyZXF1aXJlZCkKICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVW5pcXVlSUQgQ2FsZW5kYXJJRCBSZWN1cnJlbmNlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRiIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkID0gPyBBTkQgY2FsZW5kYXJfaWQgPSA/IEFORCByZWN1cl9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UmVjdXJyZW5jZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVBcHBvaW50bWVudDsKCiAgICAjIGdldCBhZGRpdGlvbmFsIGluZm8KICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSA9ICRSb3dbMF07CiAgICB9CiAgICByZXR1cm4gaWYgISVBcHBvaW50bWVudDsKCiAgICAjIGRlbGV0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBHZXRVbmlxdWVJRCgpCgpSZXR1cm5zIFVuaXF1ZUlEIGNvbnRhaW5pbmcgYXBwb2ludG1lbnQgc3RhcnQgdGltZSwgcmFuZG9tIGhhc2ggYW5kIHN5c3RlbSBDPEZRRE4+LgoKICAgIG15ICRVbmlxdWVJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+R2V0VW5pcXVlSUQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKICAgICRVbmlxdWVJRCA9ICcyMDE2MDEwMVQwMDAwMDAtQjk5MDlEQGxvY2FsaG9zdCc7Cgo9Y3V0CgpzdWIgR2V0VW5pcXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgU3RhcnRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBhIGhhc2gKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDMyICk7CiAgICBteSAkU3RyaW5nICAgICAgID0gIiRQYXJhbXtDYWxlbmRhcklEfS0kUmFuZG9tU3RyaW5nLSRQYXJhbXtVc2VySUR9IjsKICAgIG15ICREaWdlc3QgICAgICAgPSB1bnBhY2soICdOJywgRGlnZXN0OjpNRDUtPm5ldygpLT5hZGQoJFN0cmluZyktPmRpZ2VzdCgpICk7CiAgICBteSAkRGlnZXN0SGV4ICAgID0gc3ByaW50ZiggJyV4JywgJERpZ2VzdCApOwogICAgbXkgJEhhc2ggICAgICAgICA9IHVjKCBzcHJpbnRmKCAiJS42cyIsICREaWdlc3RIZXggKSApOwoKICAgICMgUHJlcGFyZSBzdGFydCB0aW1lc3RhbXAgZm9yIFVuaXF1ZUlELgogICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkU3RhcnRUaW1lT2JqZWN0OwogICAgbXkgJFN0YXJ0VGltZVN0cmcgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9bLTpdLy9nOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9ccy9ULzsKCiAgICAjIGdldCBzeXN0ZW0gRlFETgogICAgbXkgJEZRRE4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKCiAgICAjIHJldHVybiBVbmlxdWVJRAogICAgcmV0dXJuICIkU3RhcnRUaW1lU3RyZy0kSGFzaFxAJEZRRE4iOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRVcGNvbWluZ0dldCgpCgpHZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnQgc3RhcnQgb3IgZW5kLgoKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLCAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgICk7CgpSZXR1cm5zIGFwcG9pbnRtZW50IGRhdGEgb2YgQXBwb2ludG1lbnRHZXQoKS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwY29taW5nR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50VGltZXN0YW1wOwoKICAgICMgY3JlYXRlIG5lZWRlZCBzcWwgcXVlcnkgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3IgYSBnaXZlbiB0aW1lc3RhbXAKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCAnOwoKICAgIGlmICggJFBhcmFte1RpbWVzdGFtcH0gKSB7CiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkUGFyYW17VGltZXN0YW1wfTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA9ID8gIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDdXJyZW50VGltZXN0YW1wID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPj0gPyAiOwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIG5vdGlmeV90aW1lIEFTQyc7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJEN1cnJlbnRUaW1lc3RhbXAgXSwKICAgICk7CgogICAgbXkgQFJlc3VsdFJhdzsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJVVwY29taW5nQXBwb2ludG1lbnQ7CgogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtQYXJlbnRJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gICAgPSAkUm93WzJdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1VuaXF1ZUlEfSAgICAgID0gJFJvd1szXTsKCiAgICAgICAgcHVzaCBAUmVzdWx0UmF3LCBcJVVwY29taW5nQXBwb2ludG1lbnQ7CiAgICB9CgogICAgbXkgQFJlc3VsdHM7CgogICAgQVBQT0lOVE1FTlREQVRBOgogICAgZm9yIG15ICRBcHBvaW50bWVudERhdGEgKEBSZXN1bHRSYXcpIHsKCiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudERhdGEpOwogICAgICAgIG5leHQgQVBQT0lOVE1FTlREQVRBIGlmICEkQXBwb2ludG1lbnREYXRhLT57Q2FsZW5kYXJJRH07CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCAleyRBcHBvaW50bWVudERhdGF9ICk7CgogICAgICAgIHB1c2ggQFJlc3VsdHMsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHRzOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpCgpEZWxldGUgYWxsIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIG5leHQgRlVUVVJFVEFTSyBpZiAhJEZ1dHVyZVRhc2s7CiAgICAgICAgICAgIG5leHQgRlVUVVJFVEFTSyBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEZ1dHVyZVRhc2spOwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrLT57VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRlbGV0ZSBmdXR1cmUgdGFzayB3aXRoIGlkICRGdXR1cmVUYXNrLT57VGFza0lEfSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIE9UT0JPIGRhZW1vbiBmdXR1cmUgdGFzayBsaXN0IGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgpOwoKICAgICMgY2hlY2sgZm9yIG5vIHVwY29taW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICkgKSB7CgogICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBjaGVjayBmb3IgaW52YWxpZCB0YXNrIGNvdW50IChqdXN0IG9uZSB0YXNrIG1heCBhbGxvd2VkKQogICAgaWYgKCBzY2FsYXIgQEZ1dHVyZVRhc2tMaXN0ID4gMSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0IGlzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrIGxpc3QKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CiAgICAgICAgbXkgJFVwZGF0ZU5lZWRlZCA9IDA7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzaykKICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e1Rhc2tJRH0KICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e0V4ZWN1dGlvblRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgc3RvcmVkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRnV0dXJlVGFza0RhdGEgKSApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0cyBvZiBzdG9yZWQgYW5kIHVwY29taW5nIHRpbWVzIHRvIGNvbXBhcmUuCiAgICAgICAgICAgIG15ICRGdXR1cmVUYXNrVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e05vdGlmeVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFVwY29taW5nQXBwb2ludG1lbnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBEbyBub3RoaW5nIGlmIHRoZSB1cGNvbWluZyBub3RpZmljYXRpb24gdGltZSBlcXVhbHMgdGhlIHN0b3JlZCB2YWx1ZS4KICAgICAgICAgICAgaWYgKCAkVXBjb21pbmdBcHBvaW50bWVudFRpbWVPYmplY3QgIT0gJEZ1dHVyZVRhc2tUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkVXBkYXRlTmVlZGVkKSB7CgogICAgICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzY2hlZHVsZSBuZXcgZnV0dXJlIHRhc2tzIGZvciBub3RpZmljYXRpb24gYWN0aW9ucwogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJPYmplY3QtPlRhc2tBZGQoCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFRhc2tJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2NoZWR1bGUgZnV0dXJlIHRhc2sgZm9yIEFwcG9pbnRtZW50SUQgJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKQoKUHJlcGFyZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIHByZXBhcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IG5vdGlmaWNhdGlvbiBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSA9IHVuZGVmOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICBxdygKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9ICcnOwogICAgfQoKICAgICMgc3BlY2lhbCBjaGVjayBmb3IgcmVsYXRpdmUgdW5pdCBjb3VudCBhcyBpdCBjYW4gYmUgemVybwogICAgIyAoZW1wdHkgYW5kIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgemVybyB0byBhdm9pZCBlcnJvcnMpCiAgICBpZiAoCiAgICAgICAgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gKQogICAgICAgIHx8ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA8PSAwCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA9IDA7CiAgICB9CgogICAgIyBzZXQgZW1wdHkgZGF0ZXRpbWUgc3RyaW5ncyB0byB1bmRlZgogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtIChxdyhOb3RpZmljYXRpb25EYXRlIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgIwogICAgIyB0ZW1wbGF0ZSBTdGFydAogICAgIwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gZXEgJ1N0YXJ0JyApIHsKCiAgICAgICAgIyBzZXR1cCB0aGUgYXBwb2ludG1lbnQgc3RhcnQgZGF0ZSBhcyBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9OwoKICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0IG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJ0cmFjdCBvZmZzZXQgaW4gc2Vjb25kcyBmb3IgbmV3IG5vdGlmaWNhdGlvbiBkYXRlIHRpbWUuCiAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3Q7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBlbmQgdGltZS4KICAgICAgICAgICAgZWxzaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyZW5kJyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBOb3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKPWhlYWQyIEFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKCkKCmNvbXB1dGVzIGV4ZWN1dGlvbiB0aW1lIGZvciBmdXR1cmUgdGFza3Mgb2YgdHlwZSBBcHBvaW50bWVudFRvVGlja2V0IGJhc2VkIG9uIHN0YXJ0IHRpbWUgYW5kIG9mZnNldCBwYXJhbXMKCj1jdXQKCnN1YiBBcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IHRpY2tldCBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIFRpY2tldERhdGUgVGlja2V0VGVtcGxhdGUgVGlja2V0Q3VzdG9tIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBUaWNrZXRDdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSA9IHVuZGVmOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbXB1dGUgZXhlY3V0aW9uIHRpbWUgZm9yIHRhc2sKICAgICMgcHJlcGFyZSBwb3NzaWJsZSB0aWNrZXQgcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSBUaWNrZXRDdXN0b20gVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0CiAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KFRpY2tldERhdGUgVGlja2V0Q3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfTsKCiAgICAjCiAgICAjIHRlbXBsYXRlIFN0YXJ0CiAgICAjCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfSBlcSAnU3RhcnQnICkgewoKICAgICAgICAjIHNldHVwIHRoZSBhcHBvaW50bWVudCBzdGFydCBkYXRlIGFzIHRpY2tldCBkYXRlCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9OwoKICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0IG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgU3VidHJhY3Qgb2Zmc2V0IGluIHNlY29uZHMgZm9yIG5ldyBub3RpZmljYXRpb24gZGF0ZSB0aW1lLgogICAgICAgICRTdGFydFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgQ3VzdG9tCiAgICAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIHJlbGF0aXZlIGlucHV0LgogICAgICAgIGlmICggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewoKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRDb3VudCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXQgICAgICA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0UG9pbnQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfTsKCiAgICAgICAgICAgICMgc2V0dXAgdGhlIGNvdW50IHRvIGNvbXB1dGUgZm9yIHRoZSBvZmZzZXQKICAgICAgICAgICAgbXkgJVVuaXRPZmZzZXRDb21wdXRlID0gKAogICAgICAgICAgICAgICAgbWludXRlcyA9PiA2MCwKICAgICAgICAgICAgICAgIGhvdXJzICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIGRheXMgICAgPT4gODY0MDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkVGlja2V0TG9jYWxUaW1lT2JqZWN0OwoKICAgICAgICAgICAgIyBDb21wdXRlIGZyb20gc3RhcnQgdGltZS4KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJzdGFydCcgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewogICAgICAgICAgICAgICAgJFRpY2tldExvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBOb3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIHRpY2tldCBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFRpY2tldExvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgdGlja2V0IGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQogICAgcmV0dXJuICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9OwoKfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0Cgo9aGVhZDIgQXBwb2ludG1lbnROb3RpZmljYXRpb24oKQoKV2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlIE9UT0JPIGRhZW1vbiB0byBmaXJlIGV2ZW50cyBmb3IgYXBwb2ludG1lbnRzLAp0aGF0IHJlYWNoZXMgaXQncyByZW1pbmRlciAobm90aWZpY2F0aW9uKSB0aW1lLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudE5vdGlmaWNhdGlvbigpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIG5vdGlmeSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudE5vdGlmaWNhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTm90aWZ5VGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAkUGFyYW17Tm90aWZ5VGltZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICk7CgogICAgIyBzbGVlcCBhdCBsZWFzdCAxIHNlY29uZCB0byBtYWtlIHN1cmUgdGhlIHRpbWVzdGFtcCBkb2Vzbid0CiAgICAjIGVxdWFscyB0aGUgbGFzdCBvbmUgZm9yIHVwZGF0ZSB1cGNvbWluZyBmdXR1cmUgdGFza3MKICAgIHNsZWVwIDE7CgogICAgVVBDT01JTkdBUFBPSU5UTUVOVDoKICAgIGZvciBteSAkVXBjb21pbmdBcHBvaW50bWVudCAoQFVwY29taW5nQXBwb2ludG1lbnRzKSB7CgogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhJFVwY29taW5nQXBwb2ludG1lbnQ7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkVXBjb21pbmdBcHBvaW50bWVudCk7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICAjIGZpcmUgZXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnROb3RpZmljYXRpb24nLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50LT57Q2FsZWRhcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSAvLyBbXSB9OwoKICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgcmVzZXQgdGhlIHBhcmFtZXRlciBmb3Igb2NjdXJyZW5jZXMKICAgICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRXhjbHVkZX0gPSB1bmRlZjsKCiAgICBteSAkT3JpZ2luYWxTdGFydFRpbWVPYmplY3QgPSAkU3RhcnRUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgbXkgJE9yaWdpbmFsRW5kVGltZU9iamVjdCAgID0gJEVuZFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICBteSAkU3RlcCAgICAgICAgICAgICAgICAgICAgPSAwOwoKICAgICMgdW50aWwgLi4uCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBVTlRJTF9USU1FOgogICAgICAgIHdoaWxlICggJFN0YXJ0VGltZU9iamVjdCA8PSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0ID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBVTlRJTF9USU1FIGlmICEkU3RhcnRUaW1lT2JqZWN0OwogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgJFN0YXJ0VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3Q7CgogICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBTZWNvbmRzID0+CiAgICAgICAgICAgICAgICAgICAgJE9yaWdpbmFsRW5kVGltZU9iamVjdC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCApLT57QWJzb2x1dGVTZWNvbmRzfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICBteSAkRW5kVGltZSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAjIEJ1Z2ZpeDogb24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZS4KICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IFVOVElMX1RJTUUgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAjIHRoZSBBcHBvaW50bWVudENyZWF0ZSBldmVudCB3aWxsIGJlIHRyaWdnZXJlZAogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9ICkgewoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9IC0gMSApIHsKICAgICAgICAgICAgJFN0ZXAgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJpbmcgdGltZXMKICAgICAgICAgICAgJFN0YXJ0VGltZU9iamVjdCA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICA9PiAkU3RlcCwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxTdGFydFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgISRTdGFydFRpbWVPYmplY3Q7CgogICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBTZWNvbmRzID0+CiAgICAgICAgICAgICAgICAgICAgJE9yaWdpbmFsRW5kVGltZU9iamVjdC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCApLT57QWJzb2x1dGVTZWNvbmRzfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICBteSAkRW5kVGltZSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAjIEJ1Z2ZpeDogb24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZS4KICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IENPVU5UIGlmIGdyZXAgeyAkU3RhcnRUaW1lIGVxICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICAgICAgICAgJFNlbGYtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCggQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9ICk7CiAgICBteSBAQXBwb2ludG1lbnRMaXN0ICAgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmVudEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgIFBhcmVudElEICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICk7CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgaWYgcHJlc2VudAogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgQXBwb2ludG1lbnRUaWNrZXQgY291bG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBwYXJlbnRfaWQgPSA/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte1BhcmVudElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0V4Y2x1ZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhcmVudElEIFJlY3VycmVuY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICREQk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCByZWN1cl9leGNsdWRlIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBnZXQgZXhpc3RpbmcgZXhjbHVzaW9ucwogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gc3BsaXQoIC8sLywgJFJvd1swXSApIGlmICRSb3dbMF07CiAgICB9CiAgICBwdXNoIEBSZWN1cnJlbmNlRXhjbHVkZSwgJFBhcmFte1JlY3VycmVuY2VJRH07CiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzb3J0IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIGpvaW4gaW50byBzdHJpbmcKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZTsKICAgIGlmIChAUmVjdXJyZW5jZUV4Y2x1ZGUpIHsKICAgICAgICAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApOwogICAgfQoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudCBTRVQgcmVjdXJfZXhjbHVkZSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRSZWN1cnJlbmNlRXhjbHVkZSwgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCBjYWxlbmRhcl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkID0gPyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDYWxlbmRhcklEOwp9CgpzdWIgX0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCByZWN1cl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkID0gPyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFJlY3VycmVuY2VJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZWN1cnJlbmNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUmVjdXJyZW5jZUlEOwp9CgpzdWIgX0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudCBTdGVwIE9yaWdpbmFsVGltZSBDdXJyZW50VGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPcmlnaW5hbFRpbWVPYmplY3QgPSAkUGFyYW17T3JpZ2luYWxUaW1lfTsKCiAgICAjIFdlIHdpbGwgbW9kaWZ5IHRoaXMgb2JqZWN0IHRocm91Z2hvdXQgdGhlIGZ1bmN0aW9uLgogICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKCiAgICAgICAgIyBBZGQgb25lIGRheS4KICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScgKSB7CgogICAgICAgICMgQWRkIDcgZGF5cy4KICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiA3LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknICkgewogICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICMgUmVtZW1iZXIgc3RhcnQgZGF5LgogICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIEFkZCBtb250aHMgYmFzZWQgb24gY3VycmVudCBzdGVwLgogICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBNb250aHMgPT4gJFBhcmFte1N0ZXB9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGVuZCBkYXkuCiAgICAgICAgbXkgJEVuZERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIENoZWNrIGlmIG1vbnRoIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF5cyAoZm9yIGV4YW1wbGU6IEphbnVhcnkgMzEgKyAxIG1vbnRoID0gTWFyY2ggMSkuCiAgICAgICAgaWYgKCAkU3RhcnREYXkgIT0gJEVuZERheSApIHsKICAgICAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5TdWJ0cmFjdCgKICAgICAgICAgICAgICAgIERheXMgPT4gJEVuZERheSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRDdXJyZW50VGltZU9iamVjdCA9ICRUZW1wVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnWWVhcmx5JyApIHsKICAgICAgICBteSAkVGVtcFRpbWVPYmplY3QgPSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5DbG9uZSgpOwoKICAgICAgICAjIFJlbWVtYmVyIHN0YXJ0IGRheS4KICAgICAgICBteSAkU3RhcnREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgIyBBZGQgeWVhcnMgYmFzZWQgb24gY3VycmVudCBzdGVwLgogICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBZZWFycyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZW5kIGRheS4KICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQ2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAxKS4KICAgICAgICBpZiAoICRTdGFydERheSAhPSAkRW5kRGF5ICkgewogICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21EYWlseScgKSB7CgogICAgICAgICMgQWRkIG51bWJlciBvZiBkYXlzLgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgZWFjaCBuLXRoIE1vbmRheSBhbmQgRnJpZGF5CgogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgIyBsb29wIHVwIHRvIDcqbiB0aW1lcyAoNyBkYXlzIGluIHdlZWsgKiBmcmVxdWVuY3kpCiAgICAgICAgTE9PUDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgNyAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgb25lIGRheS4KICAgICAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ1dEaWZmID0gJFNlbGYtPl9DV0RpZmYoCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJEN1cnJlbnRUaW1lT2JqZWN0LAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFRpbWVPYmplY3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IExPT1AgaWYgJENXRGlmZiAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgbXkgJFdlZWtEYXkgPSAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57RGF5T2ZXZWVrfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgU3lzdGVtVGltZSBtYXRjaCByZXF1aXJlbWVudHMKICAgICAgICAgICAgaWYgKCBncmVwIHsgJFdlZWtEYXkgPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IExPT1A7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQoKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICMgT2NjdXJzIGV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5CiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICAjIGxvb3AgdGhyb3VnaCBlYWNoIGRheSAobWF4IG9uZSB5ZWFyKSwgYW5kIGNoZWNrIGlmIGRheSBtYXRjaGVzLgogICAgICAgIERBWToKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgMzEgKiAzNjY7ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIERheXMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2tpcCBtb250aCBpZiBuZWVkZWQKICAgICAgICAgICAgbmV4dCBEQVkKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e01vbnRofSAtICRPcmlnaW5hbFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9ICkKICAgICAgICAgICAgICAgICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIG5leHQgZGF5IGlmIHRoaXMgZGF5IHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgIG5leHQgREFZCiAgICAgICAgICAgICAgICBpZiAhZ3JlcCB7ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXl9ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IERBWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgT2NjdXJzIGVhY2ggM3RoIHllYXIsIEphbnVhcnkgMTh0aCBhbmQgTWFyY2ggMTh0aAogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKICAgICAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJE5leHREYXlPYmplY3QgPSAkQ3VycmVudFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgJE5leHREYXlPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICk7CgogICAgICAgIE1PTlRIOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMTs7ICRDb3VudGVyKysgKSB7CiAgICAgICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICAgICAjIHJlbWVtYmVyIHN0YXJ0IGRheQogICAgICAgICAgICBteSAkU3RhcnREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgTW9udGhzID0+ICRDb3VudGVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgZW5kIGRheQogICAgICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICAgICAjIGNoZWNrIGlmIG1vbnRoIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF5cyAoZm9yIGV4YW1wbGU6IGphbnVhcnkgMzEgKyAxIG1vbnRoID0gbWFyY2ggMDEpCiAgICAgICAgICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CiAgICAgICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIERheXMgPT4gJEVuZERheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDdXJyZW50VGltZU9iamVjdCA9ICRUZW1wVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGlzIHRpbWUsIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGNoZWNrZWQKICAgICAgICAgICAgbmV4dCBNT05USCBpZiAkQ3VycmVudFRpbWVPYmplY3QgPCAkTmV4dERheU9iamVjdDsKCiAgICAgICAgICAgICMgY2hlY2sgbG9vcCBjb25kaXRpb25zIChhY2NvcmRpbmcgdG8gVW50aWwgLyApCiAgICAgICAgICAgIGlmICgkUmVjdXJyZW5jZVVudGlsT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRIIGlmICRDdXJyZW50VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRICiAgICAgICAgICAgICAgICAgICAgaWYgJENvdW50ZXIKICAgICAgICAgICAgICAgICAgICA+IDEyICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0gKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB5ZWFyIGlzIE9LCiAgICAgICAgICAgIG5leHQgTU9OVEgKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9IC0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntZZWFyfSApCiAgICAgICAgICAgICAgICAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBuZXh0IG1vbnRoIGlmIHRoaXMgbW9udGggc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBNT05USAogICAgICAgICAgICAgICAgaWYgIWdyZXAgeyAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IE1PTlRIOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJEN1cnJlbnRUaW1lT2JqZWN0Owp9Cgo9aGVhZDIgX1RpbWVDaGVjaygpCgpDaGVjayBpZiBUaW1lIGFuZCBPcmlnaW5hbFRpbWUgaGF2ZSBzYW1lIGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kIHZhbHVlLCBhbmQgcmV0dXJuIHRpbWVzdGFtcCB3aXRoCnZhbHVlcyAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGFzIGluIFRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgIE9yaWdpbmFsVGltZSA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsICAgICAjIChyZXF1aXJlZCkKICAgICAgICBUaW1lICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDI6MDAnLCAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKUmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMi0wMSAwMDowMTowMCc7Cgo9Y3V0CgpzdWIgX1RpbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhPcmlnaW5hbFRpbWUgVGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICggJE9yaWdpbmFsRGF0ZSwgJE9yaWdpbmFsVGltZSApID0gJFBhcmFte09yaWdpbmFsVGltZX0gPX4gbS8oLio/KVxzKC4qPykkLzsKICAgIG15ICgkRGF0ZSkgPSAkUGFyYW17VGltZX0gPX4gbS8oLio/KVxzKC4qPykkLzsKCiAgICByZXR1cm4gIiREYXRlICRPcmlnaW5hbFRpbWUiOwp9Cgo9aGVhZDIgX0NXRGlmZigpCgpSZXR1cm5zIGhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGhhcyBwYXNzZWQgYmV0d2VlbiB0d28gdW5peCB0aW1lcy4KCiAgICBteSAkQ1dEaWZmID0gJFNlbGYtPl9DV0RpZmYoCiAgICAgICAgQ3VycmVudFRpbWUgID0+ICRDdXJyZW50VGltZU9iamVjdCwgICAgIChyZXF1aXJlZCkgRGF0ZSB0aW1lIG9iamVjdCB3aXRoIGN1cnJlbnQgdGltZQogICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxUaW1lT2JqZWN0LCAgICAocmVxdWlyZWQpIERhdGUgdGltZSBvYmplY3Qgd2l0aCBvcmlnaW5hbCB0aW1lCiAgICApOwoKcmV0dXJuczoKICAgICRDV0RpZmYgPSA1OwoKPWN1dAoKc3ViIF9DV0RpZmYgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ3VycmVudFRpbWUgT3JpZ2luYWxUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE9yaWdpbmFsVGltZU9iamVjdCA9ICRQYXJhbXtPcmlnaW5hbFRpbWV9OwogICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ICA9ICRQYXJhbXtDdXJyZW50VGltZX07CgogICAgbXkgJFN0YXJ0WWVhciA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn07CiAgICBteSAkRW5kWWVhciAgID0gJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9OwoKICAgIG15ICRSZXN1bHQgPSAkQ3VycmVudFRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpCiAgICAgICAgLSAkT3JpZ2luYWxUaW1lT2JqZWN0LT57Q1BBTkRhdGVUaW1lT2JqZWN0fS0+d2Vla19udW1iZXIoKTsKCiAgICAjIElmIGRhdGUgaXMgZW5kIG9mIHRoZSB5ZWFyIGFuZCBkYXRlIENXIHN0YXJ0cyB3aXRoIDEsIHdlIG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIHllYXIuCiAgICBpZiAoICRSZXN1bHQgPCAwICYmICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXl9ID09IDMxICYmICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntNb250aH0gPT0gMTIgKSB7CiAgICAgICAgJEVuZFllYXIrKzsKICAgIH0KCiAgICBmb3IgbXkgJFllYXIgKCAkU3RhcnRZZWFyIC4uICRFbmRZZWFyIC0gMSApIHsKICAgICAgICBteSAkQ1cgID0gMDsKICAgICAgICBteSAkRGF5ID0gMzE7CgogICAgICAgIHdoaWxlICggJENXIDwgNTAgKSB7CgogICAgICAgICAgICAjIFRvIGdldCBob3cgbWFueSBDVydzIGFyZSBpbiB0aGlzIHllYXIsIHdlIHNldCB0ZW1wb3JhcnkgZGF0ZSB0byAzMS1kZWMuCiAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICIkWWVhci0xMi0kRGF5IDIzOjU5OjAwIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ1cgPSAkRGF0ZVRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpOwogICAgICAgICAgICAkRGF5LS07CiAgICAgICAgfQoKICAgICAgICAkUmVzdWx0ICs9ICRDVzsKICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWVuZCBJbnRlcm5hbDoKCj1jdXQKCjE7Cg==</File>
        <File Location="Custom/Kernel/System/Daemon/SchedulerDB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAwMzMwYjQ3MGExMGVmN2FkY2I4ZTdmODk0ZjBkM2Y2NzU5OWZiODIzIC0gS2VybmVsL1N5c3RlbS9EYWVtb24vU2NoZWR1bGVyREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKdXNlIFRpbWU6OkhpUmVzICAoKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCIC0gU2NoZWR1bGVyIGRhdGFiYXNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpJbmNsdWRlcyBhbGwgc2NoZWR1bGVyIHJlbGF0ZWQgZGF0YWJhc2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGEgc2NoZWR1bGVyIGRhdGFiYXNlIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJFNjaGVkdWxlckRCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgVGFza0FkZCgpCgphZGQgYSBuZXcgdGFzayB0byBzY2hlZHVsZXIgdGFzayBsaXN0CgogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0FkZCgKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLCAgICAgIyBlLiBnLiBHZW5lcmljSW50ZXJmYWNlLCBUZXN0CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdhbnkgbmFtZScsICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBBdHRlbXB0cyAgICAgICAgICAgICAgICAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAxKQogICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApLCBudW1iZXIgb2YgdGFza3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHdpdGggdGhlIHNhbWUgdHlwZSAoYW5kIG5hbWUgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHByb3ZpZGVkKSB0aGF0IGNhbiBleGlzdHMgYXQgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRpbWUsIHZhbHVlIG9mIDAgbWVhbnMgdW5saW1pdGVkCiAgICAgICAgRGF0YSA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGF0YSBwYXlsb2FkCiAgICAgICAgICAgIC4uLgogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICBteSAkVGFza0lEID0gMTIzOyAgIyBmYWxzZSBpbiBjYXNlIG9mIGFuIGVycm9yIG9yIC0xIGluIGNhc2Ugb2YgcmVhY2ggTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzCgo9Y3V0CgpzdWIgVGFza0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoVHlwZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ICYmICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ID1+IG17XEEgXGQrIFx6fW1zeCApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIHdvcmtlciB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKICAgICAgICBteSBATGlzdCA9ICRTZWxmLT5UYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEZpbHRlcmVkTGlzdCA9IEBMaXN0OwoKICAgICAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IGRvZXMgbm90IG1hdGNoIHNwZWNpZmllZCB0YXNrIG5hbWUKICAgICAgICAgICAgQEZpbHRlcmVkTGlzdCA9IGdyZXAgeyAkXy0+e05hbWV9IGVxICRQYXJhbXtOYW1lfSB9IEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjb21wYXJlIHRoZSBudW1iZXIgb2YgdGFzayB3aXRoIHRoZSBtYXhpbXVtIHBhcmFsbGVsIGxpbWl0CiAgICAgICAgcmV0dXJuIC0xIGlmIHNjYWxhciBARmlsdGVyZWRMaXN0ID49ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgb2YgYXR0ZW1wdHMgcGFyYW1ldGVyCiAgICAkUGFyYW17QXR0ZW1wdHN9IHx8PSAxOwoKICAgICMgc2VyaWFsaXplIGRhdGEgYXMgc3RyaW5nCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgZW5jb2RlIHRhc2sgZGF0YQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJERhdGEpOwogICAgJERhdGEgPSBlbmNvZGVfYmFzZTY0KCREYXRhKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJElkZW50aWZpZXI7CiAgICBUUlk6CiAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMTAgKSB7CgogICAgICAgICMgY2FsY3VsYXRlIGEgdGFzayBpZGVudGlmaWVyCiAgICAgICAgJElkZW50aWZpZXIgPSAkU2VsZi0+X0dldElkZW50aWZpZXIoKTsKCiAgICAgICAgIyBpbnNlcnQgdGhlIHRhc2sgKGluaXRpYWxseSBsb2NrZWQgd2l0aCBsb2NrX2tleSA9IDEgc28gaXQgd2lsbCBub3QgYmUgdGFrZW4gYnkgYW55IHdvcmtlcgogICAgICAgICMgICBhdCB0aGlzIG1vbWVudCkKICAgICAgICBsYXN0IFRSWSBpZiAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cywgbG9ja19rZXksIGNyZWF0ZV90aW1lKQogICAgICAgICAgICAgICAgVkFMVUVTCiAgICAgICAgICAgICAgICAgICAgKD8sID8sID8sID8sID8sIDEsIGN1cnJlbnRfdGltZXN0YW1wKScsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRJZGVudGlmaWVyLAogICAgICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICBcJERhdGEsCiAgICAgICAgICAgICAgICBcJFBhcmFte0F0dGVtcHRzfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRhc2sgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZGVudCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJElkZW50aWZpZXIgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgdGFzayBpZAogICAgbXkgJFRhc2tJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUYXNrSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdW5sb2NrIHRoZSB0YXNrLCBmb3Igbm93IG9uIHRoZSB0YXNrIGNhbiBiZSB0YWtlbiBieSBhbnkgd29ya2VyCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMSBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRUYXNrSUQsCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuICRUYXNrSUQ7Cn0KCj1oZWFkMiBUYXNrR2V0KCkKCmdldCBzY2hlZHVsZXIgdGFzawoKICAgIG15ICVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrR2V0KAogICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAlVGFzayA9ICgKICAgICAgICBUYXNrSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ2FueSBuYW1lJywKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgQXR0ZW1wdHMgICAgICAgPT4gMTAsCiAgICAgICAgTG9ja0tleSAgICAgICAgPT4gJ1hZWicsCiAgICAgICAgTG9ja1RpbWUgICAgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDEnLAogICAgICAgIExvY2tVcGRhdGVUaW1lID0+ICcyMDExLTAyLTA4IDE1OjA4OjAxJywKICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICApOwoKPWN1dAoKc3ViIFRhc2tHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRhc2tJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGFzayBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgbmFtZSwgdGFza190eXBlLCB0YXNrX2RhdGEsIGF0dGVtcHRzLCBsb2NrX2tleSwgbG9ja190aW1lLCBsb2NrX3VwZGF0ZV90aW1lLAogICAgICAgICAgICAgICAgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBnZXQgc3RvcmFibGUgb2JqZWN0CiAgICBteSAkU3RvcmFibGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKTsKCiAgICBteSAlVGFzazsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBkZWNvZGUgdGFzayBkYXRhCiAgICAgICAgbXkgJERlY29kZWREYXRhID0gZGVjb2RlX2Jhc2U2NCggJERhdGFbMl0gKTsKCiAgICAgICAgIyBkZXNlcmlhbGl6ZSBkYXRhCiAgICAgICAgbXkgJERhdGFQYXJhbSA9ICRTdG9yYWJsZU9iamVjdC0+RGVzZXJpYWxpemUoIERhdGEgPT4gJERlY29kZWREYXRhICk7CgogICAgICAgIGlmICggISREYXRhUGFyYW0gKSB7CgogICAgICAgICAgICAjIGVycm9yIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnVGFzayBkYXRhIGlzIG5vdCBpbiBhIGNvcnJlY3Qgc3RvcmFibGUgZm9ybWF0ISBUYXNrSUQ6ICcgLiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGRhbWFnZWQgdGFzawogICAgICAgICAgICAkU2VsZi0+VGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICAgICAgICA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiAkRGF0YVBhcmFtIHx8IHt9LAogICAgICAgICAgICBBdHRlbXB0cyAgICAgICA9PiAkRGF0YVszXSwKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgPT4gJERhdGFbNF0gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgPT4gJERhdGFbNV0gLy8gJycsCiAgICAgICAgICAgIExvY2tVcGRhdGVUaW1lID0+ICREYXRhWzZdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkRGF0YVs3XSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGFzazsKfQoKPWhlYWQyIFRhc2tEZWxldGUoKQoKZGVsZXRlIGEgdGFzayBmcm9tIHNjaGVkdWxlciB0YXNrIGxpc3QKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0RlbGV0ZSgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUYXNrRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0YXNrIGZyb20gdGhlIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2Ygc2NoZWR1bGVyIHRhc2tzCgogICAgbXkgQExpc3QgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ3NvbWUgdHlwZScsICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJuczoKCiAgICBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICAgICAgICAgIE5hbWUgICA9PiAnYW55IG5hbWUnLAogICAgICAgICAgICBUeXBlICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgPT4gNDU2LAogICAgICAgICAgICBOYW1lICAgPT4gJ2FueSBvdGhlciBuYW1lJywKICAgICAgICAgICAgVHlwZSAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICApOwoKPWN1dAoKc3ViIFRhc2tMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIHRhc2tfdHlwZSBGUk9NIHNjaGVkdWxlcl90YXNrJzsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHR5cGUKICAgIGlmICggJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB0YXNrX3R5cGUgPSA/JzsKICAgICAgICBAQmluZCA9ICggXCRQYXJhbXtUeXBlfSApOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBUYXNrSUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkUm93WzJdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aGVhZDIgVGFza0xpc3RVbmxvY2tlZCgpCgpnZXQgYSBsaXN0IG9mIHVubG9ja2VkIHRhc2tzLCB0aGF0IGlzIHRhc2tzIHRoYXQgYXJlIHF1ZXVlZCBmb3Igd29yawoKICAgIG15IEBUYXNrTGlzdCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xpc3RVbmxvY2tlZCgpOwoKUmV0dXJuczoKCiAgICBAVGFza0xpc3QgPSAoIDQ1NiwgNzg5LCAzOTUgKTsKCj1jdXQKCnN1YiBUYXNrTGlzdFVubG9ja2VkIHsKICAgIG15ICgkU2VsZikgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgbXkgQFRhc2tJRHMgPSAkREJPYmplY3QtPlNlbGVjdENvbEFycmF5KAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gc2NoZWR1bGVyX3Rhc2sgV0hFUkUgbG9ja19rZXkgPSAwIE9SREVSIEJZIGlkIEFTQycsCiAgICApOwoKICAgIHJldHVybiBAVGFza0lEczsKfQoKPWhlYWQyIFRhc2tMb2NrKCkKCmxvY2tzIHRhc2sgdG8gYSBzcGVjaWZpYyBQSUQKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xvY2soCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICAgICBOb2RlSUQgPT4gMSwgICAgIyB0aGUgaWQgb24gdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgID0+IDQ1NiwgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHdvcmtlciB0aGF0IGlzIGxvY2tpbmcgdGhlIHRhc2sKICAgICk7Cgo9Y3V0CgpzdWIgVGFza0xvY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KFRhc2tJRCBOb2RlSUQgUElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbG9jayBrZXkKICAgIG15ICRMb2NrS2V5Tm9kZUlEID0gc3ByaW50ZiAnJTAzZCcsICRQYXJhbXtOb2RlSUR9OwogICAgbXkgJExvY2tLZXlQSUQgICAgPSBzcHJpbnRmICclMDhkJywgJFBhcmFte1BJRH07CiAgICBteSAkTG9ja0tleSAgICAgICA9ICcxJyAuICRMb2NrS2V5Tm9kZUlEIC4gJExvY2tLZXlQSUQ7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBsb2NrZWQgdGFzawogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGxvY2tfa2V5IEZST00gc2NoZWR1bGVyX3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExvY2tLZXlGcm9tREJCZWZvcmUgPSAnJzsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9ja0tleUZyb21EQkJlZm9yZSA9ICREYXRhWzBdIHx8ICcnOwogICAgfQoKICAgIHJldHVybiAxIGlmICRMb2NrS2V5RnJvbURCQmVmb3JlIGVxICRMb2NrS2V5OwoKICAgICMgbG9jayB0aGUgdGFzayBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSA/LCBsb2NrX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgbG9ja191cGRhdGVfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMCBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICBcJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgbG9ja2VkIHRhc2sKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBsb2NrX2tleSwgYXR0ZW1wdHMgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9ja0tleUZyb21EQiA9ICcnOwogICAgbXkgJEF0dGVtcHRzICAgICAgPSAwOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb2NrS2V5RnJvbURCID0gJERhdGFbMF07CiAgICAgICAgJEF0dGVtcHRzICAgICAgPSAkRGF0YVsxXTsKICAgIH0KCiAgICByZXR1cm4gaWYgJExvY2tLZXlGcm9tREIgbmUgJExvY2tLZXk7CgogICAgIyByZW1vdmUgdGFzayBpZiBhdHRlbXB0cyBpcyAwCiAgICBpZiAoICEkQXR0ZW1wdHMgKSB7CiAgICAgICAgJFNlbGYtPlRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJEF0dGVtcHRzLS07CgogICAgICAgICMgZGVjcmVtZW50IG51bWJlciBvZiBhdHRlbXB0cwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBhdHRlbXB0cyA9ID8KICAgICAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gPyBBTkQgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJEF0dGVtcHRzLAogICAgICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrQ2xlYW51cCgpCgpkZWxldGVzIG9ic29sZXRlIHdvcmtlciB0YXNrcwoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrQ2xlYW51cCgpOwoKPWN1dAoKc3ViIFRhc2tDbGVhbnVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQExpc3QgPSAkU2VsZi0+VGFza0xpc3QoKTsKCiAgICBUQVNLSVRFTToKICAgIGZvciBteSAkVGFza0l0ZW0gKEBMaXN0KSB7CgogICAgICAgIG15ICVUYXNrID0gJFNlbGYtPlRhc2tHZXQoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza0l0ZW0tPntUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGRvZXMgbm90IGhhdmUgYSBsb2NrIGtleQogICAgICAgIG5leHQgVEFTS0lURU0gdW5sZXNzICRUYXNre0xvY2tLZXl9OwoKICAgICAgICAjIHNraXAgaWYgdGhlIGxvY2sga2V5IGlzIGludmFsaWQKICAgICAgICBuZXh0IFRBU0tJVEVNIGlmICRUYXNre0xvY2tLZXl9IDwgMTsKCiAgICAgICAgIyBnZXQgc3lzdGVtIHRpbWUKICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CgogICAgICAgICMgZ2V0IGV4cGlyYXRpb24gdGltZS4gNyBkYXlzIGFnbyBzeXN0ZW0gdGltZQogICAgICAgIG15ICRFeHBpcmVkVGltZSA9ICRTeXN0ZW1UaW1lIC0gKCA2MCAqIDYwICogMjQgKiA3ICk7CgogICAgICAgIG15ICRMb2NrVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUYXNre0xvY2tUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTG9ja1RpbWUgPSAkTG9ja1RpbWUgPyAkTG9ja1RpbWUtPlRvRXBvY2goKSA6IDA7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGlzIG5vdCBleHBpcmVkCiAgICAgICAgbmV4dCBUQVNLSVRFTSBpZiAkTG9ja1RpbWUgPiAkRXhwaXJlZFRpbWU7CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza3tUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRlbGV0ZSB0YXNrICRUYXNre05hbWV9LSRUYXNre1R5cGV9ICgkVGFza3tUYXNrSUR9KVxuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSB0YXNrcyBmcm9tIHRoZSB3b3JrZXIgdGFzayB0YWJsZSBkaXZpZGVkIGludG8gaGFuZGxlZCBhbmQgdW5oYW5kbGVkCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tTdW1tYXJ5KCk7Cgo9Y3V0CgpzdWIgVGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuICgpIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUsIGxvY2tfa2V5LCBsb2NrX3RpbWUsIGNyZWF0ZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIExvY2tLZXkgICAgPT4gJFJvd1szXSAvLyAwLAogICAgICAgICAgICBMb2NrVGltZSAgID0+ICRSb3dbNF0gLy8gJycsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFJvd1s1XSwKICAgICAgICB9OwogICAgfQoKICAgIG15IEBIYW5kbGVkVGFza3M7CiAgICBteSBAVW5oYW5kbGVkVGFza3M7CgogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgIFRBU0s6CiAgICBmb3IgbXkgJFRhc2sgKEBMaXN0KSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIHRhc2sgaXMgdW5sb2NrZWQgb3IgbG9jayBrZXkgaXMgbm90IHZhbGlkICh1bmhhbmRsZWQgdGFza3MpCiAgICAgICAgaWYgKCAkVGFzay0+e0xvY2tLZXl9IDwgMSApIHsKICAgICAgICAgICAgcHVzaCBAVW5oYW5kbGVkVGFza3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFRhc2stPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJFRhc2stPntUeXBlfSwKICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFRhc2stPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIE5vZGVJRCBhbmQgUHJvY2Vzc0lEIGZyb20gdGhlIGxvY2sga2V5CiAgICAgICAgICAgIG15ICggJE5vZGVJRCwgJFByb2Nlc3NJRCApID0gJFRhc2stPntMb2NrS2V5fSA9fiBte1xBIDEgKFxkezN9KSAoXGR7OH0pIFx6fW1zeDsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIGR1cmF0aW9uIGZyb20gbG9jayB0aW1lCiAgICAgICAgICAgIG15ICRDdXJyZW50RHVyYXRpb247CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkVGFzay0+e0xvY2tUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NrU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUYXNrLT57TG9ja1RpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExvY2tTeXN0ZW1UaW1lID0gJExvY2tTeXN0ZW1UaW1lID8gJExvY2tTeXN0ZW1UaW1lLT5Ub0Vwb2NoKCkgOiAwOwoKICAgICAgICAgICAgICAgICRDdXJyZW50RHVyYXRpb24gPSAkU2VsZi0+X1NlY29uZHMyU3RyaW5nKCAkU3lzdGVtVGltZSAtICRMb2NrU3lzdGVtVGltZSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBIYW5kbGVkVGFza3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkVGFzay0+e05hbWV9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgID0+ICRUYXNrLT57VHlwZX0sCiAgICAgICAgICAgICAgICBOb2RlSUQgICAgICAgICAgPT4gJE5vZGVJRCwKICAgICAgICAgICAgICAgIFByb2Nlc3NJRCAgICAgICA9PiAkUHJvY2Vzc0lELAogICAgICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgID0+ICRUYXNrLT57TG9ja1RpbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgID0+ICRUYXNrLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICBDdXJyZW50RHVyYXRpb24gPT4gJEN1cnJlbnREdXJhdGlvbgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIHsKICAgICAgICAgICAgSGVhZGVyID0+ICdVbmhhbmRsZWQgV29ya2VyIFRhc2tzOicsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFxAVW5oYW5kbGVkVGFza3MsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gJ1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3Mgd2FpdGluZyB0byBiZSBleGVjdXRlZC4nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBIZWFkZXIgPT4gJ0hhbmRsZWQgV29ya2VyIFRhc2tzOicsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05vZGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ05JRCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1Byb2Nlc3NJRCcsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ1BJRCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gOSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnREdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ0R1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXEBIYW5kbGVkVGFza3MsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gJ1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3MgYmVpbmcgZXhlY3V0ZWQuJywKICAgICAgICB9LAogICAgKTsKfQoKPWhlYWQyIFRhc2tMb2NrVXBkYXRlKCkKCnNldHMgdGhlIHRhc2sgbG9jayB1cGRhdGUgdGltZSBhcyBjdXJyZW50IHRpbWUgZm9yIHRoZSBzcGVjaWZpZWQgdGFza3MKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xvY2tVcGRhdGUoCiAgICAgICAgVGFza0lEcyA9PiBbMTIzLCA0NTZdLAogICAgKTsKCj1jdXQKCnN1YiBUYXNrTG9ja1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtUYXNrSURzfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGFza0lEcyBpcyBtaXNzaW5nIG9yIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkVGFza0lEcyA9IGpvaW4gJywnLCBtYXAgeyAkREJPYmplY3QtPlF1b3RlKCAkXywgJ0ludGVnZXInICkgfSBAeyAkUGFyYW17VGFza0lEc30gfTsKCiAgICByZXR1cm4gMSBpZiAhJFRhc2tJRHM7CgogICAgIyBzZXQgbG9jayB1cGRhdGUgdGltZSBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAiCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja191cGRhdGVfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGlkIElOICggJFRhc2tJRHMgKSIsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGFza1VubG9ja0V4cGlyZWQoKQoKcmVtb3ZlIGxvY2sgc3RhdHVzIGZvciB3b3JraW5nIHRhc2tzIHRoYXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXRzIGxvY2sgdXBkYXRlIHRpbWUgZm9yIG1vcmUgdGhhbiA1IG1pbnV0ZXMKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza1VubG9ja0V4cGlyZWQoKTsKCj1jdXQKCnN1YiBUYXNrVW5sb2NrRXhwaXJlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UgKGdldCBhbGwgd29ya2VyIHRhc2tzIHdpdGggYSBsb2NrIGtleSBkaWZmZXJlbnQgdGhhbiAwKQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCBsb2NrX3VwZGF0ZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPD4gMAogICAgICAgICAgICAgICAgQU5EIGxvY2tfa2V5IDw+IDEKICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgICAgICAjIGNvbnZlcnQgbG9jayB1cGRhdGUgdGltZSBzdGFtcCB0byBhIHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJExvY2tVcGRhdGVUaW1lID0gMDsKCiAgICAgICAgaWYgKCAkUm93WzJdICkgewogICAgICAgICAgICAkTG9ja1VwZGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUm93WzJdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExvY2tVcGRhdGVUaW1lID0gJExvY2tVcGRhdGVUaW1lID8gJExvY2tVcGRhdGVUaW1lLT5Ub0Vwb2NoKCkgOiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxvY2sgVXBkYXRlIFRpbWUgbWlzc2luZyBmb3IgdGFzayAkUm93WzFdISAoJFJvd1swXSkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBza2lwIHRhc2sgaWYgaXQgaGFzIGJlZW4gbG9ja2VkIHVwZGF0ZSB0aW1lIGlzIGluIHdpdGhpbiB0aGUgbGFzdCA1IG1pbnV0ZXMKICAgICAgICBuZXh0IFJPVyBpZiAkU3lzdGVtVGltZSAtICRMb2NrVXBkYXRlVGltZSA8ICggNjAgKiA1ICk7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgTG9ja1RpbWUgPT4gJFJvd1syXSwKICAgICAgICB9OwogICAgfQoKICAgICMgc3RvcCBpZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gdW5sb2NrCiAgICByZXR1cm4gMSBpZiAhQExpc3Q7CgogICAgZm9yIG15ICRUYXNrIChATGlzdCkgewoKICAgICAgICAjIHVubG9jayBhbGwgdGhlIHRhc2sgdGhhdCBoYXMgYmVlbiBsb2NrZWQgZm9yIG1vcmUgdGhhbiAxIG1pbnV0ZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwLCBsb2NrX3RpbWUgPSBOVUxMLCBsb2NrX3VwZGF0ZV90aW1lID0gTlVMTAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVGFzay0+e1Rhc2tJRH0sIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tBZGQoKQoKYWRkIGEgbmV3IHRhc2sgdG8gc2NoZWR1bGVyIGZ1dHVyZSB0YXNrIGxpc3QKCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrQWRkKAogICAgICAgIEV4ZWN1dGlvblRpbWUgICAgICAgICAgICA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywgICMgZS4gZy4gR2VuZXJpY0ludGVyZmFjZSwgVGVzdAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnYW55IG5hbWUnLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQXR0ZW1wdHMgICAgICAgICAgICAgICAgID0+IDUsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMSkKICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gMiwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKSwgbnVtYmVyIG9mIHRhc2tzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB3aXRoIHRoZSBzYW1lIHR5cGUgKGFuZCBuYW1lIGlmIHByb3ZpZGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGhhdCBjYW4gZXhpc3RzIGF0IHRoZSBzYW1lIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB2YWx1ZSBvZiAwIG1lYW5zIHVubGltaXRlZAogICAgICAgIERhdGEgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRhdGEgcGF5bG9hZAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgbXkgJFRhc2tJRCA9IDEyMzsgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KEV4ZWN1dGlvblRpbWUgVHlwZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIEV4ZWN1dGlvblRpbWUKCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFeGVjdXRpb25UaW1lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkU3lzdGVtVGltZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4ZWN1dGlvblRpbWUgaXMgaW52YWxpZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgICRTeXN0ZW1UaW1lID0gJFN5c3RlbVRpbWUtPlRvRXBvY2goKTsKCiAgICBpZiAoICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ICYmICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ID1+IG17XEEgXGQrIFx6fW1zeCApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIGZ1dHVyZSB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKICAgICAgICBteSBATGlzdCA9ICRTZWxmLT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEZpbHRlcmVkTGlzdCA9IEBMaXN0OwogICAgICAgIGlmICggJFBhcmFte05hbWV9ICYmIEBMaXN0ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHRhc2tzIHRoYXQgZG9lcyBub3QgbWF0Y2ggc3BlY2lmaWVkIHRhc2sgbmFtZQogICAgICAgICAgICBARmlsdGVyZWRMaXN0ID0gZ3JlcCB7ICggJF8tPntOYW1lfSB8fCAnJyApIGVxICRQYXJhbXtOYW1lfSB9IEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjb21wYXJlIHRoZSBudW1iZXIgb2YgdGFzayB3aXRoIHRoZSBtYXhpbXVtIHBhcmFsbGVsIGxpbWl0CiAgICAgICAgcmV0dXJuIC0xIGlmIHNjYWxhciBARmlsdGVyZWRMaXN0ID49ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgb2YgYXR0ZW1wdHMgcGFyYW1ldGVyCiAgICAkUGFyYW17QXR0ZW1wdHN9IHx8PSAxOwoKICAgICMgc2VyaWFsaXplIGRhdGEgYXMgc3RyaW5nCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgZW5jb2RlIHRhc2sgZGF0YQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJERhdGEpOwogICAgJERhdGEgPSBlbmNvZGVfYmFzZTY0KCREYXRhKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJElkZW50aWZpZXI7CiAgICBUUlk6CiAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMTAgKSB7CgogICAgICAgICMgY2FsY3VsYXRlIGEgdGFzayBpZGVudGlmaWVyCiAgICAgICAgJElkZW50aWZpZXIgPSAkU2VsZi0+X0dldElkZW50aWZpZXIoKTsKCiAgICAgICAgIyBpbnNlcnQgdGhlIGZ1dHVyZSB0YXNrIChpbml0aWFsbHkgbG9ja2VkIHdpdGggbG9ja19rZXkgPSAxIHNvIGl0IHdpbGwgbm90IGJlIHRha2VuIGJ5IGFueQogICAgICAgICMgICAgbW92ZWQgaW50byB3b3JrZXIgdGFzayBsaXN0IGF0IHRoaXMgbW9tZW50KQogICAgICAgIGxhc3QgVFJZIGlmICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIGV4ZWN1dGlvbl90aW1lLCBuYW1lLCB0YXNrX3R5cGUsIHRhc2tfZGF0YSwgYXR0ZW1wdHMsIGxvY2tfa2V5LCBjcmVhdGVfdGltZSkKICAgICAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgICAgICg/LCA/LCA/LCA/LCA/LCA/LCAxLCBjdXJyZW50X3RpbWVzdGFtcCknLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkSWRlbnRpZmllciwKICAgICAgICAgICAgICAgIFwkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgIFwkRGF0YSwKICAgICAgICAgICAgICAgIFwkUGFyYW17QXR0ZW1wdHN9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGFzayBpZAogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzayBXSEVSRSBpZGVudCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJElkZW50aWZpZXIgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgdGFzayBpZAogICAgbXkgJFRhc2tJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUYXNrSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdW5sb2NrIHRoZSB0YXNrLCBmb3Igbm93IG9uIHRoZSB0YXNrIGNhbiBiZSBtb3ZlZCB0byB0aGUgd29ya2VyIHRhc2sgbGlzdAogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9IDAKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSAxIEFORCBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFRhc2tJRCwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gJFRhc2tJRDsKfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0Cgo9aGVhZDIgRnV0dXJlVGFza1VwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIHRhc2sgaW4gdGhlIHNjaGVkdWxlciBmdXR1cmUgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tVcGRhdGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoVGFza0lEIEV4ZWN1dGlvblRpbWUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBFeGVjdXRpb25UaW1lCgogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFN5c3RlbVRpbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeGVjdXRpb25UaW1lIGlzIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkU3lzdGVtVGltZSA9ICRTeXN0ZW1UaW1lLT5Ub0Vwb2NoKCk7CgogICAgaWYgKCAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSAmJiAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSA9fiBte1xBIFxkKyBcen1tc3ggKSB7CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGFsbCBmdXR1cmUgdGFza3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzayB0eXBlCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIG15IEBGaWx0ZXJlZExpc3QgPSBATGlzdDsKICAgICAgICBpZiAoICRQYXJhbXtOYW1lfSAmJiBATGlzdCApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IGRvZXMgbm90IG1hdGNoIHNwZWNpZmllZCB0YXNrIG5hbWUKICAgICAgICAgICAgQEZpbHRlcmVkTGlzdCA9IGdyZXAgeyAoICRfLT57TmFtZX0gfHwgJycgKSBlcSAkUGFyYW17TmFtZX0gfSBATGlzdDsKICAgICAgICB9CgogICAgICAgICMgY29tcGFyZSB0aGUgbnVtYmVyIG9mIHRhc2sgd2l0aCB0aGUgbWF4aW11bSBwYXJhbGxlbCBsaW1pdAogICAgICAgIHJldHVybiAtMSBpZiBzY2FsYXIgQEZpbHRlcmVkTGlzdCA+PSAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IG9mIGF0dGVtcHRzIHBhcmFtZXRlcgogICAgJFBhcmFte0F0dGVtcHRzfSB8fD0gMTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhIGFzIHN0cmluZwogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+U2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIGVuY29kZSB0YXNrIGRhdGEKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCREYXRhKTsKICAgICREYXRhID0gZW5jb2RlX2Jhc2U2NCgkRGF0YSk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIFRSWToKICAgIGZvciBteSAkVHJ5ICggMSAuLiAxMCApIHsKCiAgICAgICAgIyBpbnNlcnQgdGhlIGZ1dHVyZSB0YXNrIChpbml0aWFsbHkgbG9ja2VkIHdpdGggbG9ja19rZXkgPSAxIHNvIGl0IHdpbGwgbm90IGJlIHRha2VuIGJ5IGFueQogICAgICAgICMgICAgbW92ZWQgaW50byB3b3JrZXIgdGFzayBsaXN0IGF0IHRoaXMgbW9tZW50KQogICAgICAgIGxhc3QgVFJZIGlmICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgICAgICBTRVQgZXhlY3V0aW9uX3RpbWUgPSA/LCB0YXNrX2RhdGEgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgICAgICAgICBcJERhdGEsCiAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdGdXR1cmVUYXNrTGlzdFVubG9ja2VkJywgICAgIyBUT0RPIEZJWE1FCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCj1oZWFkMiBGdXR1cmVUYXNrR2V0KCkKCmdldCBzY2hlZHVsZXIgZnV0dXJlIHRhc2sKCiAgICBteSAlVGFzayA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0dldCgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJVRhc2sgPSAoCiAgICAgICAgVGFza0lEICAgICAgICA9PiAxMjMsCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnYW55IG5hbWUnLAogICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIERhdGEgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgQXR0ZW1wdHMgICAgICA9PiAxMCwKICAgICAgICBMb2NrS2V5ICAgICAgID0+ICdYWVonLAogICAgICAgIExvY2tUaW1lICAgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDEnLAogICAgICAgIENyZWF0ZVRpbWUgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDAnLAogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHRhc2sgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgZXhlY3V0aW9uX3RpbWUsIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cywgbG9ja19rZXksIGxvY2tfdGltZSwgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZ2V0IHN0b3JhYmxlIG9iamVjdAogICAgbXkgJFN0b3JhYmxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyk7CgogICAgbXkgJVRhc2s7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIHRhc2sgZGF0YQogICAgICAgIG15ICREZWNvZGVkRGF0YSA9IGRlY29kZV9iYXNlNjQoICREYXRhWzNdICk7CgogICAgICAgICMgZGVzZXJpYWxpemUgZGF0YQogICAgICAgIG15ICREYXRhUGFyYW0gPSAkU3RvcmFibGVPYmplY3QtPkRlc2VyaWFsaXplKCBEYXRhID0+ICREZWNvZGVkRGF0YSApOwoKICAgICAgICBpZiAoICEkRGF0YVBhcmFtICkgewoKICAgICAgICAgICAgIyBlcnJvciBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Z1dHVyZSB0YXNrIGRhdGEgaXMgbm90IGluIGEgY29ycmVjdCBzdG9yYWJsZSBmb3JtYXQhIFRhc2tJRDogJyAuICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgZGFtYWdlZCBmdXR1cmUgdGFzawogICAgICAgICAgICAkU2VsZi0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICAgICAgID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICREYXRhWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICREYXRhUGFyYW0gfHwge30sCiAgICAgICAgICAgIEF0dGVtcHRzICAgICAgPT4gJERhdGFbNF0sCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgPT4gJERhdGFbNV0gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICA9PiAkRGF0YVs2XSAvLyAnJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICA9PiAkRGF0YVs3XSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGFzazsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tEZWxldGUoKQoKZGVsZXRlIGEgdGFzayBmcm9tIHNjaGVkdWxlciBmdXR1cmUgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGFza0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgdGFzayBmcm9tIHRoZSBmdXR1cmUgbGlzdAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGdXR1cmVUYXNrTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2Ygc2NoZWR1bGVyIGZ1dHVyZSB0YXNrcwoKICAgIG15IEBMaXN0ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdzb21lIHR5cGUnLCAgIyBvcHRpb25hbAogICAgKTsKClJldHVybnM6CgogICAgQExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgICAgICAgID0+IDEyMywKICAgICAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ2FueSBuYW1lJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgPT4gNDU2LAogICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnYW55IG90aGVyIG5hbWUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICApOwoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIGV4ZWN1dGlvbl90aW1lLCBuYW1lLCB0YXNrX3R5cGUgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2snOwogICAgbXkgQEJpbmQ7CgogICAgIyBhZGQgdHlwZQogICAgaWYgKCAkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnIFdIRVJFIHRhc2tfdHlwZSA9ID8nOwogICAgICAgIEBCaW5kID0gKCBcJFBhcmFte1R5cGV9ICk7CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAkUm93WzFdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBATGlzdDsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tUb0V4ZWN1dGUoKQoKbW92ZXMgYWxsIGZ1dHVyZSB0YXNrcyB3aXRoIHJlYWNoZWQgZXhlY3V0aW9uIHRpbWUgdG8gdGhlIHRhc2sgdGFibGUgdG8gZXhlY3V0ZQoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrVG9FeGVjdXRlKAogICAgICAgIE5vZGVJRCA9PiAxLCAgICAjIHRoZSBJRCBvZiB0aGUgbm9kZSBpbiBhIGNsdXN0ZXIgZW52aXJvbm1lbnQKICAgICAgICBQSUQgICAgPT4gNDU2LCAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZGFlbW9uIHRoYXQgaXMgbW92aW5nIHRoZSB0YXNrcyB0byBleGVjdXRpb24KICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza1RvRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoTm9kZUlEIFBJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGxvY2sga2V5CiAgICBteSAkTG9ja0tleU5vZGVJRCA9IHNwcmludGYgJyUwM2QnLCAkUGFyYW17Tm9kZUlEfTsKICAgIG15ICRMb2NrS2V5UElEICAgID0gc3ByaW50ZiAnJTA4ZCcsICRQYXJhbXtQSUR9OwogICAgbXkgJExvY2tLZXkgICAgICAgPSAnMScgLiAkTG9ja0tleU5vZGVJRCAuICRMb2NrS2V5UElEOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBjdXJyZW50IHRpbWUKICAgIG15ICRDdXJyZW50VGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub1N0cmluZygpOwoKICAgICMgbG9jayB0aGUgdGFzayBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gPywgbG9ja190aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSAwIEFORCBleGVjdXRpb25fdGltZSA8PSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICBcJEN1cnJlbnRUaW1lLAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IGFsbCBsb2NrZWQgZnV0dXJlIHRhc2tzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cwogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzawogICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9ID8KICAgICAgICAgICAgT1JERVIgQlkgZXhlY3V0aW9uX3RpbWUgQVNDJywKICAgICAgICBCaW5kID0+IFsgXCRMb2NrS2V5IF0sCiAgICApOwoKICAgICMgZ2V0IHN0b3JhYmxlIG9iamVjdAogICAgbXkgJFN0b3JhYmxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBARnV0dXJlVGFza0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBkZWNvZGUgdGFzayBkYXRhCiAgICAgICAgbXkgJERlY29kZWREYXRhID0gZGVjb2RlX2Jhc2U2NCggJFJvd1szXSApOwoKICAgICAgICAjIGRlc2VyaWFsaXplIGRhdGEKICAgICAgICBteSAkRGF0YVBhcmFtID0gJFN0b3JhYmxlT2JqZWN0LT5EZXNlcmlhbGl6ZSggRGF0YSA9PiAkRGVjb2RlZERhdGEgKTsKCiAgICAgICAgaWYgKCAhJERhdGFQYXJhbSApIHsKCiAgICAgICAgICAgICMgZXJyb3IgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGdXR1cmUgdGFzayBkYXRhIGlzIG5vdCBpbiBhIGNvcnJlY3Qgc3RvcmFibGUgZm9ybWF0ISBUYXNrSUQ6ICcgLiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGRhbWFnZWQgZnV0dXJlIHRhc2sKICAgICAgICAgICAgJFNlbGYtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAlVGFzayA9ICgKICAgICAgICAgICAgVGFza0lEICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gJERhdGFQYXJhbSB8fCB7fSwKICAgICAgICAgICAgQXR0ZW1wdHMgPT4gJFJvd1s0XSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBGdXR1cmVUYXNrTGlzdCwgXCVUYXNrOwogICAgfQoKICAgICMgbW92ZSB0YXNrcyB0byB0aGUgZXhlY3V0aW9uIHRhc2sgbGlzdAogICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgbXkgJVRhc2sgPSAleyRGdXR1cmVUYXNrfTsKCiAgICAgICAgZGVsZXRlICRUYXNre1Rhc2tJRH07CgogICAgICAgICMgYWRkIHRhc2sgdG8gdGhlIGxpc3QKICAgICAgICAkU2VsZi0+VGFza0FkZCglVGFzayk7CgogICAgICAgICMgcmVtb3ZlIGZ1dHVyZSB0YXNrCiAgICAgICAgJFNlbGYtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tTdW1tYXJ5KCkKCmdldCBhIHN1bW1hcnkgb2YgdGhlIHRhc2tzIGZyb20gdGhlIGZ1dHVyZSB0YXNrIHRhYmxlCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tTdW1tYXJ5KCk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGlzdCA9ICRTZWxmLT5GdXR1cmVUYXNrTGlzdCgpOwoKICAgIHJldHVybiAoCiAgICAgICAgewogICAgICAgICAgICBIZWFkZXIgPT4gJ1Rhc2tzIHRvIGJlIGV4ZWN1dGVkIGluIGZ1dHVyZTonLAogICAgICAgICAgICBDb2x1bW4gPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdFeGVjdXRpb25UaW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnVG8gRXhlY3V0ZSBBdCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFxATGlzdCwKICAgICAgICAgICAgTm9EYXRhTWVzc2FnZSA9PiAnVGhlcmUgYXJlIGN1cnJlbnRseSBubyB0YXNrcyB0byBiZSBleGVjdXRlZCBpbiBmdXR1cmUuJywKICAgICAgICB9LAogICAgKTsKfQoKPWhlYWQyIENyb25UYXNrVG9FeGVjdXRlKCkKCmNyZWF0ZXMgY3JvbiB0YXNrcyB0aGF0IG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgY3VycmVudCB0aW1lIGludG8gdGhlIHRhc2sgdGFibGUgdG8gZXhlY3V0ZQoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5Dcm9uVGFza1RvRXhlY3V0ZSgKICAgICAgICBOb2RlSUQgPT4gMSwgICAgIyB0aGUgSUQgb2YgdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgID0+IDQ1NiwgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGRhZW1vbiB0aGF0IGlzIGNyZWF0aW5nIHRoZSB0YXNrcyB0byBleGVjdXRpb24KICAgICk7Cgo9Y3V0CgpzdWIgQ3JvblRhc2tUb0V4ZWN1dGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KE5vZGVJRCBQSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkS2V5ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNyb24gY29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzaycpIHx8IHt9OwoKICAgICMgZG8gbm90aGluZyBpZiB0aGVyZSBhcmUgbm8gY3JvbiB0YXNrcyBkZWZpbml0aW9ucyBpbiBTeXNDb25maWcKICAgIHJldHVybiAxIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkQ29uZmlnKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICBteSAlVXNlZFRhc2tOYW1lczsKCiAgICBDUk9OSk9CS0VZOgogICAgZm9yIG15ICRDcm9uam9iS2V5ICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhJENyb25qb2JLZXk7CgogICAgICAgICMgZXh0cmFjdCBjb25maWcKICAgICAgICBteSAkSm9iQ29uZmlnID0gJENvbmZpZy0+eyRDcm9uam9iS2V5fTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSm9iQ29uZmlnKTsKCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KE1vZHVsZSBUYXNrTmFtZSBGdW5jdGlvbikpIHsKICAgICAgICAgICAgaWYgKCAhJEpvYkNvbmZpZy0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29uZmlnIG9wdGlvbiBEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzayMjIyRDcm9uam9iS2V5IGlzIGludmFsaWQuIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgTmVlZCAnJE5lZWRlZCcgcGFyYW1ldGVyISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ1JPTkpPQktFWTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVXNlZFRhc2tOYW1lc3sgJEpvYkNvbmZpZy0+e1Rhc2tOYW1lfSB9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29uZmlnIG9wdGlvbiBEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzayMjIyRDcm9uam9iS2V5IGlzIGludmFsaWQuIgogICAgICAgICAgICAgICAgICAgIC4gIiBUYXNrTmFtZSBwYXJhbWV0ZXIgJyRKb2JDb25maWctPntUYXNrTmFtZX0nIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIHRhc2shIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ1JPTkpPQktFWTsKICAgICAgICB9CgogICAgICAgICMgY2FsY3VsYXRlIGxhc3QgY3JvbiB0aW1lCiAgICAgICAgbXkgJFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgPSAkQ3JvbkV2ZW50T2JqZWN0LT5QcmV2aW91c0V2ZW50R2V0KAogICAgICAgICAgICBTY2hlZHVsZSA9PiAkSm9iQ29uZmlnLT57U2NoZWR1bGV9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhJFByZXZpb3VzRXZlbnRUaW1lc3RhbXA7CgogICAgICAgICMgZXhlY3V0ZSByZWN1cnJlbnQgdGFza3MKICAgICAgICAkU2VsZi0+UmVjdXJyZW50VGFza0V4ZWN1dGUoCiAgICAgICAgICAgIE5vZGVJRCAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17Tm9kZUlEfSwKICAgICAgICAgICAgUElEICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtQSUR9LAogICAgICAgICAgICBUYXNrTmFtZSAgICAgICAgICAgICAgICAgPT4gJEpvYkNvbmZpZy0+e1Rhc2tOYW1lfSwKICAgICAgICAgICAgVGFza1R5cGUgICAgICAgICAgICAgICAgID0+ICdDcm9uJywKICAgICAgICAgICAgUHJldmlvdXNFdmVudFRpbWVzdGFtcCAgID0+ICRQcmV2aW91c0V2ZW50VGltZXN0YW1wLAogICAgICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gJEpvYkNvbmZpZy0+e01heGltdW1QYXJhbGxlbEluc3RhbmNlc30sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBNb2R1bGUgICA9PiAkSm9iQ29uZmlnLT57TW9kdWxlfSAgIHx8ICcnLAogICAgICAgICAgICAgICAgRnVuY3Rpb24gPT4gJEpvYkNvbmZpZy0+e0Z1bmN0aW9ufSB8fCAnJywKICAgICAgICAgICAgICAgIFBhcmFtcyAgID0+ICRKb2JDb25maWctPntQYXJhbXN9ICAgfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkVXNlZFRhc2tOYW1lc3sgJEpvYkNvbmZpZy0+e1Rhc2tOYW1lfSB9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENyb25UYXNrQ2xlYW51cCgpCgpyZW1vdmVzIHJlY3VycmVudCB0YXNrcyB0aGF0IGRvIG5vdCBoYXZlIGEgbWF0Y2hpbmcgY3JvbiB0YXNrcyBkZWZpbml0aW9uIGluIFN5c0NvbmZpZy4KCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+Q3JvblRhc2tDbGVhbnVwKCk7Cgo9Y3V0CgpzdWIgQ3JvblRhc2tDbGVhbnVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3JvbiBjb25maWcKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrJykgfHwge307CgogICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBjcm9uIHRhc2tzIGRlZmluaXRpb25zIGluIFN5c0NvbmZpZwogICAgcmV0dXJuIDEgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRDb25maWcpOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgIG15ICVDcm9uSm9iTG9va3VwOwoKICAgIENST05KT0JLRVk6CiAgICBmb3IgbXkgJENyb25qb2JLZXkgKCBzb3J0IGtleXMgJXskQ29uZmlnfSApIHsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICEkQ3JvbmpvYktleTsKCiAgICAgICAgIyBleHRyYWN0IGNvbmZpZwogICAgICAgIG15ICRKb2JDb25maWcgPSAkQ29uZmlnLT57JENyb25qb2JLZXl9OwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRKb2JDb25maWcpOwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgKCAhJEpvYkNvbmZpZy0+e01vZHVsZX0gKTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICggJEpvYkNvbmZpZy0+e01vZHVsZX0gJiYgISRKb2JDb25maWctPntGdW5jdGlvbn0gKTsKCiAgICAgICAgIyBjYWxjdWxhdGUgbGFzdCBjcm9uIHRpbWUKICAgICAgICBteSAkUHJldmlvdXNFdmVudFRpbWVzdGFtcCA9ICRDcm9uRXZlbnRPYmplY3QtPlByZXZpb3VzRXZlbnRHZXQoCiAgICAgICAgICAgIFNjaGVkdWxlID0+ICRKb2JDb25maWctPntTY2hlZHVsZX0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICEkUHJldmlvdXNFdmVudFRpbWVzdGFtcDsKCiAgICAgICAgJENyb25Kb2JMb29rdXB7ICRKb2JDb25maWctPntUYXNrTmFtZX0gfSA9IDE7CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBnZW5lcmljIGFnZW50IHJlY3VycmVudCB0YXNrcwogICAgbXkgQFRhc2tMaXN0ID0gJFNlbGYtPlJlY3VycmVudFRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0Nyb24nLAogICAgKTsKCiAgICBUQVNLOgogICAgZm9yIG15ICRUYXNrIChAVGFza0xpc3QpIHsKCiAgICAgICAgIyBza2lwIGlmIHRhc2sgaGFzIGFuIGFjdGl2ZSBnZW5lcmljIGFnZW50IGpvYiBpbiB0aGUgREIKICAgICAgICBuZXh0IFRBU0sgaWYgJENyb25Kb2JMb29rdXB7ICRUYXNrLT57TmFtZX0gfTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+UmVjdXJyZW50VGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrLT57VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRhc2sgJFRhc2stPntOYW1lfS0kVGFzay0+e1R5cGV9ICgkVGFzay0+e1Rhc2tJRH0pIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3JvblRhc2tTdW1tYXJ5KCkKCmdldCBhIHN1bW1hcnkgb2YgdGhlIGNyb24gdGFza3MgZnJvbSB0aGUgcmVjdXJyZW50IHRhc2sgdGFibGUKCiAgICBteSBAU3VtbWFyeSA9ICRTY2hlZHVsZXJEQk9iamVjdC0+Q3JvblRhc2tTdW1tYXJ5KCk7Cgo9Y3V0CgpzdWIgQ3JvblRhc2tTdW1tYXJ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3JvbiBqb2JzIGZyb20gdGhlIFN5c0NvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2snKSB8fCB7fTsKCiAgICBteSAlVGFza0xvb2t1cDsKCiAgICBKT0JOQU1FOgogICAgZm9yIG15ICRKb2JOYW1lICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgIG15ICRKb2JDb25maWcgPSAkQ29uZmlnLT57JEpvYk5hbWV9OwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRKb2JDb25maWc7CiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkSm9iQ29uZmlnLT57U2NoZWR1bGV9OwoKICAgICAgICAkVGFza0xvb2t1cHskSm9iTmFtZX0gPSAkSm9iQ29uZmlnLT57U2NoZWR1bGV9OwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+UmVjdXJyZW50VGFza1N1bW1hcnkoCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ0Nyb24nLAogICAgICAgIERpc3BsYXlUeXBlID0+ICdjcm9uJywKICAgICAgICBUYXNrTG9va3VwICA9PiBcJVRhc2tMb29rdXAsCiAgICApOwp9Cgo9aGVhZDIgR2VuZXJpY0FnZW50VGFza1RvRXhlY3V0ZSgpCgpjcmVhdGVzIGdlbmVyaWMgYWdlbnQgdGFza3MgdGhhdCBuZWVkcyB0byBiZSBydW4gaW4gdGhlIGN1cnJlbnQgdGltZSBpbnRvIHRoZSB0YXNrIHRhYmxlIHRvIGV4ZWN1dGUKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+R2VuZXJpY0FnZW50VGFza1RvRXhlY3V0ZSgKICAgICAgICBOb2RlSUQgPT4gMSwgICAgIyB0aGUgSUQgb2YgdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgID0+IDQ1NiwgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGRhZW1vbiB0aGF0IGlzIGNyZWF0aW5nIHRoZSB0YXNrcyB0byBleGVjdXRpb24KICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJpY0FnZW50VGFza1RvRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoTm9kZUlEIFBJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZ2VuZXJpYyBhZ2VudCBvYmplY3QKICAgIG15ICRHZW5lcmljQWdlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0FnZW50Jyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGdlbmVyaWMgYWdlbnQgam9icwogICAgbXkgJUpvYkxpc3QgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JMaXN0KCk7CgogICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBnZW5lcmljIGFnZW50IGpvYnMKICAgIHJldHVybiAxIGlmICElSm9iTGlzdDsKCiAgICAjIGdldCBDUk9OIGV2ZW50IG9iamVjdHMKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgSk9CTkFNRToKICAgIGZvciBteSAkSm9iTmFtZSAoIHNvcnQga2V5cyAlSm9iTGlzdCApIHsKCiAgICAgICAgIyBnZXQgam9iCiAgICAgICAgbXkgJUpvYiA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSm9iTmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgaWYgam9iIGlzIGludmFsaWQKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRKb2J7VmFsaWR9OwoKICAgICAgICAjIGdldCByZXF1aXJlZCBwYXJhbXMKICAgICAgICBteSAkU2NoZWR1bGVDaGVjayA9IDE7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBTY2hlZHVsZURheXMgU2NoZWR1bGVNaW51dGVzIFNjaGVkdWxlSG91cnMgKSkgewogICAgICAgICAgICBpZiAoICEkSm9ieyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNjaGVkdWxlQ2hlY2sgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgaWYgam9iIGlzIG5vdCB0aW1lIGJhc2VkCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGVDaGVjazsKCiAgICAgICAgIyBnZXQgQ1JPTiB0YWIgZm9yIEdlbmVyaWMgQWdlbnQgU2NoZWR1bGUKICAgICAgICBteSAkU2NoZWR1bGUgPSAkQ3JvbkV2ZW50T2JqZWN0LT5HZW5lcmljQWdlbnRTY2hlZHVsZTJDcm9uVGFiKCVKb2IpOwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZTsKCiAgICAgICAgIyBnZXQgdGhlIGxhc3QgdGltZSB0aGUgR2VuZXJpY0FnZW50IGpvYiBzaG91bGQgYmUgZXhlY3V0ZWQsIHRoaXMgcmV0dXJucyBldmVuIFRISVMgbWludXRlCiAgICAgICAgbXkgJFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgPSAkQ3JvbkV2ZW50T2JqZWN0LT5QcmV2aW91c0V2ZW50R2V0KAogICAgICAgICAgICBTY2hlZHVsZSA9PiAkU2NoZWR1bGUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkUHJldmlvdXNFdmVudFRpbWVzdGFtcDsKCiAgICAgICAgIyBleGVjdXRlIHJlY3VycmVudCB0YXNrcwogICAgICAgICRTZWxmLT5SZWN1cnJlbnRUYXNrRXhlY3V0ZSgKICAgICAgICAgICAgTm9kZUlEICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtOb2RlSUR9LAogICAgICAgICAgICBQSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1BJRH0sCiAgICAgICAgICAgIFRhc2tOYW1lICAgICAgICAgICAgICAgICA9PiAkSm9iTmFtZSwKICAgICAgICAgICAgVGFza1R5cGUgICAgICAgICAgICAgICAgID0+ICdHZW5lcmljQWdlbnQnLAogICAgICAgICAgICBQcmV2aW91c0V2ZW50VGltZXN0YW1wICAgPT4gJFByZXZpb3VzRXZlbnRUaW1lc3RhbXAsCiAgICAgICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAxLAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gXCVKb2IsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEdlbmVyaWNBZ2VudFRhc2tDbGVhbnVwKCkKCnJlbW92ZXMgcmVjdXJyZW50IHRhc2tzIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIGdlbmVyaWMgYWdlbnQgam9iCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkdlbmVyaWNBZ2VudFRhc2tDbGVhbnVwKCk7Cgo9Y3V0CgpzdWIgR2VuZXJpY0FnZW50VGFza0NsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBnZW5lcmljIGFnZW50IG9iamVjdAogICAgbXkgJEdlbmVyaWNBZ2VudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgZ2VuZXJpYyBhZ2VudCBqb2JzCiAgICBteSAlSm9iTGlzdCA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkxpc3QoKTsKCiAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIGdlbmVyaWMgYWdlbnQgam9icwogICAgcmV0dXJuIDEgaWYgISVKb2JMaXN0OwoKICAgIG15ICVHZW5lcmljQWdlbnRKb2JMb29rdXA7CgogICAgIyBnZXQgQ1JPTiBldmVudCBvYmplY3RzCiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgIEpPQk5BTUU6CiAgICBmb3IgbXkgJEpvYk5hbWUgKCBzb3J0IGtleXMgJUpvYkxpc3QgKSB7CgogICAgICAgICMgZ2V0IGpvYgogICAgICAgIG15ICVKb2IgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJEpvYk5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIGlmIGpvYiBpcyBpbnZhbGlkCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkSm9ie1ZhbGlkfTsKCiAgICAgICAgIyBnZXQgcmVxdWlyZWQgcGFyYW1zCiAgICAgICAgbXkgJFNjaGVkdWxlQ2hlY2sgPSAxOwogICAgICAgIGZvciBteSAkS2V5IChxdyggU2NoZWR1bGVEYXlzIFNjaGVkdWxlTWludXRlcyBTY2hlZHVsZUhvdXJzICkpIHsKICAgICAgICAgICAgaWYgKCAhJEpvYnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTY2hlZHVsZUNoZWNrID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBza2lwIGlmIGpvYiBpcyBub3QgdGltZSBiYXNlZAogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlQ2hlY2s7CgogICAgICAgICMgZ2V0IENST04gdGFiIGZvciBHZW5lcmljIEFnZW50IFNjaGVkdWxlCiAgICAgICAgbXkgJFNjaGVkdWxlID0gJENyb25FdmVudE9iamVjdC0+R2VuZXJpY0FnZW50U2NoZWR1bGUyQ3JvblRhYiglSm9iKTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGU7CgogICAgICAgICRHZW5lcmljQWdlbnRKb2JMb29rdXB7JEpvYk5hbWV9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGdlbmVyaWMgYWdlbnQgcmVjdXJyZW50IHRhc2tzCiAgICBteSBAVGFza0xpc3QgPSAkU2VsZi0+UmVjdXJyZW50VGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnR2VuZXJpY0FnZW50JywKICAgICk7CgogICAgVEFTSzoKICAgIGZvciBteSAkVGFzayAoQFRhc2tMaXN0KSB7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGhhcyBhbiBhY3RpdmUgZ2VuZXJpYyBhZ2VudCBqb2IgaW4gdGhlIERCCiAgICAgICAgbmV4dCBUQVNLIGlmICRHZW5lcmljQWdlbnRKb2JMb29rdXB7ICRUYXNrLT57TmFtZX0gfTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+UmVjdXJyZW50VGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrLT57VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRhc2sgJFRhc2stPntOYW1lfS0kVGFzay0+e1R5cGV9ICgkVGFzay0+e1Rhc2tJRH0pIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgR2VuZXJpY0FnZW50VGFza1N1bW1hcnkoKQoKZ2V0IGEgc3VtbWFyeSBvZiB0aGUgZ2VuZXJpYyBhZ2VudCB0YXNrcyBmcm9tIHRoZSByZWN1cnJlbnQgdGFzayB0YWJsZQoKICAgIG15IEBTdW1tYXJ5ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5HZW5lcmljQWdlbnRUYXNrU3VtbWFyeSgpOwoKPWN1dAoKc3ViIEdlbmVyaWNBZ2VudFRhc2tTdW1tYXJ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZ2VuZXJpYyBhZ2VudCBvYmplY3QKICAgIG15ICRHZW5lcmljQWdlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0FnZW50Jyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGdlbmVyaWMgYWdlbnQgam9icyBmcm9tIHRoZSBEQgogICAgbXkgJUpvYkxpc3QgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JMaXN0KCk7CgogICAgIyBnZXQgY3JvbiBldmVudCBvYmplY3QKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgbXkgJVRhc2tMb29rdXA7CgogICAgSk9CTkFNRToKICAgIGZvciBteSAkSm9iTmFtZSAoIHNvcnQga2V5cyAlSm9iTGlzdCApIHsKCiAgICAgICAgIyBnZXQgam9iCiAgICAgICAgbXkgJUpvYkNvbmZpZyA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSm9iTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISVKb2JDb25maWc7CiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkSm9iQ29uZmlne1ZhbGlkfTsKCiAgICAgICAgIyBnZXQgcmVxdWlyZWQgcGFyYW1zCiAgICAgICAgbXkgJFNjaGVkdWxlQ2hlY2sgPSAxOwogICAgICAgIGZvciBteSAkS2V5IChxdyggU2NoZWR1bGVEYXlzIFNjaGVkdWxlTWludXRlcyBTY2hlZHVsZUhvdXJzICkpIHsKICAgICAgICAgICAgaWYgKCAhJEpvYkNvbmZpZ3skS2V5fSApIHsKICAgICAgICAgICAgICAgICRTY2hlZHVsZUNoZWNrID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBza2lwIGlmIGpvYiBpcyBub3QgdGltZSBiYXNlZAogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlQ2hlY2s7CgogICAgICAgICMgZ2V0IENST04gdGFiIGZvciBHZW5lcmljIEFnZW50IFNjaGVkdWxlCiAgICAgICAgbXkgJFNjaGVkdWxlID0gJENyb25FdmVudE9iamVjdC0+R2VuZXJpY0FnZW50U2NoZWR1bGUyQ3JvblRhYiglSm9iQ29uZmlnKTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGU7CgogICAgICAgICRUYXNrTG9va3VweyRKb2JOYW1lfSA9ICRTY2hlZHVsZTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPlJlY3VycmVudFRhc2tTdW1tYXJ5KAogICAgICAgIFR5cGUgICAgICAgID0+ICdHZW5lcmljQWdlbnQnLAogICAgICAgIERpc3BsYXlUeXBlID0+ICdnZW5lcmljIGFnZW50JywKICAgICAgICBUYXNrTG9va3VwICA9PiBcJVRhc2tMb29rdXAsCiAgICApOwp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza0dldCgpCgpnZXQgc2NoZWR1bGVyIHJlY3VycmVudCB0YXNrCgogICAgbXkgJVRhc2sgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tHZXQoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVUYXNrID0gKAogICAgICAgIFRhc2tJRCAgICAgICAgICAgID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnYW55IG5hbWUnLAogICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgTG9ja0tleSAgICAgICAgICAgPT4gJ1hZWicsCiAgICAgICAgTG9ja1RpbWUgICAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRhc2tJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGFzayBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBuYW1lLCB0YXNrX3R5cGUsIGxhc3RfZXhlY3V0aW9uX3RpbWUsIGxvY2tfa2V5LCBsb2NrX3RpbWUsIGNyZWF0ZV90aW1lLCBjaGFuZ2VfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgbXkgJVRhc2s7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICAgICAgICAgICA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSA9PiAkRGF0YVsyXSwKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgICAgPT4gJERhdGFbM10gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgICAgPT4gJERhdGFbNF0gLy8gJycsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICREYXRhWzVdLAogICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAkRGF0YVs2XQogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVUYXNrOwp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza0xpc3QoKQoKZ2V0IHRoZSBsaXN0IG9mIHNjaGVkdWxlciByZWN1cnJlbnQgdGFza3MKCiAgICBteSBATGlzdCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnc29tZSB0eXBlJywgICMgb3B0aW9uYWwKICAgICk7CgpSZXR1cm5zOgoKICAgIEBMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnYW55IG5hbWUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgICAgIExhc3RFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgICAgPT4gJ1hZWicsCiAgICAgICAgICAgIExvY2tUaW1lICAgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcKICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgICAgID0+IDQ1NiwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ2FueSBvdGhlciBuYW1lJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgICAgID0+ICdYWVonLAogICAgICAgICAgICBMb2NrVGltZSAgICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgICAgIH0sCiAgICAgICAgIyAuLi4KICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgdGFza190eXBlLCBsYXN0X2V4ZWN1dGlvbl90aW1lLCBsb2NrX2tleSwgbG9ja190aW1lLCBjcmVhdGVfdGltZSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUKICAgICAgICBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzayc7CiAgICBteSBAQmluZDsKCiAgICAjIGFkZCB0eXBlCiAgICBpZiAoICRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU1FMIC49ICcgV0hFUkUgdGFza190eXBlID0gPyc7CiAgICAgICAgQEJpbmQgPSAoIFwkUGFyYW17VHlwZX0gKTsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgaWQgQVNDJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgPT4gJFJvd1szXSwKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgICAgPT4gJFJvd1s0XSAvLyAwLAogICAgICAgICAgICBMb2NrVGltZSAgICAgICAgICA9PiAkUm93WzVdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAkUm93WzddLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza0RlbGV0ZSgpCgpkZWxldGUgYSB0YXNrIGZyb20gc2NoZWR1bGVyIHJlY3VycmVudCB0YXNrIGxpc3QKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza0RlbGV0ZSgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0YXNrIGZyb20gdGhlIHJlY3VycmVudCB0YXNrIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgVGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZSBmb3IgJ1NjaGVkdWxlckRCUmVjdXJyZW50VGFza0V4ZWN1dGUnLgogICAgIyBUaGlzIGNhY2hlIGl0ZW0gcHJldmVudHMgZG91YmxlIGV4ZWN1dGlvbiBvZiB0YXNrcyB3aGljaCBpcyB3YW50ZWQgaW4gYW55IGNhc2UuCiAgICAjIFRoZXJlIGlzIG5vIHBpbGUgdXAgb2YgY2FjaGUgaXRlbXMgYmVjYXVzZSB0aGUgdGhlIHZhbHVlIGlzIG9ubHkgY2FjaGVkIGZvciBmaXZlIG1pbnV0ZXMuCgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrRXhlY3V0ZSgpCgpleGVjdXRlcyByZWN1cnJlbnQgdGFza3MgbGlrZSBjcm9uIG9yIGdlbmVyaWMgYWdlbnQgdGFza3MKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza0V4ZWN1dGUoCiAgICAgICAgTm9kZUlEICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgIyB0aGUgSUQgb2YgdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgICAgICAgICAgICAgICAgICAgID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZGFlbW9uIHRoYXQgaXMgY3JlYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIHRoZSB0YXNrcyB0byBleGVjdXRpb24KICAgICAgICBUYXNrTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXF1ZVRhc2tOYW1lJywKICAgICAgICBUYXNrVHlwZSAgICAgICAgICAgICAgICAgPT4gJ0Nyb24nLAogICAgICAgIFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgICA9PiAnMjAyNi0wOC0xNCAxMDoxODozMicsICMgdGltZSB0aGF0IHRyaWdnZXJlZCB0aGUgZXhlY3V0aW9uCiAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+IDEsICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKSBudW1iZXIgb2YgdGFza3Mgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgc2FtZSBuYW1lIGFuZCB0eXBlIHRoYXQgY2FuIGJlIGluIGV4ZWN1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0YWJsZSBhdCB0aGUgc2FtZSB0aW1lLCB2YWx1ZSBvZiAwIG1lYW5zIHVubGltaXRlZAogICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZGF0YSBwYXlsb2FkCiAgICAgICAgICAgIC4uLgogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tFeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhOb2RlSUQgUElEIFRhc2tOYW1lIFRhc2tUeXBlIFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgbXkgJENhY2hlS2V5ID0gIiRQYXJhbXtUYXNrTmFtZX06OiRQYXJhbXtUYXNrVHlwZX0iOwoKICAgICMgR2V0IHRoZSB0aW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiB0aGlzIHRhc2suCiAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2NoZWR1bGVyREJSZWN1cnJlbnRUYXNrRXhlY3V0ZScsCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICk7CgogICAgIyBOb3RoaW5nIHRvIGRvLiBUaGUgdGltZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGNhbGwgYWxyZWFkeSBoYXMgYWxyZWFkeSB0cmlnZ2VyZWQgYW4gZXhlY3V0aW9uIG9mIHRoZSB0YXNrLgogICAgcmV0dXJuIDEgaWYgJENhY2hlICYmICRDYWNoZSBlcSAkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH07CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRMYXN0RXhlY3V0aW9uVGltZVN0YW1wOwoKICAgICMgZ2V0IGVudHJ5IGlkIGFuZCBsYXN0IGV4ZWN1dGlvbiB0aW1lIGZyb20gZGF0YWJhc2UKICAgIG15ICRFbnRyeUlEOwogICAgVFJZOgogICAgZm9yIG15ICRUcnkgKCAxIC4uIDEwICkgewoKICAgICAgICAjIGluc2VydCBlbnRyeSBpZiBub3QgZXhpc3RzCiAgICAgICAgaWYgKCAkVHJ5IG5lIDEgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdGFza190eXBlLCBsYXN0X2V4ZWN1dGlvbl90aW1lLCBsb2NrX2tleSwgY3JlYXRlX3RpbWUsIGNoYW5nZV90aW1lKQogICAgICAgICAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgICAgICAgICAoPywgPywgPywgMCwgY3VycmVudF90aW1lc3RhbXAsIGN1cnJlbnRfdGltZXN0YW1wKSIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tOYW1lfSwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tUeXBlfSwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGVudHJ5IGlkCiAgICAgICAgbmV4dCBUUlkgaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICIKICAgICAgICAgICAgICAgIFNFTEVDVCBpZCwgbGFzdF9leGVjdXRpb25fdGltZQogICAgICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgICAgIFdIRVJFIHRhc2tfdHlwZSA9ID8gQU5EIG5hbWUgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tUeXBlfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza05hbWV9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIGVudHJ5IGlkCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRFbnRyeUlEICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAgICAgJExhc3RFeGVjdXRpb25UaW1lU3RhbXAgPSAkUm93WzFdOwogICAgICAgIH0KCiAgICAgICAgbGFzdCBUUlkgaWYgJEVudHJ5SUQ7CiAgICB9CgogICAgcmV0dXJuIGlmICEkRW50cnlJRDsKCiAgICBpZiAoICRMYXN0RXhlY3V0aW9uVGltZVN0YW1wIGVxICRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfSApIHsKCiAgICAgICAgIyBDb21tdW5pY2F0ZSB0aGUgdGltZSB0aGF0IHRyaWdnZXJlZCB0aGUgY3VycmVudCBleGVjdXRpb24KICAgICAgICAjIHRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBzdWJyb3V0aW5lIFJlY3VycmVudFRhc2tFeGVjdXRlKCkuCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTY2hlZHVsZXJEQlJlY3VycmVudFRhc2tFeGVjdXRlJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBUVEwgICAgICAgICAgICA9PiA2MCAqIDUsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+ICRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfSwKICAgICAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMCwKICAgICAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbG9jayBrZXkKICAgIG15ICRMb2NrS2V5Tm9kZUlEID0gc3ByaW50ZiAnJTAzZCcsICRQYXJhbXtOb2RlSUR9OwogICAgbXkgJExvY2tLZXlQSUQgICAgPSBzcHJpbnRmICclMDhkJywgJFBhcmFte1BJRH07CiAgICBteSAkTG9ja0tleSAgICAgICA9ICcxJyAuICRMb2NrS2V5Tm9kZUlEIC4gJExvY2tLZXlQSUQ7CgogICAgIyBsb2NrIHRoZSBlbnRyeSBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gPywgbG9ja190aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSAwIEFORCBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgIFwkRW50cnlJRCwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBsb2NrZWQgZW50cnkKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgbG9ja19rZXkgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRFbnRyeUlEIF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExvY2tLZXlGcm9tREIgPSAnJzsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9ja0tleUZyb21EQiA9ICREYXRhWzBdOwogICAgfQoKICAgIHJldHVybiAxIGlmICRMb2NrS2V5RnJvbURCIG5lICRMb2NrS2V5OwoKICAgICMgc2V0IGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2NoZWR1bGVyREJSZWN1cnJlbnRUYXNrRXhlY3V0ZScsCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgIFRUTCAgICAgICAgICAgID0+IDYwICogNSwKICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH0sCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMCwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB0aGUgdGFzawogICAgbXkgJFRhc2tJRCA9ICRTZWxmLT5UYXNrQWRkKAogICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGFza1R5cGV9LAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGFza05hbWV9LAogICAgICAgIEF0dGVtcHRzICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSwKICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIHVubG9jayB0aGUgdGFzawogICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlcigkVGFza0lEKSApIHsKICAgICAgICAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gMCwgbG9ja190aW1lID0gTlVMTCwgbGFzdF9leGVjdXRpb25fdGltZSA9ID8sIGxhc3Rfd29ya2VyX3Rhc2tfaWQgPSA/LAogICAgICAgICAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gPyBBTkQgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9LAogICAgICAgICAgICAgICAgXCRUYXNrSUQsCiAgICAgICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgICAgICBcJEVudHJ5SUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwLCBsb2NrX3RpbWUgPSBOVUxMLCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9ID8gQU5EIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICAgICAgXCRFbnRyeUlELAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFRhc2tJRDsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIG5ldyBzY2hlZHVsZXIgcmVjdXJyZW50IHRhc2sgJFBhcmFte1Rhc2tOYW1lfSEiLAogICAgKTsKCiAgICByZXR1cm47Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgdGFza3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzayB0eXBlCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tTdW1tYXJ5KAogICAgICAgIFR5cGUgICAgICAgICA9PiAnc29tZV90eXBlJywKICAgICAgICBEaXNwbGF5VHlwZSAgPT4gJ3NvbWUgdHlwZScsCiAgICAgICAgVGFza0xvb2t1cCAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICMgb25seSB0YXNrcyB3aXRoIG5hbWVzIGluIHRoaXMgdGFibGUgd2lsbCBiZSBzaG93bgogICAgICAgICAgICBUYXNrTmFtZTEgPT4gJyogKiAqICogKicsICAgICAgICAgICAjICAgdGhlIHZhbHVlIG9mIHRoZSBpdGVtcyBpbiB0aGlzIHRhYmxlIGlzIGEgY3JvbnRhYgogICAgICAgICAgICBUYXNrTmFtZTMgPT4gJyovMSAzLDQgKiAqICogMCcsICAgICAjICAgZm9ybWF0IHNjaGVkdWxlCiAgICAgICAgfQogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrU3VtbWFyeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBEaXNwbGF5VHlwZSBUYXNrTG9va3VwKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICgpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17VGFza0xvb2t1cH0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGFza0xvb2t1cCBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICgpOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gKCkgaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIG5hbWUsIHRhc2tfdHlwZSwgbGFzdF9leGVjdXRpb25fdGltZSwgbGFzdF93b3JrZXJfc3RhdHVzLCBsYXN0X3dvcmtlcl9ydW5uaW5nX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgV0hFUkUgdGFza190eXBlID0gPwogICAgICAgICAgICBPUkRFUiBCWSBpZCBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1R5cGV9IF0sCiAgICApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBza2lwIHRhc2tzIHRoYXQgYXJlIG5vdCByZWdpc3RlcmVkIGluIHRoZSBUYXNrTG9va3VwIHRhYmxlCiAgICAgICAgbXkgJFNjaGVkdWxlID0gJFBhcmFte1Rhc2tMb29rdXB9LT57ICRSb3dbMV0gfTsKCiAgICAgICAgbmV4dCBST1cgaWYgISRTY2hlZHVsZTsKCiAgICAgICAgIyBjYWxjdWxhdGUgbmV4dCBjcm9uIGV2ZW50IHRpbWUKICAgICAgICBteSAkTmV4dEV4ZWN1dGlvblRpbWUgPSAkQ3JvbkV2ZW50T2JqZWN0LT5OZXh0RXZlbnRHZXQoCiAgICAgICAgICAgIFNjaGVkdWxlID0+ICRTY2hlZHVsZSwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdFdvcmtlclN0YXR1czsKICAgICAgICBpZiAoIGRlZmluZWQgJFJvd1s0XSApIHsKICAgICAgICAgICAgJExhc3RXb3JrZXJTdGF0dXMgPSAkUm93WzRdID8gJ1N1Y2Nlc3MnIDogJ0ZhaWwnOwogICAgICAgIH0KCiAgICAgICAgbXkgJExhc3RXb3JrZXJSdW5uaW5nVGltZTsKICAgICAgICBpZiAoIGRlZmluZWQgJFJvd1s1XSApIHsKICAgICAgICAgICAgJExhc3RXb3JrZXJSdW5uaW5nVGltZSA9ICRTZWxmLT5fU2Vjb25kczJTdHJpbmcoICRSb3dbNV0gKTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSAgICAgPT4gJFJvd1szXSAgICAgICAgICAgICAgICAvLyAnJywKICAgICAgICAgICAgTmV4dEV4ZWN1dGlvblRpbWUgICAgID0+ICROZXh0RXhlY3V0aW9uVGltZSAgICAgLy8gJycsCiAgICAgICAgICAgIExhc3RXb3JrZXJTdGF0dXMgICAgICA9PiAkTGFzdFdvcmtlclN0YXR1cyAgICAgIC8vICdOL0EnLAogICAgICAgICAgICBMYXN0V29ya2VyUnVubmluZ1RpbWUgPT4gJExhc3RXb3JrZXJSdW5uaW5nVGltZSAvLyAnTi9BJywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgewogICAgICAgICAgICBIZWFkZXIgPT4gIlJlY3VycmVudCAkUGFyYW17RGlzcGxheVR5cGV9IHRhc2tzOiIsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0xhc3RFeGVjdXRpb25UaW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTGFzdCBFeGVjdXRpb24nLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTGFzdFdvcmtlclN0YXR1cycsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ0xhc3QgU3RhdHVzJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAxMiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0xhc3RXb3JrZXJSdW5uaW5nVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ0xhc3QgRHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDE4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dEV4ZWN1dGlvblRpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOZXh0IEV4ZWN1dGlvbicsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFxATGlzdCwKICAgICAgICAgICAgTm9EYXRhTWVzc2FnZSA9PiAiVGhlcmUgYXJlIGN1cnJlbnRseSBubyAkUGFyYW17RGlzcGxheVR5cGV9IHJlY3VycmluZyB0YXNrcyBjb25maWd1cmVkLiIsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrV29ya2VySW5mb1NldCgpCgpzZXRzIGxhc3Qgd29ya2VyIGluZm9ybWF0aW9uIChzdWNjZXNzIHN0YXR1cyBhbmQgcnVubmluZyB0aW1lKSB0byBhIHJlY3VycmVudCB0YXNrCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tXb3JrZXJJbmZvU2V0KAogICAgICAgIExhc3RXb3JrZXJUYXNrSUQgICAgICA9PiAxMjMsICAgICAgICAjIHRoZSB0YXNrIElEIGZyb20gdGhlIHdvcmtlciB0YWJsZSB0aGF0IGlzIHBlcmZvcm1pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICByZWN1cnJpbmcgdGFzawogICAgICAgIExhc3RXb3JrZXJTdGF0aXMgICAgICA9PiAxLCAgICAgICAgICAjIG9wdGlvbmFsIDEgb3IgMCwgZGVmYXVsdHMgdG8gMCwgMSBtZWFucyBzdWNjZXNzCiAgICAgICAgTGFzdFdvcmtlclJ1bm5pbmdUaW1lID0+IDEyMywgICAgICAgICMgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIDAsIHRoZSBudW1iZXIgaW4gc2Vjb25kcyBhIHdvcmtlciB0b29rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICB0byBjb21wbGV0ZSB0aGUgdGFzawogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrV29ya2VySW5mb1NldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TGFzdFdvcmtlclRhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIExhc3RXb3JrZXJUYXNrSUQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJExhc3RXb3JrZXJTdGF0dXMgICAgICA9ICRQYXJhbXtMYXN0V29ya2VyU3RhdHVzfSA/IDEgOiAwOwogICAgbXkgJExhc3RXb3JrZXJSdW5uaW5nVGltZSA9ICRQYXJhbXtMYXN0V29ya2VyUnVubmluZ1RpbWV9IC8vIDA7CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICBTRVQgbGFzdF93b3JrZXJfc3RhdHVzID0gPywgbGFzdF93b3JrZXJfcnVubmluZ190aW1lID0gPywgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICBXSEVSRSBsYXN0X3dvcmtlcl90YXNrX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkTGFzdFdvcmtlclN0YXR1cywKICAgICAgICAgICAgXCRMYXN0V29ya2VyUnVubmluZ1RpbWUsCiAgICAgICAgICAgIFwkUGFyYW17TGFzdFdvcmtlclRhc2tJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrVW5sb2NrRXhwaXJlZCgpCgpyZW1vdmUgbG9jayBzdGF0dXMgZm9yIHJlY3VycmluZyB0YXNrcyB0aGF0IGhhcyBiZWVuIGxvY2tlZCBmb3IgbW9yZSB0aGFuIDEgbWludXRlcwoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrVW5sb2NrRXhwaXJlZCgKICAgICAgICBUeXBlID0+ICdzb21lX3R5cGUnLAogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrVW5sb2NrRXhwaXJlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFR5cGUiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZSAoZ2V0IGFsbCByZWN1cnJlbnQgdGFza3MgZm9yIHRoZSBnaXZlbiB0eXBlIHdpdGggYSBsb2NrIGtleSBkaWZmZXJlbnQgdGhhbiAwKQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCBsb2NrX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgV0hFUkUgdGFza190eXBlID0gPwogICAgICAgICAgICAgICAgQU5EIGxvY2tfa2V5IDw+IDAKICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUeXBlfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIHRpbWUKICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CgogICAgICAgICMgY29udmVydCBsb2NrIHRpbWUgc3RhbXAgdG8gYSBzeXN0ZW0gdGltZQogICAgICAgIG15ICRMb2NrVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSb3dbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkTG9ja1RpbWUgPSAkTG9ja1RpbWUgPyAkTG9ja1RpbWUtPlRvRXBvY2goKSA6IDA7CgogICAgICAgICMgc2tpcCB0YXNrIGlmIGl0IGhhcyBiZWVuIGxvY2tlZCB3aXRoaW4gdGhlIGxhc3QgbWludXRlCiAgICAgICAgbmV4dCBST1cgaWYgJFN5c3RlbVRpbWUgLSAkTG9ja1RpbWUgPCA2MDsKCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBUYXNrSUQgICA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBMb2NrVGltZSA9PiAkUm93WzJdLAogICAgICAgIH07CiAgICB9CgogICAgIyBzdG9wIGlmIHRoZXJlIGFyZSBubyB0YXNrcyB0byB1bmxvY2sKICAgIHJldHVybiAxIGlmICFATGlzdDsKCiAgICBmb3IgbXkgJFRhc2sgKEBMaXN0KSB7CgogICAgICAgICMgdW5sb2NrIGFsbCB0aGUgdGFzayB0aGF0IGhhcyBiZWVuIGxvY2tlZCBmb3IgbW9yZSB0aGFuIDEgbWludXRlCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwLCBsb2NrX3RpbWUgPSBOVUxMLCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRUYXNrLT57VGFza0lEfSwgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfU2Vjb25kczJTdHJpbmcoKQoKY29udmVydCBhbiBhbW91bnQgb2Ygc2Vjb25kcyB0byBhIG1vcmUgaHVtYW4gcmVhZGFibGUgZm9ybWF0LCBlLmcuIDwgMSBTZWNvbmQsIDUgTWludXRlcwoKICAgIG15ICRTdHJpbmcgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9TZWNvbmRzMlN0cmluZyguMik7CgpyZXR1cm5zCgogICAgJFN0cmluZyA9ICc8IDEgU2Vjb25kJzsKCm9yCgogICAgbXkgJFN0cmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X1NlY29uZHMyU3RyaW5nKDgpOwoKcmV0dXJucwoKICAgICRTdHJpbmcgPSAnOCBTZWNvbmQocyknOwoKb3IKCiAgICBteSAkU3RyaW5nID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fU2Vjb25kczJTdHJpbmcoNjIpOwoKcmV0dXJucwoKICAgICRTdHJpbmcgPSAnMSBNaW51dGUocyknOwoKb3IKCiAgICBteSAkU3RyaW5nID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fU2Vjb25kczJTdHJpbmcoMzYxMCk7CgpyZXR1cm5zCgogICAgJFN0cmluZyA9ICcxIEhvdXIocyknOwoKb3IKCiAgICBteSAkU3RyaW5nID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fU2Vjb25kczJTdHJpbmcoODZfNjQwKTsKCnJldHVybnMKCiAgICAkU3RyaW5nID0gJzEgRGF5KHMpJzsKCj1jdXQKCnN1YiBfU2Vjb25kczJTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJFNlY29uZHMgKSA9IEBfOwoKICAgIHJldHVybiAnPCAxIFNlY29uZCcgaWYgJFNlY29uZHMgPCAxOwoKICAgIGlmICggJFNlY29uZHMgPj0gMjQgKiA2MCAqIDYwICkgewogICAgICAgIHJldHVybiBzcHJpbnRmICclLjFmIERheShzKScsICRTZWNvbmRzIC8gKCAyNCAqIDYwICogNjAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlY29uZHMgPj0gNjAgKiA2MCApIHsKICAgICAgICByZXR1cm4gc3ByaW50ZiAnJS4xZiBIb3VyKHMpJywgJFNlY29uZHMgLyAoIDYwICogNjAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlY29uZHMgPj0gNjAgKSB7CiAgICAgICAgcmV0dXJuIHNwcmludGYgJyUuMWYgTWludXRlKHMpJywgJFNlY29uZHMgLyAoNjApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHNwcmludGYgJyUuMWYgU2Vjb25kKHMpJywgJFNlY29uZHM7CiAgICB9Cn0KCj1oZWFkMiBfR2V0SWRlbnRpZmllcigpCgpjYWxjdWxhdGUgYSB0YXNrIGlkZW50aWZpZXIuCgogICAgbXkgJElkZW50aWZpZXIgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9HZXRJZGVudGlmaWVyKCk7CgpyZXR1cm5zCgogICAgJElkZW50aWZpZXIgPSAxMjM0NDU2Nzg5OwoKPWN1dAoKc3ViIF9HZXRJZGVudGlmaWVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCAkU2Vjb25kcywgJE1pY3Jvc2Vjb25kcyApID0gVGltZTo6SGlSZXM6OmdldHRpbWVvZmRheSgpOwogICAgbXkgJFByb2Nlc3NJRCA9ICQkOwoKICAgIG15ICRJZGVudGlmaWVyID0gJFByb2Nlc3NJRCAuICRNaWNyb3NlY29uZHM7CgogICAgbXkgJFJhbmRvbVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCAgICAgPT4gMTggLSBsZW5ndGggJElkZW50aWZpZXIsCiAgICAgICAgRGljdGlvbmFyeSA9PiBbIDAgLi4gOSBdLCAgICAgICAgICAgICAgICAjIG51bWVyaWMKICAgICk7CgogICAgJElkZW50aWZpZXIgLj0gJFJhbmRvbVN0cmluZzsKCiAgICByZXR1cm4gJElkZW50aWZpZXI7Cn0KCjE7Cg==</File>
        <File Location="Kernel/Config/Files/XML/AppointmentToTicket.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhcHBvaW50bWVudCBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUHJpb3JpdHkiIFZhbHVlUmVnZXg9IiI+MyBub3JtYWw8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU2VydmljZU1hbmRhdG9yeSIgVXNlclByZWZlcmVuY2VzR3JvdXA9IkFkdmFuY2VkIiBVc2VyTW9kaWZpY2F0aW9uUG9zc2libGU9IjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU0xBTWFuZGF0b3J5IiBVc2VyUHJlZmVyZW5jZXNHcm91cD0iQWR2YW5jZWQiIFVzZXJNb2RpZmljYXRpb25Qb3NzaWJsZT0iMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6QWdlbnRBcHBvaW50bWVudEVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iU3RhdGUiIFZhbHVlUmVnZXg9IiI+b3BlbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRDYWxlbmRhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyMjIzAwOS1BcHBvaW50bWVudFRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFKQVguanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRGF0YS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEeW5hbWljRmllbGRTY3JlZW5zIyMjQXBwb2ludG1lbnRUaWNrZXRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgY29uZmlndXJhdGlvbiBkZWZpbmVzIGFsbCBwb3NzaWJsZSBzY3JlZW5zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGR5bmFtaWMgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkR5bmFtaWNGaWVsZFNjcmVlbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNEeW5hbWljRmllbGQiPkFnZW50QXBwb2ludG1lbnRFZGl0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkR5bmFtaWNGaWVsZFNjcmVlbnM6Ok9iamVjdFR5cGVzIyMjQXBwb2ludG1lbnRUaWNrZXRzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSBhIGxpc3Qgb2YgZHluYW1pYyBmaWVsZCBvYmplY3QgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gYmUgYXNzaWduZWQgdG8gYWN0aW9ucyBvZiB0aGlzIHBhY2thZ2UgdmlhIHRoZSBkeW5hbWljIGZpZWxkIHNjcmVlbnMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkR5bmFtaWNGaWVsZFNjcmVlbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BcnRpY2xlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGlja2V0PC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZSBpcyB2aXNpYmxlIGZvciBjdXN0b21lcid9ID0gJ0FydGlrZWwgaXN0IGbDvHIgS3VuZGVuIHNpY2h0YmFyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdGlja2V0IGNyZWF0aW9uJ30gPSAnS2VpbmUgVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkZXMgZGVzdCBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdEaWUgw5xiZXJwcsO8ZnVuZyBkZXMgRmVsZGVzIG5leHQgc3RhdGUga29ubnRlIG5pY2h0IGR1cmNoZ2Vmw7xocnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJ30gPSAnVmFsaWRpZXJ1bmcgaW0gQXXDn2VuZGllbnN0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnRGllIFZhbGlkaWVydW5nIGRlcyBGZWxkZXMgU0xBIGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCB0eXBlISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkdHlwcyBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgcHJpb3JpdHkhJ30gPSAnRGllIMOcYmVycHLDvGZ1bmcgZGVzIEZlbGRlcyBQcmlvcml0w6R0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgYSBsaXN0IG9mIGR5bmFtaWMgZmllbGQgb2JqZWN0IHR5cGVzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIGFzc2lnbmVkIHRvIGFjdGlvbnMgb2YgdGhpcyBwYWNrYWdlIHZpYSB0aGUgZHluYW1pYyBmaWVsZCBzY3JlZW5zIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcm1pdHRlbHQgZGllIG7DpGNoc3Rtw7ZnbGljaGVuIFRpY2tldHN0YXR1cywgbmFjaGRlbSBlaW4gbmV1ZXMgVGlja2V0IGF1cyBlaW5lbSBLYWxlbmRlcnRlcm1pbiBpbiBkZXIgQWdlbnRlbm9iZXJmbMOkY2hlIGVyc3RlbGx0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0R5bmFtaXNjaGUgRmVsZGVyLCBkaWUgaW4gZGVyIFRlcm1pbmJlYXJiZWl0dW5nc21hc2tlIGRlciBBZ2VudGVuc2Nobml0dHN0ZWxsZSBhbmdlemVpZ3Qgd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBmb3IgbmV3IHRpY2tldHMgaW4gdGhlIEFnZW50QXBwb2ludG1lbnRFZGl0IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0xlZ3QgZGVuIFN0YW5kYXJkbmFjaGZvbGdlc3RhdHVzIGbDvHIgbmV1ZSBUaWNrZXRzIGluIGRlciBTY2huaXR0c3RlbGxlIEFnZW50QXBwb2ludG1lbnRFZGl0IGZlc3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdMZWd0IGRpZSBTdGFuZGFyZHByaW9yaXTDpHQgZsO8ciBuZXVlIFRpY2tldHMgaW4gZGVyIFNjaG5pdHRzdGVsbGUgQWdlbnRBcHBvaW50bWVudEVkaXQgZmVzdC4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICcrJXMgbW9yZScsCiAgICAnQWxsIG9jY3VycmVuY2VzJywKICAgICdBbGwtZGF5JywKICAgICdBcHBvaW50bWVudCcsCiAgICAnQXByJywKICAgICdBcHJpbCcsCiAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAnQXVnJywKICAgICdBdWd1c3QnLAogICAgJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgICdEYXknLAogICAgJ0RlYycsCiAgICAnRGVjZW1iZXInLAogICAgJ0R1cGxpY2F0ZWQgZW50cnknLAogICAgJ0ZlYicsCiAgICAnRmVicnVhcnknLAogICAgJ0ZpcnN0IHNlbGVjdCBhIGN1c3RvbWVyIHVzZXIsIHRoZW4gc2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnRnInLAogICAgJ0ZyaScsCiAgICAnRnJpZGF5JywKICAgICdJdCBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGZpZWxkLCBwbGVhc2UgdHJ5IGFnYWluLicsCiAgICAnSmFuJywKICAgICdKYW51YXJ5JywKICAgICdKdWwnLAogICAgJ0p1bHknLAogICAgJ0p1bXAnLAogICAgJ0p1bicsCiAgICAnSnVuZScsCiAgICAnSnVzdCB0aGlzIG9jY3VycmVuY2UnLAogICAgJ0xvYWRpbmcuLi4nLAogICAgJ01hcicsCiAgICAnTWFyY2gnLAogICAgJ01heScsCiAgICAnTWF5X2xvbmcnLAogICAgJ01vJywKICAgICdNb24nLAogICAgJ01vbmRheScsCiAgICAnTW9udGgnLAogICAgJ05hbWUnLAogICAgJ05leHQnLAogICAgJ05vdicsCiAgICAnTm92ZW1iZXInLAogICAgJ09jdCcsCiAgICAnT2N0b2JlcicsCiAgICAnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicsCiAgICAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnLAogICAgJ1ByZXZpb3VzJywKICAgICdSZXNvdXJjZXMnLAogICAgJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycsCiAgICAnU2EnLAogICAgJ1NhdCcsCiAgICAnU2F0dXJkYXknLAogICAgJ1NhdmUnLAogICAgJ1NlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nLAogICAgJ1NlcCcsCiAgICAnU2VwdGVtYmVyJywKICAgICdTZXR0aW5ncycsCiAgICAnU3UnLAogICAgJ1N1bicsCiAgICAnU3VuZGF5JywKICAgICdUaCcsCiAgICAnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJywKICAgICdUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50JywKICAgICdUaHUnLAogICAgJ1RodXJzZGF5JywKICAgICdUaW1lbGluZSBEYXknLAogICAgJ1RpbWVsaW5lIE1vbnRoJywKICAgICdUaW1lbGluZSBXZWVrJywKICAgICdUb2RheScsCiAgICAnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycsCiAgICAnVHUnLAogICAgJ1R1ZScsCiAgICAnVHVlc2RheScsCiAgICAnV2UnLAogICAgJ1dlZCcsCiAgICAnV2VkbmVzZGF5JywKICAgICdXZWVrJywKICAgICdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nLAogICAgJ21vcmUnLAogICAgJ25vbmUnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="Kernel/Language/hu_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnSmVneWzDqXRyZWhvesOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcnRpY2xlIGlzIHZpc2libGUgZm9yIGN1c3RvbWVyJ30gPSAnQSBiZWplZ3l6w6lzIGzDoXRoYXTDsyBheiDDvGd5ZsOpbG5layc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHRpY2tldCBjcmVhdGlvbid9ID0gJ05pbmNzIGplZ3lsw6l0cmVob3rDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgY8OpbCBtZXrFkW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBhIGvDtnZldGtlesWRIMOhbGxhcG90IG1lesWRbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBzZXJ2aWNlISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgc3pvbGfDoWx0YXTDoXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIFNMQSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBheiBTTEEgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJ30gPSAnTmVtIHNpa2Vyw7xsdCB2w6lncmVoYWp0YW5pIGF6IGVsbGVuxZFyesOpc3QgYSB0w61wdXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHByaW9yaXR5ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgcHJpb3JpdMOhcyBtZXrFkW4hJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIGEgbGlzdCBvZiBkeW5hbWljIGZpZWxkIG9iamVjdCB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBhc3NpZ25lZCB0byBhY3Rpb25zIG9mIHRoaXMgcGFja2FnZSB2aWEgdGhlIGR5bmFtaWMgZmllbGQgc2NyZWVucyBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBem9uIGRpbmFtaWt1cyBtZXrFkSBvYmpla3R1bXTDrXB1c29rIGxpc3TDoWrDoW5hayBtZWdoYXTDoXJvesOhc2EsIGFtZWx5ZWsgaG96esOhcmVuZGVsaGV0xZFrIGEgY3NvbWFnIG3FsXZlbGV0ZWloZXogYSBkaW5hbWlrdXMgbWV6xZEga8OpcGVybnnFkWluZWsgZmVsw7xsZXTDqW4ga2VyZXN6dMO8bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGvDtnZldGtlesWRIGxlaGV0c8OpZ2VzIGplZ3nDoWxsYXBvdG9rYXQgZWd5IG5hcHTDoXJpZMWRcG9udGLDs2wgc3rDoXJtYXrDsyDDumogamVneSBsw6l0cmVob3rDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBeiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGlkxZFwb250IHN6ZXJrZXN6dMOpc2Uga8OpcGVybnnFkWrDqW4gbWVnamVsZW7DrXRldHQgZGluYW1pa3VzIG1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYXogw7pqIGplZ3llayBhbGFww6lydGVsbWV6ZXR0IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGF6IGlkxZFwb250IHN6ZXJrZXN6dMOpc8OpbsOpbCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBheiDDumogamVneWVrIGFsYXDDqXJ0ZWxtZXpldHQgcHJpb3JpdMOhc8OhdCBheiBpZMWRcG9udCBzemVya2VzenTDqXPDqW7DqWwgYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJyslcyBtb3JlJywKICAgICdBbGwgb2NjdXJyZW5jZXMnLAogICAgJ0FsbC1kYXknLAogICAgJ0FwcG9pbnRtZW50JywKICAgICdBcHInLAogICAgJ0FwcmlsJywKICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJywKICAgICdBdWcnLAogICAgJ0F1Z3VzdCcsCiAgICAnQ2xvc2UgdGhpcyBkaWFsb2cnLAogICAgJ0RheScsCiAgICAnRGVjJywKICAgICdEZWNlbWJlcicsCiAgICAnRHVwbGljYXRlZCBlbnRyeScsCiAgICAnRmViJywKICAgICdGZWJydWFyeScsCiAgICAnRmlyc3Qgc2VsZWN0IGEgY3VzdG9tZXIgdXNlciwgdGhlbiBzZWxlY3QgYSBjdXN0b21lciBJRCB0byBhc3NpZ24gdG8gdGhpcyB0aWNrZXQuJywKICAgICdGcicsCiAgICAnRnJpJywKICAgICdGcmlkYXknLAogICAgJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJywKICAgICdKYW4nLAogICAgJ0phbnVhcnknLAogICAgJ0p1bCcsCiAgICAnSnVseScsCiAgICAnSnVtcCcsCiAgICAnSnVuJywKICAgICdKdW5lJywKICAgICdKdXN0IHRoaXMgb2NjdXJyZW5jZScsCiAgICAnTG9hZGluZy4uLicsCiAgICAnTWFyJywKICAgICdNYXJjaCcsCiAgICAnTWF5JywKICAgICdNYXlfbG9uZycsCiAgICAnTW8nLAogICAgJ01vbicsCiAgICAnTW9uZGF5JywKICAgICdNb250aCcsCiAgICAnTmFtZScsCiAgICAnTmV4dCcsCiAgICAnTm92JywKICAgICdOb3ZlbWJlcicsCiAgICAnT2N0JywKICAgICdPY3RvYmVyJywKICAgICdQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJywKICAgICdQcmVzcyBDdHJsK0MgKENtZCtDKSB0byBjb3B5IHRvIGNsaXBib2FyZCcsCiAgICAnUHJldmlvdXMnLAogICAgJ1Jlc291cmNlcycsCiAgICAnUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzJywKICAgICdTYScsCiAgICAnU2F0JywKICAgICdTYXR1cmRheScsCiAgICAnU2F2ZScsCiAgICAnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnU2VwJywKICAgICdTZXB0ZW1iZXInLAogICAgJ1NldHRpbmdzJywKICAgICdTdScsCiAgICAnU3VuJywKICAgICdTdW5kYXknLAogICAgJ1RoJywKICAgICdUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4nLAogICAgJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnLAogICAgJ1RodScsCiAgICAnVGh1cnNkYXknLAogICAgJ1RpbWVsaW5lIERheScsCiAgICAnVGltZWxpbmUgTW9udGgnLAogICAgJ1RpbWVsaW5lIFdlZWsnLAogICAgJ1RvZGF5JywKICAgICdUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJywKICAgICdUdScsCiAgICAnVHVlJywKICAgICdUdWVzZGF5JywKICAgICdXZScsCiAgICAnV2VkJywKICAgICdXZWRuZXNkYXknLAogICAgJ1dlZWsnLAogICAgJ1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPycsCiAgICAnbW9yZScsCiAgICAnbm9uZScsCiAgICApOwoKfQoKMTsK</File>
        <File Location="Kernel/Language/ja_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAn44OB44Kx44OD44OI44Gu5L2c5oiQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInfSA9ICfoqJjkuovjgpLpoaflrqLjgavlhazplosnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB0aWNrZXQgY3JlYXRpb24nfSA9ICfjg4HjgrHjg4Pjg4jjgpLkvZzmiJDjgZfjgarjgYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ2Rlc3Qg44OV44Kj44O844Or44OJ44Gu5qSc6Ki844KS5a6f6KGM44Gn44GN44G+44Gb44KT44Gn44GX44Gf77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICduZXh0IHN0YXRlIOODleOCo+ODvOODq+ODieOBruaknOiovOOCkuWun+ihjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJ30gPSAnc2VydmljZSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnU0xBIOODleOCo+ODvOODq+ODieOBruaknOiovOOCkuWun+ihjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJ30gPSAndHlwZSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBwcmlvcml0eSEnfSA9ICdwcmlvcml0eSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgYSBsaXN0IG9mIGR5bmFtaWMgZmllbGQgb2JqZWN0IHR5cGVzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIGFzc2lnbmVkIHRvIGFjdGlvbnMgb2YgdGhpcyBwYWNrYWdlIHZpYSB0aGUgZHluYW1pYyBmaWVsZCBzY3JlZW5zIGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+ODgOOCpOODiuODn+ODg+OCr+ODleOCo+ODvOODq+ODieeUu+mdouOCpOODs+OCv+ODleOCp+ODvOOCueOCkuS7i+OBl+OBpuOAgeOBk+OBruODkeODg+OCseODvOOCuOOBruOCouOCr+OCt+ODp+ODs+OBq+WJsuOCiuW9k+OBpuOCi+OBk+OBqOOBjOOBp+OBjeOCi+ODgOOCpOODiuODn+ODg+OCr+ODleOCo+ODvOODq+ODieOBruOCquODluOCuOOCp+OCr+ODiOOCv+OCpOODl+OBruS4gOimp+OCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgafjgIHjgqvjg6zjg7Pjg4Djg7zjga7kuojntITjgYvjgonmlrDopo/jg4HjgrHjg4Pjg4jjgpLkvZzmiJDjgZfjgZ/lvozjgavpgbjmip7lj6/og73jgarjg4HjgrHjg4Pjg4jjgrnjg4bjg7zjgr/jgrnjgpLmsbrlrprjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7kuojntITnt6jpm4bnlLvpnaLjgavooajnpLrjgZnjgovjg4DjgqTjg4rjg5/jg4Pjgq/jg5XjgqPjg7zjg6vjg4njgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQWdlbnRBcHBvaW50bWVudEVkaXQg44Kk44Oz44K/44OV44Kn44O844K544Gn44CB5paw6KaP44OB44Kx44OD44OI44Gu44OH44OV44Kp44Or44OI44Gu5qyh44Gu44K544OG44O844K/44K544KS6Kit5a6a44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBZ2VudEFwcG9pbnRtZW50RWRpdCDjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgafjgIHmlrDopo/jg4HjgrHjg4Pjg4jjga7jg4fjg5Xjgqnjg6vjg4jjga7lhKrlhYjluqbjgpLoqK3lrprjgZfjgb7jgZnjgIInOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICcrJXMgbW9yZScsCiAgICAnQWxsIG9jY3VycmVuY2VzJywKICAgICdBbGwtZGF5JywKICAgICdBcHBvaW50bWVudCcsCiAgICAnQXByJywKICAgICdBcHJpbCcsCiAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAnQXVnJywKICAgICdBdWd1c3QnLAogICAgJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgICdEYXknLAogICAgJ0RlYycsCiAgICAnRGVjZW1iZXInLAogICAgJ0R1cGxpY2F0ZWQgZW50cnknLAogICAgJ0ZlYicsCiAgICAnRmVicnVhcnknLAogICAgJ0ZpcnN0IHNlbGVjdCBhIGN1c3RvbWVyIHVzZXIsIHRoZW4gc2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnRnInLAogICAgJ0ZyaScsCiAgICAnRnJpZGF5JywKICAgICdJdCBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGZpZWxkLCBwbGVhc2UgdHJ5IGFnYWluLicsCiAgICAnSmFuJywKICAgICdKYW51YXJ5JywKICAgICdKdWwnLAogICAgJ0p1bHknLAogICAgJ0p1bXAnLAogICAgJ0p1bicsCiAgICAnSnVuZScsCiAgICAnSnVzdCB0aGlzIG9jY3VycmVuY2UnLAogICAgJ0xvYWRpbmcuLi4nLAogICAgJ01hcicsCiAgICAnTWFyY2gnLAogICAgJ01heScsCiAgICAnTWF5X2xvbmcnLAogICAgJ01vJywKICAgICdNb24nLAogICAgJ01vbmRheScsCiAgICAnTW9udGgnLAogICAgJ05hbWUnLAogICAgJ05leHQnLAogICAgJ05vdicsCiAgICAnTm92ZW1iZXInLAogICAgJ09jdCcsCiAgICAnT2N0b2JlcicsCiAgICAnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicsCiAgICAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnLAogICAgJ1ByZXZpb3VzJywKICAgICdSZXNvdXJjZXMnLAogICAgJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycsCiAgICAnU2EnLAogICAgJ1NhdCcsCiAgICAnU2F0dXJkYXknLAogICAgJ1NhdmUnLAogICAgJ1NlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nLAogICAgJ1NlcCcsCiAgICAnU2VwdGVtYmVyJywKICAgICdTZXR0aW5ncycsCiAgICAnU3UnLAogICAgJ1N1bicsCiAgICAnU3VuZGF5JywKICAgICdUaCcsCiAgICAnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJywKICAgICdUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50JywKICAgICdUaHUnLAogICAgJ1RodXJzZGF5JywKICAgICdUaW1lbGluZSBEYXknLAogICAgJ1RpbWVsaW5lIE1vbnRoJywKICAgICdUaW1lbGluZSBXZWVrJywKICAgICdUb2RheScsCiAgICAnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycsCiAgICAnVHUnLAogICAgJ1R1ZScsCiAgICAnVHVlc2RheScsCiAgICAnV2UnLAogICAgJ1dlZCcsCiAgICAnV2VkbmVzZGF5JywKICAgICdXZWVrJywKICAgICdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nLAogICAgJ21vcmUnLAogICAgJ25vbmUnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="Kernel/System/Daemon/DaemonModules/SchedulerTaskWorker/AppointmentTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCAgICAgICAgICAgICAgICAgICAgICAgIHF3KEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OkJhc2VUYXNrV29ya2VyKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpBcHBvaW50bWVudFRpY2tldCAtIFNjaGVkdWxlciBkYWVtb24gdGFzayBoYW5kbGVyIG1vZHVsZSBmb3IgQXBwb2ludG1lbnRUaWNrZXQKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyB0YXNrIGhhbmRsZXIgZXhlY3V0ZXMgYXBwb2ludG1lbnQgdGlja2V0IGpvYnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGFza0hhbmRsZXJPYmplY3QgPSAkS2VybmVsOjpPTS1HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSAgICAgID0gJFBhcmFte0RlYnVnfTsKICAgICRTZWxmLT57V29ya2VyTmFtZX0gPSAnV29ya2VyOiBBcHBvaW50bWVudFRpY2tldCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKCnBlcmZvcm1zIHRoZSBzZWxlY3RlZCB0YXNrLgoKICAgIG15ICRSZXN1bHQgPSAkVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgICAgICBUYXNrSUQgICA9PiAxMjMsCiAgICAgICAgVGFza05hbWUgPT4gJ3NvbWUgbmFtZScsICAgICMgb3B0aW9uYWwKICAgICAgICBEYXRhICAgICA9PiB7ICAgICAgICAgICAgICAgIyBhcHBvaW50bWVudCBpZCBhcyBnb3QgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50OjpBcHBvaW50bWVudEdldCgpCiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLAogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICAkUmVzdWx0ID0gMTsgIyBvciBmYWlsIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHRhc2sgcGFyYW1zCiAgICBteSAkQ2hlY2tSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVGFza1BhcmFtcygKICAgICAgICAlUGFyYW0sCiAgICAgICAgTmVlZGVkRGF0YUF0dHJpYnV0ZXMgPT4KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0FwcG9pbnRtZW50VGlja2V0JywgJ0FwcG9pbnRtZW50SUQnCiAgICAgICAgICAgIF0sCiAgICApOwoKICAgICMgc3RvcCBleGVjdXRpb24gaWYgYW4gZXJyb3IgaW4gcGFyYW1zIGlzIGRldGVjdGVkCiAgICByZXR1cm4gaWYgISRDaGVja1Jlc3VsdDsKCiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQnKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgIHByaW50ICIgICAgJFNlbGYtPntXb3JrZXJOYW1lfSBleGVjdXRlcyB0YXNrOiAkUGFyYW17VGFza05hbWV9XG4iOwogICAgfQoKICAgICMgZmV0Y2hpbmcgY3VzdG9tZXIgdXNlciBmcm9tIHNlbGVjdGVkY3VzdG9tZXJ1c2VyCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgYXBwb2ludG1lbnQgdGlja2V0CiAgICBteSAkVGlja2V0SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldENyZWF0ZSgKICAgICAgICAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgIEN1c3RvbWVyVXNlciA9PiAlQ3VzdG9tZXJVc2VyID8gJEN1c3RvbWVyVXNlcntVc2VyTG9naW59IDogJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkVGlja2V0SUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdHJpZ2dlciB0aWNrZXQgYXBwb2ludG1lbnQgZm9yIEFwcG9pbnRtZW50SUQgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQKICAgIG15IEBEeW5hbWljRmllbGRDb25maWdzOwogICAgbXkgJUR5bmFtaWNGaWVsZHM7CiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9ICkgewoKICAgICAgICAjIEZldGNoIGR5bmFtaWMgZmllbGQgY29uZmlncwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQER5bmFtaWNGaWVsZENvbmZpZ3MgPSBkZWZpbmVkICREeW5hbWljRmllbGRDb25maWdzUmVmID8gQHskRHluYW1pY0ZpZWxkQ29uZmlnc1JlZn0gOiAoKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICVEeW5hbWljRmllbGRzID0gJXsgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30gfTsKICAgICAgICBEWU5BTUlDRklFTERUSUNLRVQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKEBEeW5hbWljRmllbGRDb25maWdzKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEVElDS0VUIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTERUSUNLRVQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmluZyBmcm9tIGRhdGEKICAgIG15ICRBcnRpY2xlRnJvbTsKICAgIG15IEBDdXN0b21lclVzZXJzID0gc3BsaXQgLywvLCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21lclVzZXJ9OwogICAgZm9yIG15ICRDdXN0b21lclVzZXIgKEBDdXN0b21lclVzZXJzKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICApOwogICAgICAgIG15ICRDdXN0b21lclVzZXJTdHJpbmcKICAgICAgICAgICAgPSAlQ3VzdG9tZXJVc2VyRGF0YSA/ICJcIiRDdXN0b21lclVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMYXN0bmFtZX1cIiA8JEN1c3RvbWVyVXNlckRhdGF7VXNlckVtYWlsfT4iIDogJEN1c3RvbWVyVXNlcjsKICAgICAgICBpZiAoJEFydGljbGVGcm9tKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJvbSAuPSAiLCAkQ3VzdG9tZXJVc2VyU3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICIkQ3VzdG9tZXJVc2VyU3RyaW5nIjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnICk7CiAgICBteSAkQXJ0aWNsZUlEICAgICAgICAgICAgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdzeXN0ZW0nLAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0FydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXJ9IHx8IDAsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEFydGljbGVGcm9tLAogICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U3ViamVjdH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDb250ZW50fSApLAogICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICd1dGYtOCcsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnTWlzYycsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ0F1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aWNrZXQgZnJvbSBhcHBvaW50bWVudCcsCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgPyAnYXV0byByZXBseScKICAgICAgICA6ICcnLAogICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICBGcm9tICAgID0+ICRBcnRpY2xlRnJvbSwKICAgICAgICAgICAgVG8gICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0NvbnRlbnR9LAogICAgICAgIH0sCiAgICAgICAgUXVldWUgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57UXVldWVJRH0sCiAgICApOwoKICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGFydGljbGUgZm9yIHRpY2tldCAkVGlja2V0SUQgZnJvbSBhcHBvaW50bWVudCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBEWU5BTUlDRklFTERBUlRJQ0xFOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnIChARHluYW1pY0ZpZWxkQ29uZmlncykgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMREFSVElDTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMREFSVElDTEUgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdBcnRpY2xlJzsKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZXRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGZ1dHVyZSB0YXNrIGlkIGZyb20gYXBwb2ludG1lbnQKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgRnV0dXJlVGFza0lEID0+IHVuZGVmLAogICAgKTsKCiAgICAjIENoZWNrIGlmIGFwcG9pbnRtZW50IGlzIHJlY3VycmluZyBhbmQgaWYgc28sIGNyZWF0ZSBuZXh0IGZ1dHVyZSB0YXNrIGZvciBhcHBvaW50bWVudCB3aGljaCBpcyBpbiB0aGUgZnV0dXJlIGFuZCBjbG9zZXN0IHRvIG5vdwogICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSB8fCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICkgewoKICAgICAgICAjIEdldCBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMKICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICBQYXJlbnRJRCAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CgogICAgICAgICMgUHVzaCBwYXJlbnQgaW50byBsaXN0IHNpbmNlIEFwcG9pbnRtZW50TGlzdCB3aXRoIGZpbHRlciBQYXJlbnRJRCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwYXJlbnQgaXRzZWxmCiAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAoICRBcHBvaW50bWVudHtQYXJlbnRJRH0gPyAkQXBwb2ludG1lbnR7UGFyZW50SUR9IDogJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkKICAgICAgICApOwogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50cywgXCVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICAgICApOwoKICAgICAgICBteSAkTmV4dEFwcG9pbnRtZW50OwogICAgICAgIG15ICRUaW1lRGlmZjsKICAgICAgICBteSAkRXhlY3V0aW9uVGltZTsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50UmVmIChAQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1RpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudFJlZi0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkQXBwb2ludG1lbnRSZWYtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudFRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICBteSAkRGVsdGFSZXN1bHQgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnRUaW1lT2JqZWN0ICk7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRUaW1lRGlmZiApIHsKICAgICAgICAgICAgICAgICAgICAkTmV4dEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50UmVmOwogICAgICAgICAgICAgICAgICAgICRUaW1lRGlmZiAgICAgICAgPSAkRGVsdGFSZXN1bHQtPntBYnNvbHV0ZVNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGVsdGFSZXN1bHQtPntBYnNvbHV0ZVNlY29uZHN9IDwgJFRpbWVEaWZmICkgewogICAgICAgICAgICAgICAgICAgICROZXh0QXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRSZWY7CiAgICAgICAgICAgICAgICAgICAgJFRpbWVEaWZmICAgICAgICA9ICREZWx0YVJlc3VsdC0+e0Fic29sdXRlU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmV4dEFwcG9pbnRtZW50KSB7CgogICAgICAgICAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBpbiBkYgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJE5leHRBcHBvaW50bWVudC0+JSosCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICRUaWNrZXRJRDsKfQoKMTsK</File>
        <File Location="scripts/test/AppointmentToTicket/AppointmentToTicket.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7CgpvdXIgJFNlbGY7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkQXJ0aWNsZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRMaW5rT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7Cm15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7Cm15ICRUYXNrSGFuZGxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKJFNlbGYtPklzKAogICAgcmVmICRTY2hlZHVsZXJEQk9iamVjdCwKICAgICdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicsCiAgICAiS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREItPm5ldygpIiwKKTsKCiMgQ3JlYXRlIGNhbGVuZGFyCm15ICRDYWxlbmRhck5hbWUgPSAnVGVzdF8nIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUNhbGVuZGFyICAgICA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gJENhbGVuZGFyTmFtZSwKICAgIEdyb3VwSUQgICAgICA9PiAxLAogICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKbXkgJFN0YXJ0VGltZU9iaiA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEsCik7Cm15ICRFbmRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRFbmRUaW1lT2JqLT5BZGQoCiAgICBEYXlzICA9PiAxLAogICAgSG91cnMgPT4gMSwKKTsKCiMgQ3JlYXRlIFRlc3QgQ3VzdG9tZXIgVXNlcgpteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrCm15ICRSYW5kb21JRCAgICAgICAgICA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7Cm15ICVBcHBvaW50bWVudFRpY2tldCA9ICgKICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICIiLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgIEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFF1ZXVlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIE93bmVySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+IDMsCiAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBTZXJ2aWNlSUQgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgU0xBSUQgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+IHVuZGVmLAogICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiB1bmRlZiwKKTsKbXkgJFNpbmdsZUFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRCwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9LAopOwoKIyBUcmlnZ2VyIEZ1dHVyZSBUYXNrIEV4ZWN1dGlvbgokVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgIFRhc2tJRCAgID0+ICRGdXR1cmVUYXNre1Rhc2tJRH0sCiAgICBUYXNrTmFtZSA9PiAkRnV0dXJlVGFza3tOYW1lfSwKICAgIERhdGEgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LAopOwoKIyBDaGVjayBpZiB0aWNrZXQgd2FzIGNyZWF0ZWQgLT4gdmlhIGxpbmsgb2JqZWN0Cm15ICRMaW5rTGlzdCA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdCgKICAgIE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgS2V5ICAgID0+ICRTaW5nbGVBcHBvaW50bWVudElELAogICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JExpbmtMaXN0fSwKICAgIDEsCiAgICAiVGhlIG51bWJlciBvZiBjcmVhdGVkIGxpbmtzIGZvciB0aGUgYXBwb2ludG1lbnQgaXMgbm90IGNvcnJlY3QiLAopOwoKIyBGZXRjaCBUaWNrZXQKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICgga2V5cyAkTGlua0xpc3QtPntUaWNrZXR9LT57Tm9ybWFsfS0+e1NvdXJjZX0tPiUqIClbMF0sCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzTm90KAogICAgc2NhbGFyIGtleXMgJVRpY2tldCwKICAgIDAsCiAgICAiVGlja2V0IHdhcyBub3QgY3JlYXRlZCIsCik7CgojIEZldGNoIEFydGljbGUKbXkgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVMaXN0LAogICAgMSwKICAgICJUaGUgbnVtYmVyIG9mIGNyZWF0ZWQgYXJ0aWNsZXMgZm9yIHRoZSB0aWNrZXQgaXMgbm90IGNvcnJlY3QiLAopOwoKbXkgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBcnRpY2xlTGlzdFswXSB9ICktPkFydGljbGVHZXQoICV7ICRBcnRpY2xlTGlzdFswXSB9ICk7CiRTZWxmLT5Jc05vdCgKICAgIHNjYWxhciBrZXlzICVBcnRpY2xlLAogICAgMCwKICAgICJBcnRpY2xlIHdhcyBub3QgY3JlYXRlZCIsCik7CgojIENyZWF0ZSBSZWN1cnJpbmcgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmUgVGFzayBvbiBQYXJlbnQgQXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEUmVjdXJyaW5nICAgICAgICAgID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5nID0gKAogICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICBDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+IHVuZGVmLAogICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gMywKICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gNCwKICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IHVuZGVmLAopOwpteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlY3VycmluZyAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFJlY3VycmVuY2VEYXlzICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBSZWN1cnJlbmNlTW9udGhzICAgICAgICAgICAgICAgID0+ICIiLAogICAgUmVjdXJyZW5jZU1vbnRoRGF5cyAgICAgICAgICAgICA9PiAiIiwKICAgIFJlY3VycmVuY2VUeXBlICAgICAgICAgICAgICAgICAgPT4gIldlZWtseSIsCiAgICBSZWN1cnJlbmNlQ3VzdG9tVHlwZSAgICAgICAgICAgID0+ICJDdXN0b21EYWlseSIsCiAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgICAgICAgICAgID0+IDEsCiAgICBEYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBNb250aERheXMgICAgICAgICAgICAgICAgICAgICAgID0+IDMwLAogICAgTW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA2LAogICAgUmVjdXJyZW5jZUxpbWl0ICAgICAgICAgICAgICAgICA9PiAyLAogICAgUmVjdXJyZW5jZVVudGlsRGF5ICAgICAgICAgICAgICA9PiAzLAogICAgUmVjdXJyZW5jZVVudGlsTW9udGggICAgICAgICAgICA9PiA3LAogICAgUmVjdXJyZW5jZVVudGlsWWVhciAgICAgICAgICAgICA9PiAyMDIyLAogICAgUmVjdXJyZW5jZUNvdW50ICAgICAgICAgICAgICAgICA9PiA0LAogICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBBcHBvaW50bWVudFRpY2tldCAgICAgICAgICAgICAgID0+IFwlQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmcsCiAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tUZW1wbGF0ZX0sCiAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b219LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAopOwokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwoKbXkgJVJlY3VycmluZ0FwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0dldCgKICAgIFRhc2tJRCA9PiAkUmVjdXJyaW5nQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSwKKTsKCm15ICRTdGFydFRpbWVQYXN0T2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAopOwokU3RhcnRUaW1lUGFzdE9iai0+U3VidHJhY3QoCiAgICBEYXlzID0+IDQsCik7CgpteSAkRW5kVGltZVBhc3RPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICBEYXlzICA9PiAzLAogICAgSG91cnMgPT4gMjMsCik7CgojIFNoaWZ0IEFwcG9pbnRtZW50IHRvIHRoZSBwYXN0IGFuZCBjaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIHRvIHRoZSBjb3JyZWN0IENoaWxkIEFwcG9pbnRtZW50Cm15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVSZWN1cnJpbmdBcHBvaW50bWVudCwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5ne0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LAogICAgU3RhcnRUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBDaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIGNvcnJlY3RseQpteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFBhcmVudElEICAgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgIDMsCiAgICAiTnVtYmVyIG9mIGNoaWxkIGFwcG9pbnRtZW50cyBpcyBub3QgY29ycmVjdCIsCik7CgokU2VsZi0+SXNOb3QoCiAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57RnV0dXJlVGFza0lEfSwKICAgIHVuZGVmLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3Qgc2hpZnRlZCBjb3JyZWN0bHkiLAopOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrLCBzaGlmdCBpdCBhbmQgY2hlY2sgRnV0dXJlVGFzayBFeGVjdXRpb24gVGltZQpteSAkU2luZ2xlQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50SUQyLAopOwpteSAlRnV0dXJlVGFzazIgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tHZXQoCiAgICBUYXNrSUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50MntGdXR1cmVUYXNrSUR9LAopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKCiMgVXBkYXRlIEFwcG9pbnRtZW50CiRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVTaW5nbGVBcHBvaW50bWVudDIsCiAgICBBcHBvaW50bWVudFRpY2tldCA9PiAkRnV0dXJlVGFzazJ7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0sCiAgICBTdGFydFRpbWUgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKbXkgJVNpbmdsZUFwcG9pbnRtZW50MlVwZGF0ZWQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRDIsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFzazJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudDJVcGRhdGVke0Z1dHVyZVRhc2tJRH0sCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFzazJVcGRhdGVke0V4ZWN1dGlvblRpbWV9LAogICAgJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgICJGdXR1cmUgdGFzayB3YXMgbm90IHVwZGF0ZWQgY29ycmVjdGx5IiwKKTsKCiMgQ3JlYXRlIFJlY3VycmluZyBBcHBvaW50bWVudCB3aXRoIEZ1dHVyZSBUYXNrIG9uIFBhcmVudCBBcHBvaW50bWVudApteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldFJlY3VycmluZywKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CiRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCk7CgpteSAlUmVjdXJyaW5nQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQyLAopOwoKbXkgJUZ1dHVyZVRhc2tSZWN1cnJpbmcyID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMQopOwokRW5kVGltZU9iai0+QWRkKAogICAgRGF5cyA9PiAxLAopOwoKIyBVcGRhdGUgQXBwb2ludG1lbnQKJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgJVJlY3VycmluZ0FwcG9pbnRtZW50MiwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5nMntEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fSwKICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZzJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTZWxmLT5JcygKICAgICRGdXR1cmVUYXNrUmVjdXJyaW5nMlVwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3QgdXBkYXRlZCBjb3JyZWN0bHkiLAopOwoKJFNlbGYtPkRvbmVUZXN0aW5nKCk7Cg==</File>
        <File Location="scripts/test/Daemon/SchedulerDBFutureTaskUpdate.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7CgpvdXIgJFNlbGY7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkU2NoZWR1bGVyREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpOwokU2VsZi0+SXMoCiAgICByZWYgJFNjaGVkdWxlckRCT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICJLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQi0+bmV3KCkiLAopOwoKIyBDcmVhdGUgY2FsZW5kYXIKbXkgJENhbGVuZGFyTmFtZSA9ICdUZXN0XycgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAlQ2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgR3JvdXBJRCAgICAgID0+IDEsCiAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgpteSAkU3RhcnRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKbXkgJEVuZFRpbWVPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgID0+IDEsCiAgICBIb3VycyA9PiAxLAopOwoKIyBDcmVhdGUgYXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEICAgICAgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSUQsCiAgICBEZXNjcmlwdGlvbiA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBTdGFydFRpbWUgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKIyBDcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7CgojIENyZWF0ZSBpbml0aWFsIGZ1dHVyZSB0YXNrCm15ICRGdXR1cmVUYXNrSUQgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tBZGQoCiAgICBFeGVjdXRpb25UaW1lID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBUeXBlICAgICAgICAgID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7CiAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAndGVzdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgfQopOwoKIyBDaGVjayBpZiB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICB1bmRlZiwKICAgICJGdXR1cmUgdGFzayBpZCBpcyB1bmRlZiIsCik7CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICAtMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgY3JlYXRlZCwgUmVzdWx0OiAkRnV0dXJlVGFza0lEIiwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgojIFVwZGF0ZSBleGVjdXRpb24gdGltZQpteSAkRXhlY3V0aW9uVGltZU5ldyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokRXhlY3V0aW9uVGltZU5ldy0+QWRkKAogICAgRGF5cyAgPT4gMiwKICAgIEhvdXJzID0+IDEsCik7Cm15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrVXBkYXRlKAogICAgVGFza0lEICAgICAgICA9PiAkRnV0dXJlVGFza0lELAogICAgRXhlY3V0aW9uVGltZSA9PiAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgIERhdGEgICAgICAgICAgPT4gewogICAgICAgIEFwcG9pbnRtZW50SUQgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgU3ViamVjdCA9PiAnU29tZVRpdGxlMl8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBCb2R5ICAgID0+ICdTb21lRGVzY3JpcHRpb24yXycgLiAkUmFuZG9tSUQsCiAgICAgICAgfQogICAgfSwKKTsKCiRTZWxmLT5JcygKICAgICRTdWNjZXNzLAogICAgMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkiLAopOwoKbXkgJUZ1dHVyZVRhc2tVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFza1VwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgZXhlY3V0aW9uIHRpbWUiLAopOwoKJFNlbGYtPklzKAogICAgJEZ1dHVyZVRhc2tVcGRhdGVke0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VGl0bGV9LAogICAgJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgdGlja2V0IHRpdGxlIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCiRTZWxmLT5Eb25lVGVzdGluZygpOwo=</File>
        <File Location="var/packagesetup/AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6QXBwb2ludG1lbnRUb1RpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0IC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBERUxFVEUgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSAnQXBwb2ludG1lbnRUaWNrZXQnCiAgICAiOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.AppointmentCalendar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZGViOTlkNjBkYWYyMTJhZTczZWM3ZmViNzgwNzRmM2Y3YWU1NjNmOCAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgovKmdsb2JhbCBDbGlwYm9hcmQgKi8gICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlZGVjbGFyZQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudAogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBmdW5jdGlvbnMuCiAqLwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gQXBwb2ludG1lbnQgZGF5cyBjYWNoZSBhbmQgcmVhZHkgZmxhZwogICAgdmFyIEFwcG9pbnRtZW50RGF5c0NhY2hlLAogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2UsCiAgICAgICAgQUpBWENvdW50ZXIgPSAwLAogICAgICAgIEN1cnJlbnRWaWV3LAogICAgICAgIENhbGVuZGFyU291cmNlcyA9IHt9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBjb250cm9sLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBDYWxlbmRhckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJDb25maWcnKSwKICAgICAgICAgICAgUmVzb3VyY2VDb25maWcsCiAgICAgICAgICAgICRDYWxlbmRhck9iaiA9ICQoJyNjYWxlbmRhcicpLAogICAgICAgICAgICAkRGF0ZXBpY2tlck9iaiwKICAgICAgICAgICAgQ2xpcGJvYXJkSlMsCiAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudCA9IFtdOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFDYWxlbmRhckNvbmZpZykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkRGF0ZXBpY2tlck9iaiA9ICQoJzxkaXYgLz4nKQogICAgICAgICAgICAucHJvcCgnaWQnLCAnRGF0ZXBpY2tlcicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnSGlkZGVuJykKICAgICAgICAgICAgLmluc2VydEFmdGVyKCRDYWxlbmRhck9iaiksCgogICAgICAgIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUZWFtSUQnKSkgewogICAgICAgICAgICBSZXNvdXJjZUNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudFRlYW1MaXN0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0UmVzb3VyY2VzJywKICAgICAgICAgICAgICAgICAgICBUZWFtSUQ6IENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgY2FsZW5kYXIKICAgICAgICAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKHsKICAgICAgICAgICAgaGVhZGVyOiB7CiAgICAgICAgICAgICAgICBsZWZ0OiAnbW9udGgsYWdlbmRhV2VlayxhZ2VuZGFEYXkgdGltZWxpbmVNb250aCx0aW1lbGluZVdlZWssdGltZWxpbmVEYXknLAogICAgICAgICAgICAgICAgY2VudGVyOiAndGl0bGUnLAogICAgICAgICAgICAgICAgcmlnaHQ6ICdqdW1wLHRvZGF5IHByZXYsbmV4dCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3VzdG9tQnV0dG9uczogewogICAgICAgICAgICAgICAganVtcDogewogICAgICAgICAgICAgICAgICAgIHRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBTaG93RGF0ZXBpY2tlcigkQ2FsZW5kYXJPYmosICREYXRlcGlja2VyT2JqLCAkKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBDb3JlLkNvbmZpZy5HZXQoJ0RlZmF1bHRWaWV3JyksCiAgICAgICAgICAgIGFsbERheVRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwtZGF5JyksCiAgICAgICAgICAgIGlzUlRMOiBDb3JlLkNvbmZpZy5HZXQoJ0lzUlRMTGFuZ3VhZ2UnKSwKICAgICAgICAgICAgY29sdW1uRm9ybWF0OiAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgIHRpbWVGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogJ0hIOm1tJywKICAgICAgICAgICAgdGl0bGVGb3JtYXQ6ICdEIE1NTSBZWVlZJywKICAgICAgICAgICAgd2Vla051bWJlcnM6IHRydWUsCiAgICAgICAgICAgIHdlZWtOdW1iZXJUaXRsZTogJyMnLAogICAgICAgICAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdJU08nLAogICAgICAgICAgICBldmVudExpbWl0OiB0cnVlLAogICAgICAgICAgICBldmVudExpbWl0VGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ21vcmUnKSwKICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaXJzdERheTogQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpLAogICAgICAgICAgICBtb250aE5hbWVzOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSmFudWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZlYnJ1YXJ5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWFyY2gnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHJpbCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01heV9sb25nJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVuZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bHknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWd1c3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXB0ZW1iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3RvYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm92ZW1iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWNlbWJlcicpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZlYicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01heScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F1ZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NlcCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09jdCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RlYycpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3VuZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9uZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVHVlc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZG5lc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodXJzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRnJpZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2F0dXJkYXknKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3VuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9uJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVHVlJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2VkJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGh1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRnJpJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2F0JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgYnV0dG9uVGV4dDogewogICAgICAgICAgICAgICAgdG9kYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUb2RheScpLAogICAgICAgICAgICAgICAgbW9udGg6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb250aCcpLAogICAgICAgICAgICAgICAgd2VlazogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZWsnKSwKICAgICAgICAgICAgICAgIGRheTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RheScpLAogICAgICAgICAgICAgICAgdGltZWxpbmVNb250aDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RpbWVsaW5lIE1vbnRoJyksCiAgICAgICAgICAgICAgICB0aW1lbGluZVdlZWs6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBXZWVrJyksCiAgICAgICAgICAgICAgICB0aW1lbGluZURheTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RpbWVsaW5lIERheScpLAogICAgICAgICAgICAgICAganVtcDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bXAnKSwKICAgICAgICAgICAgICAgIHByZXZEYXRlcGlja2VyOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUHJldmlvdXMnKSwKICAgICAgICAgICAgICAgIG5leHREYXRlcGlja2VyOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmV4dCcpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNjaGVkdWxlckxpY2Vuc2VLZXk6ICdHUEwtTXktUHJvamVjdC1Jcy1PcGVuLVNvdXJjZScsCiAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgZm9yY2VFdmVudER1cmF0aW9uOiB0cnVlLAogICAgICAgICAgICBub3dJbmRpY2F0b3I6IHRydWUsCiAgICAgICAgICAgIHRpbWV6b25lOiAnbG9jYWwnLAogICAgICAgICAgICByZXNvdXJjZUFyZWFXaWR0aDogJzIxJScsCiAgICAgICAgICAgIHZpZXdzOiB7CiAgICAgICAgICAgICAgICBtb250aDogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnTU1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JtYXQ6ICdkZGRkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFnZW5kYURheTogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcyNDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lV2VlazogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEgnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISDptbScKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvYWRpbmc6IGZ1bmN0aW9uKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgaWYgKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpZXdSZW5kZXI6IGZ1bmN0aW9uKFZpZXcpIHsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgb24gYSB0aW1lbGluZSB2aWV3LgogICAgICAgICAgICAgICAgaWYgKFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lV2VlaycgfHwgVmlldy5uYW1lID09PSAndGltZWxpbmVEYXknKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxlbmRhciB3ZWVrIG51bWJlciB0byB0aW1lbGluZSB2aWV3IHRpdGxlcy4KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5maW5kKCcuZmMtdG9vbGJhciA+IGRpdiA+IGgyJykuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZmMtd2Vlay1udW1iZXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KFZpZXcuc3RhcnQuZm9ybWF0KCcgI1cnKSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHZpZXcgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudFZpZXcgIT09IHVuZGVmaW5lZCAmJiBDdXJyZW50VmlldyAhPT0gVmlldy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWaWV3OiBWaWV3Lm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDdXJyZW50VmlldyA9IFZpZXcubmFtZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihTdGFydCwgRW5kLCBKU0V2ZW50LCBWaWV3LCBSZXNvdXJjZSkgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IFN0YXJ0LAogICAgICAgICAgICAgICAgICAgIEVuZDogRW5kLAogICAgICAgICAgICAgICAgICAgIEpTRXZlbnQ6IEpTRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgVmlldzogVmlldywKICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZTogUmVzb3VyY2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhEYXRhKTsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ3Vuc2VsZWN0Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50Q2xpY2s6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBTdGFydDogQ2FsRXZlbnQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgRW5kOiBDYWxFdmVudC5lbmQsCiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coRGF0YSk7CiAgICAgICAgICAgICAgICBKU0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudERyb3A6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlc2l6ZTogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVuZGVyOiBmdW5jdGlvbihDYWxFdmVudCwgJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucmVjdXJyaW5nCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBhbmQgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ0ljb25zJyk7CiAgICAgICAgICAgICAgICAgICAgJEljb24gPSAkKCc8aSAvPicpLmFkZENsYXNzKCdmYScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtcmVwZWF0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWNoYXItJyArIENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKVtDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGVdLk1hcmspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBjb250YWluZXIgdG8gdGhlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZmluZCgnLmZjLWNvbnRlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAucHJlcGVuZCgkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVzaXplU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJhZ1N0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnJlc291cmNlSWRzID0gQ2FsRXZlbnQucmVzb3VyY2VJZHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdmVyOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoJ0FnZW50L0FwcG9pbnRtZW50Q2FsZW5kYXIvQXBwb2ludG1lbnRUb29sdGlwJywgewogICAgICAgICAgICAgICAgICAgICAgICAnUGx1Z2luTGlzdCc6IENvcmUuQ29uZmlnLkdldCgnUGx1Z2luTGlzdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAnQ2FsRXZlbnQnOiBDYWxFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2x0aXBUZW1wbGF0ZVJlc291cmNlJzogQ29yZS5Db25maWcuR2V0KCdUb29sdGlwVGVtcGxhdGVSZXNvdXJjZScpIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICdUaWNrZXRBcHBvaW50bWVudENvbmZpZyc6IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKQogICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb247CgogICAgICAgICAgICAgICAgaWYgKCFKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgSlNFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChKU0V2ZW50LnBhZ2VYIHx8IEpTRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSlNFdmVudC5jbGllbnRYIHx8IEpTRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICBQb3NZICs9IDEwOwoKICAgICAgICAgICAgICAgIGlmIChUb29sdGlwSFRNTC5sZW5ndGggPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJChUb29sdGlwSFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBQb3NYCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgnLkFwcG9pbnRtZW50VG9vbHRpcCcpLmZhZGVPdXQoImZhc3QiKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRBZnRlckFsbFJlbmRlcjogZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBkYXkgaW4gdGltZWxpbmVNb250aCB2aWV3IGlzIG5vdCBTYXR1cmRheSBvciBTdW5kYXksIHRoZSBmaXJzdCBkaXYuZmMtYmdldmVudCBzaG91bGQgYmUgcmVtb3ZlZC4KICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIGZyb20gZnVsbGNhbGVuZGFyIGFuZCBpdCBjYW4gYmUgc29sdmVkIGhlcmUuIFNlZSBidWcjMTQ3NjQuCiAgICAgICAgICAgICAgICBpZiAoISQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50OmVxKDApJykuaGFzQ2xhc3MoJ2ZjLXNhdCcpCiAgICAgICAgICAgICAgICAgICAgJiYgISQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50OmVxKDApJykuaGFzQ2xhc3MoJ2ZjLXN1bicpKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmZjLXRpbWVsaW5lTW9udGgtdmlldyAuZmMtYmdldmVudC1jb250YWluZXIgLmZjLWJnZXZlbnQ6ZXEoMCknKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRzOiBDb3JlLkNvbmZpZy5HZXQoJ1dvcmtpbmdIb3Vyc0NvbmZpZycpLAogICAgICAgICAgICByZXNvdXJjZXM6IFJlc291cmNlQ29uZmlnLAogICAgICAgICAgICByZXNvdXJjZUNvbHVtbnM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOYW1lJyksCiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICd0aXRsZScKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgcmVzb3VyY2VMYWJlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdSZXNvdXJjZXMnKQogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKHsKICAgICAgICAgICAgc2hvd09uOiAnYnV0dG9uJywKICAgICAgICAgICAgYnV0dG9uVGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bXAnKSwKICAgICAgICAgICAgY29uc3RyYWluSW5wdXQ6IHRydWUsCiAgICAgICAgICAgIHByZXZUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUHJldmlvdXMnKSwKICAgICAgICAgICAgbmV4dFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOZXh0JyksCiAgICAgICAgICAgIGZpcnN0RGF5OiBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JyksCiAgICAgICAgICAgIHNob3dNb250aEFmdGVyWWVhcjogMCwKICAgICAgICAgICAgbW9udGhOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWJydWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcmNoJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByaWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXlfbG9uZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bmUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWx5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVndXN0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwdGVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0b2JlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdmVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjZW1iZXInKQogICAgICAgICAgICBdLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXAnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3YnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWMnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWRuZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHVyc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaWRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdHVyZGF5JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdCcpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzTWluOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3UnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNbycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2UnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2EnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBpc1JUTDogQ29yZS5Db25maWcuR2V0KCdJc1JUTExhbmd1YWdlJyksCiAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbihEYXRlVGV4dCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcignZ290b0RhdGUnLCBuZXcgRGF0ZShEYXRlVGV4dCkpOwogICAgICAgICAgICAgICAgJCgnI0RhdGVwaWNrZXJPdmVybGF5JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAkRGF0ZXBpY2tlck9iai5oaWRlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJlZm9yZVNob3dEYXk6IGZ1bmN0aW9uKERhdGVPYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmIChBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGVja0RhdGUoRGF0ZU9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdHJ1ZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQ2hhbmdlTW9udGhZZWFyOiBmdW5jdGlvbihZZWFyLCBNb250aCkgewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJC5lYWNoKENhbGVuZGFyQ29uZmlnLCBmdW5jdGlvbiAoSW5kZXgsIENhbGVuZGFyKSB7CiAgICAgICAgICAgIHZhciBDYWxlbmRhckRhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgiI0NoYWxsZW5nZVRva2VuIikudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0QXBwb2ludG1lbnRzJywKICAgICAgICAgICAgICAgIENhbGVuZGFySUQ6IENhbGVuZGFyLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICBSZXNvdXJjZUlEOiBDb3JlLkNvbmZpZy5HZXQoJ1Jlc291cmNlSUQnKSwKICAgICAgICAgICAgICAgIFRlYW1JRDogQ29yZS5Db25maWcuR2V0KCdUZWFtSUQnKQogICAgICAgICAgICB9OwogICAgICAgICAgICBDYWxlbmRhclNvdXJjZXNbQ2FsZW5kYXIuQ2FsZW5kYXJJRF0gPSB7CiAgICAgICAgICAgICAgICBpZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgICAgIGNvbG9yOiBDYWxlbmRhci5Db2xvciwKICAgICAgICAgICAgICAgIHRleHRDb2xvcjogQ2FsZW5kYXIuVGV4dENvbG9yLAogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLAogICAgICAgICAgICAgICAgc3RhcnRQYXJhbTogJ1N0YXJ0VGltZScsCiAgICAgICAgICAgICAgICBlbmRQYXJhbTogJ0VuZFRpbWUnLAoKICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHJlbW92ZUV2ZW50U291cmNlLgogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudENvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbUlkczogQXBwb2ludG1lbnREYXRhLlRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVzOiBBcHBvaW50bWVudERhdGEuVGVhbU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogQXBwb2ludG1lbnREYXRhLlJlc291cmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiBBcHBvaW50bWVudERhdGEuUGx1Z2luRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJOYW1lOiBDYWxlbmRhci5DYWxlbmRhck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQ29sb3I6IENhbGVuZGFyLkNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb246IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLmxlbmd0aCA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGF0ZTogQXBwb2ludG1lbnREYXRhLk5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldEFwcG9pbnRtZW50VHlwZTogQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0eXBlb2YgQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlID09PSAndW5kZWZpbmVkJyA/IHRydWUgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFRpY2tldEFwcG9pbnRtZW50Q29uZmlnW0FwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZV0uTm9EcmFnICE9PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogdHlwZW9mIEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudEVuZERhdGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgVGlja2V0QXBwb2ludG1lbnRDb25maWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlXS5Ob0RyYWcgIT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbi4KICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKHsKICAgICAgICAgICAgICAgIFN0YXJ0OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICBFbmQ6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5FbmQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLkVuZCkgOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuUGx1Z2luS2V5ID8gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgICAgICBTZWFyY2g6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5TZWFyY2ggPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgIE9iamVjdElEOiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQXV0byBvcGVuIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuCiAgICAgICAgZWxzZSBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coeyBDYWxFdmVudDogeyBpZDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykgfSB9KTsKICAgICAgICB9CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpCiAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdCgpOwoKICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdCgpOwoKICAgICAgICAkKCcjVGVhbScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0NoYW5nZVRlYW1Gb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI0NhbGVuZGFycycpKTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgJChFdmVudC50cmlnZ2VyKS5oaWRlKCkKICAgICAgICAgICAgICAgIC5mYWRlSW4oKTsKICAgICAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICB9KTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ2Vycm9yJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJykpOwogICAgICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmZvY3VzKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dEYXRlcGlja2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJENhbGVuZGFyT2JqIC0gQ2FsZW5kYXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRKdW1wQnV0dG9uIC0gRGF0ZXBpY2tlciBidXR0b24gb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3cgZGF0ZSBwaWNrZXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJEp1bXBCdXR0b24pIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgpOwoKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKCdzZXREYXRlJywgQ3VycmVudERhdGUudG9EYXRlKCkpCiAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgbGVmdDogcGFyc2VJbnQoJEp1bXBCdXR0b24ub2Zmc2V0KCkubGVmdCAtICREYXRlcGlja2VyT2JqLm91dGVyV2lkdGgoKSArICRKdW1wQnV0dG9uLm91dGVyV2lkdGgoKSwgMTApLAogICAgICAgICAgICAgICAgdG9wOiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS50b3AgLSAkRGF0ZXBpY2tlck9iai5vdXRlckhlaWdodCgpICsgJEp1bXBCdXR0b24ub3V0ZXJIZWlnaHQoKSwgMTApCiAgICAgICAgICAgIH0pLmZhZGVJbignZmFzdCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrRGF0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge0RhdGVPYmplY3R9IERhdGVPYmplY3QgLSBBIEpTIGRhdGUgb2JqZWN0IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge0FycmF5fSBGaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0cnVlLCBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIENTUwogICAgICogICAgICAgICAgICAgICAgICBjbGFzcywgdGhpcmQgZWxlbWVudCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgZGF0ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBDaGVjayBpZiBkYXRlIGhhcyBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tEYXRlKERhdGVPYmplY3QpIHsKICAgICAgICB2YXIgRGF0ZU1vbWVudCA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChEYXRlT2JqZWN0KSwKICAgICAgICAgICAgRGF5QXBwb2ludG1lbnRzID0gQXBwb2ludG1lbnREYXlzQ2FjaGVbRGF0ZU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKV0sCiAgICAgICAgICAgIERheUNsYXNzID0gRGF5QXBwb2ludG1lbnRzID8gJ0hpZ2hsaWdodCcgOiAnJywKICAgICAgICAgICAgRGF5RGVzY3JpcHRpb24gPSBEYXlBcHBvaW50bWVudHMgPyBEYXlBcHBvaW50bWVudHMudG9TdHJpbmcoKSA6ICcnOwoKICAgICAgICByZXR1cm4gW3RydWUsIERheUNsYXNzLCBEYXlEZXNjcmlwdGlvbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQXBwb2ludG1lbnREYXlzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBZZWFyIC0gU2VsZWN0ZWQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gTW9udGggLSBTZWxlY3RlZCBtb250aCAoMS0xMikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2FjaGVzIHRoZSBsaXN0IG9mIGFwcG9pbnRtZW50IGRheXMgZm9yIGxhdGVyIHVzZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCkgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdBcHBvaW50bWVudERheXMnLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICQoJy5Nb2RhbC5EaWFsb2cuUGVyc2lzdGVudCcpLnJlbW92ZUNsYXNzKCdQZXJzaXN0ZW50Jyk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2FkaW5nLi4uJykgKyAnIj48L3NwYW4+PC9kaXY+JywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvYWRpbmcuLi4nKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBPcGVuRWRpdERpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5TdGFydCAtIE1vbWVudCBvYmplY3Qgd2l0aCBzdGFydCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLkVuZCAtIE1vbWVudCBvYmplY3Qgd2l0aCBlbmQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgLSBDYWxlbmRhciByZXNvdXJjZSBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGFwcG9pbnRtZW50IGRpYWxvZyBhZnRlciBzZWxlY3RpbmcgYSB0aW1lIHBlcmlvZCBvciBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2cgPSBmdW5jdGlvbiAoQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246ICdFZGl0TWFzaycsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0WWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydE1vbnRoOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgU3RhcnREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuZGF0ZSgpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgRW5kWWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpIDogbnVsbCwKICAgICAgICAgICAgRW5kTW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgRW5kRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgQWxsRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gKEFwcG9pbnRtZW50RGF0YS5FbmQuaGFzVGltZSgpID8gJzAnIDogJzEnKSA6IG51bGwsCiAgICAgICAgICAgIFRlYW1JRDogQXBwb2ludG1lbnREYXRhLlJlc291cmNlID8gWyBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UuVGVhbUlEIF0gOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5pZCBdIDogbnVsbCwKICAgICAgICAgICAgUGx1Z2luS2V5OiBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5ID8gQXBwb2ludG1lbnREYXRhLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgIFNlYXJjaDogQXBwb2ludG1lbnREYXRhLlNlYXJjaCA/IEFwcG9pbnRtZW50RGF0YS5TZWFyY2ggOiBudWxsLAogICAgICAgICAgICBPYmplY3RJRDogQXBwb2ludG1lbnREYXRhLk9iamVjdElEID8gQXBwb2ludG1lbnREYXRhLk9iamVjdElEIDogbnVsbAogICAgICAgIH07CgogICAgICAgIC8vIE1ha2UgZW5kIHRpbWUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzIGluY2x1c2l2ZQogICAgICAgIGlmIChEYXRhLkFsbERheSAmJiBEYXRhLkFsbERheSA9PT0gJzEnKSB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5FbmQuc3VidHJhY3QoMSwgJ2RheScpOwogICAgICAgICAgICBEYXRhLkVuZFllYXIgPSBBcHBvaW50bWVudERhdGEuRW5kLnllYXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNb250aCA9IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDE7CiAgICAgICAgICAgIERhdGEuRW5kRGF5ID0gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCk7CiAgICAgICAgICAgIERhdGEuRW5kSG91ciA9IEFwcG9pbnRtZW50RGF0YS5FbmQuaG91cigpOwogICAgICAgICAgICBEYXRhLkVuZE1pbnV0ZSA9IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBFZGl0RGlhbG9nKCkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgLy8gQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50JyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUw6IEhUTUwsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzEwcHgnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25zOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93QXV0b0dyb3c6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQ6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdodG1sJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAmJiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAvLyBDbG9zZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogZmFsc2UsCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVkaXREaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXREaWFsb2coZmFsc2UpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdXN0IHRoaXMgb2NjdXJyZW5jZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogRWRpdERpYWxvZwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJykKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVkaXREaWFsb2coKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVXBkYXRlQXBwb2ludG1lbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgYXBwb2ludG1lbnQgd2l0aCBzdXBwbGllZCBkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVBcHBvaW50bWVudChBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0VkaXRBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCwKICAgICAgICAgICAgU3RhcnRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQueWVhcigpLAogICAgICAgICAgICBTdGFydE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubW9udGgoKSArIDEsCiAgICAgICAgICAgIFN0YXJ0RGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGF0ZSgpLAogICAgICAgICAgICBTdGFydEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5ob3VyKCksCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubWludXRlKCksCiAgICAgICAgICAgIEVuZFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpLAogICAgICAgICAgICBFbmRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMSwKICAgICAgICAgICAgRW5kRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKSwKICAgICAgICAgICAgRW5kSG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCksCiAgICAgICAgICAgIEVuZE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKSwKICAgICAgICAgICAgQWxsRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJywKICAgICAgICAgICAgUmVjdXJyaW5nOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVjdXJyaW5nID8gJzEnIDogJzAnLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA6CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCA/IFsgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgXSA6IHVuZGVmaW5lZAogICAgICAgIH07CgogICAgICAgIC8vIEFzc2lnbmVkIHJlc291cmNlIGRpZG4ndCBjaGFuZ2UKICAgICAgICBpZiAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkCiAgICAgICAgICAgICYmIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICYmICQuaW5BcnJheSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkLAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgKSAhPT0gLTEKICAgICAgICApIHsKICAgICAgICAgICAgRGF0YS5SZXNvdXJjZUlEID0gQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBVcGRhdGUoKSB7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVmZXRjaEV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5SZXZlcnRGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGlhbG9nCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUnKS5yZW1vdmVDbGFzcygnUGVyc2lzdGVudCcpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGVhdGluZyBldmVudAogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlJlY3VycmluZyA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlRGVsdGEgPSBBcHBvaW50bWVudERhdGEuRGVsdGEuYXNTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnQm90aCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnU3RhcnRUaW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gRGF0YS5VcGRhdGVEZWx0YSAqIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnRW5kVGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1c3QgdGhpcyBvY2N1cnJlbmNlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY2FsZW5kYXIgY2hlY2tib3ggYmVoYXZpb3IgYW5kIGxvYWRzIG11bHRpcGxlIGNhbGVuZGFycyB0byB0aGUKICAgICAqICAgICAgRnVsbENhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU3dpdGNoSW5pdCgkQ2FsZW5kYXJTd2l0Y2gpIHsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmFibGVkIHNvdXJjZXMKICAgICAgICBpZiAoJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ2FkZEV2ZW50U291cmNlJywgQ2FsZW5kYXJTb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgICRDYWxlbmRhclN3aXRjaC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXQ6Y2hlY2tlZCcpLmxlbmd0aCA+IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJMaW1pdCcpKSB7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycpLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyU3dpdGNoU291cmNlKCRDYWxlbmRhclN3aXRjaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaFNvdXJjZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgZW5hYmxlcy9kaXNhYmxlcyBjYWxlbmRhciBzb3VyY2UgaW4gRnVsbENhbGVuZGFyIGNvbnRyb2wgYW5kIHN0b3JlcwogICAgICogICAgICBzZWxlY3Rpb24gdG8gdXNlciBwcmVmZXJlbmNlcy4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hTb3VyY2UoJENhbGVuZGFyU3dpdGNoKSB7CiAgICAgICAgdmFyIENhbGVuZGFyU2VsZWN0aW9uID0gW107CgogICAgICAgIC8vIFNob3cvaGlkZSB0aGUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIENhbGVuZGFyU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVtb3ZlRXZlbnRTb3VyY2UnLCAkQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgYWxsIGNoZWNrZWQgY2FsZW5kYXJzCiAgICAgICAgJC5lYWNoKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJyksIGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbi5wdXNoKCQoRWxlbWVudCkuZGF0YSgnaWQnKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpbiB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIENhbGVuZGFyU2VsZWN0aW9uOiBKU09OLnN0cmluZ2lmeShDYWxlbmRhclNlbGVjdGlvbikKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBMb2NhdGlvbkxpbmtJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uT2JqIC0gbG9jYXRpb24gZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uTGlua3MgLSBsb2NhdGlvbiBsaW5rcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBsb2NhdGlvbiBsaW5rIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0ID0gZnVuY3Rpb24gKCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpIHsKICAgICAgICB2YXIgTG9jYXRpb25WYWx1ZSA9ICRMb2NhdGlvbk9iai52YWwoKSB8fCAkTG9jYXRpb25PYmoudGV4dCgpOwoKICAgICAgICAkTG9jYXRpb25MaW5rcy5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICB2YXIgJExpbmtPYmogPSAkKEVsZW1lbnQpLAogICAgICAgICAgICAgICAgQmFzZVVSTCAgPSAkTGlua09iai5kYXRhKCdiYXNlVXJsJyk7CgogICAgICAgICAgICAvLyBVcGRhdGUgbGluayBVUkwgYW5kIHNob3cgaXQgaWYgbG9jYXRpb24gaXMgc2V0CiAgICAgICAgICAgIGlmIChMb2NhdGlvblZhbHVlLmxlbmd0aCA+IDAgJiYgTG9jYXRpb25WYWx1ZSAhPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5hdHRyKCdocmVmJywgQmFzZVVSTCArIGVuY29kZVVSSUNvbXBvbmVudChMb2NhdGlvblZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAuZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaGlkZSB0aGUgbGluawogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMaW5rT2JqLmZhZGVPdXQoJ2Zhc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBSZWdpc3RlciBrZXkgdXAgZXZlbnQgaGFuZGxlcgogICAgICAgICRMb2NhdGlvbk9iai5vZmYoJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbigna2V5dXAuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0KCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgQWxsRGF5SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRBbGxEYXkgLSBhbGwgZGF5IGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIGRheSBjaGVja2JveCBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCA9IGZ1bmN0aW9uICgkQWxsRGF5KSB7CiAgICAgICAgaWYgKCQoJyNTdGFydE1vbnRoOmRpc2FibGVkJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIHN0YXJ0IGhvdXIvbWludXRlIGFuZCBjb21wbGV0ZSBlbmQgdGltZQogICAgICAgIGlmICgkQWxsRGF5LnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykudmFsKCcwJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpCiAgICAgICAgICAgICAgICAucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQWxsRGF5Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkQWxsRGF5KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFJlY3VycmluZ0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVjdXJyaW5nIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmluZyAtIGZpZWxkIHdpdGggcmVjdXJyaW5nIGZsYWcuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVHlwZSAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgdHlwZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUgLSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC0gQ3VzdG9tIHR5cGUgZHJvcC1kb3duCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0IC0gaW50ZXJ2YWwgdGV4dAogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAtIGNvbnRhaW5zIHdlZWsgZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLSBjb250YWlucyBtb250aCBkYXlzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC0gY29udGFpbnMgbW9udGhzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYgLSBsYXllciB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0IC0gZHJvcCBkb3duIHdpdGggcmVjdXJyZW5jZSBsaW1pdCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSBjb3VudCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSB1bnRpbCBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkgLSBzZWxlY3QgZmllbGQgZm9yIHJlY2N1cmVuY2UgdW50aWwgZGF5LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJlY3VycmVuY2UgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewoKICAgICAgICBmdW5jdGlvbiBSZWNJbml0KEZpZWxkcykgewogICAgICAgICAgICB2YXIgRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gW10sCiAgICAgICAgICAgICAgICBNb250aHMgPSBbXSwKICAgICAgICAgICAgICAgIEluZGV4OwoKICAgICAgICAgICAgaWYgKCQoJ2lucHV0I0RheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIERheXMgPSAkKCdpbnB1dCNEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aERheXMgPSAkKCdpbnB1dCNNb250aERheXMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNNb250aERheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIE1vbnRocyA9ICQoJ2lucHV0I01vbnRocycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9IiArIERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhEYXlzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9IiArIE1vbnRoRGF5c1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IE1vbnRocy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChNb250aHNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aHNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlVHlwZS52YWwoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gJ0N1c3RvbScpIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tRGFpbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0RGF5JykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21XZWVrbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFdlZWsnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbU1vbnRobHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dE1vbnRoJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21ZZWFybHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFllYXInKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwoKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdik7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LnJlbW92ZUNsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0KEZpZWxkcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFJlY0luaXQoRmllbGRzKTsKICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTm90aWZpY2F0aW9uSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byByZW1pbmRlciBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb24gLSBkcm9wIGRvd24gd2l0aCBzeXN0ZW0gbm90aWZpY2F0aW9uIHNlbGVjdGlvbi4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiAtIGN1c3RvbSBzZWxlY3Rpb24gb2Ygc3lzdGVtIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIHJlbWluZGVyIHNlY3Rpb24gYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQgPSBmdW5jdGlvbiAoRmllbGRzKSB7CiAgICAgICAgdmFyIE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiA9IEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LmF0dHIoJ2lkJyk7CgogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvblRlbXBsYXRlLnZhbCgpICE9PSAnQ3VzdG9tJykgewoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgY3VzdG9tIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gY3VzdG9tIGZpZWxkIGlzIG5lZWRlZAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5zaG93KCk7CgogICAgICAgICAgICAvLyBpbml0aWFsaXplIG1vZGVybiBmaWVsZHMgb24gY3VzdG9tIHNlbGVjdGlvbgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXRTZWxlY3QoJCgnc2VsZWN0Lk1vZGVybml6ZScpKTsKICAgICAgICB9CgogICAgICAgIC8vIGRpc2FibGUgZW5hYmxlIHRoZSBkaWZmZXJlbnQgY3VzdG9tIGZpZWxkcwogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcpKSB7CgogICAgICAgICAgICAvLyBlbmFibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGlucHV0CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIElucHV0RmllbGRzIGJ1ZyBpbiB0aGUgZnJhbWV3b3JrIChkaXNhYmxlZCBhdHRyaWJ1dGUgbm90IGNoZWNrZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24pCiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5EZWFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2KSk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKICAgIH0KCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIC8qKgogICAgICogQG5hbWUgVGlja2V0SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byB0aWNrZXQgY3JlYXRpb24gZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kVGlja2V0IC0gZHJvcCBkb3duIHdpdGggc3lzdGVtIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRUaWNrZXRDdXN0b21TdHJpbmdEaXYgLSBjdXN0b20gc2VsZWN0aW9uIG9mIHN5c3RlbSB0aWNrZXQgZGF0ZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSB0aWNrZXQgY3JlYXRpb24gc2VjdGlvbiBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGlja2V0SW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0VGVtcGxhdGUudmFsKCkgPT09ICcwJykgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5oaWRlKCk7CgogICAgICAgICAgICAvLyBSZW1vdmUgbWFuZGF0b3J5IGFuZCB2YWxpZGF0ZSBjbGFzc2VzCiAgICAgICAgICAgICQoJy5UaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiB+IGRpdiA+IC5WYWxpZGF0ZV9SZXF1aXJlZCcpLmFkZENsYXNzKCdWYWxpZGF0ZV9JZl9BY3RpdmUnKS5yZW1vdmVDbGFzcygnVmFsaWRhdGVfUmVxdWlyZWQnKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLnNob3coKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5zaG93KCk7CgogICAgICAgICAgICBpZiAoRmllbGRzLiRUaWNrZXRUZW1wbGF0ZS52YWwoKSAhPT0gJ0N1c3RvbScpIHsKCiAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBjdXN0b20gZmllbGRzCiAgICAgICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkIG1hbmRhdG9yeSBhbmQgdmFsaWRhdGUgY2xhc3NlcwogICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYgPiAuVmFsaWRhdGVfSWZfQWN0aXZlJykuYWRkQ2xhc3MoJ1ZhbGlkYXRlX1JlcXVpcmVkJykucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRlX0lmX0FjdGl2ZScpOwoKICAgICAgICAgICAgLy8gQmluZCBldmVudCB0byBjdXN0b21lciByYWRpbyBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJhZGlvJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5wcm9wKCdjaGVja2VkJykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgQ3VzdG9tZXJLZXkgPSAkKCcjQ3VzdG9tZXJLZXlfJyArJCh0aGlzKS52YWwoKSkudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLlJlbG9hZEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAvLyBCaW5kIGV2ZW50IHRvIGN1c3RvbWVyIHJlbW92ZSBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJlbW92ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVtb3ZlQ3VzdG9tZXJUaWNrZXQoJCh0aGlzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXN0b21lciB1c2VyIHNlYXJjaCBmaWVsZAogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlLkluaXQoKTsKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtb2Rlcm4gZmllbGRzIG9uIGN1c3RvbSBzZWxlY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0U2VsZWN0KCQoJ3NlbGVjdC5Nb2Rlcm5pemUnKSk7CgogICAgICAgICAgICAvLyBpbml0IHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykucHJvcCgnY2hlY2tlZCcpKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IEN1c3RvbWVyS2V5ID0gJCgnI0N1c3RvbWVyS2V5XycgKyQodGhpcykudmFsKCkpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZWxvYWRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLy8gZGlzYWJsZSBlbmFibGUgdGhlIGRpZmZlcmVudCBjdXN0b20gZmllbGRzCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJykpIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAvLyBlbmFibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgaW5wdXQKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICBGaWVsZHMuJFRpY2tldFRlbXBsYXRlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBCaW5kIGZvcm0gdXBkYXRlIGV2ZW50IHRvIGZpZWxkcwogICAgICAgIHZhciBBSkFYVXBkYXRlRmllbGRzID0gWydUeXBlSUQnLCAnRGVzdCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCddLAogICAgICAgICAgICBNb2RpZmllZEZpZWxkczsKICAgICAgICAkLmVhY2goQUpBWFVwZGF0ZUZpZWxkcywgZnVuY3Rpb24oSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzID0gQ29yZS5EYXRhLkNvcHlPYmplY3QoQUpBWFVwZGF0ZUZpZWxkcykuY29uY2F0KENvcmUuQ29uZmlnLkdldCgnRHluYW1pY0ZpZWxkTmFtZXMnKSk7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzLnNwbGljZShJbmRleCwgMSk7CgogICAgICAgICAgICBGaWVsZFVwZGF0ZShWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEZpZWxkVXBkYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRQaG9uZS5Jbml0CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBWYWx1ZSAtIEZpZWxkSUQKICAgICAqIEBwYXJhbSB7QXJyYXl9IE1vZGlmaWVkRmllbGRzIC0gRmllbGRzCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ3JlYXRlIG9uIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZpZWxkVXBkYXRlIChWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpIHsKICAgICAgICAkKCcjJyArIFZhbHVlKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLCAnQUpBWFVwZGF0ZScsIFZhbHVlLCBNb2RpZmllZEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgLyoqCiAgICAgKiBAbmFtZSBUZWFtSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgdGVhbXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgcmVzb3VyY2VzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHRlYW0uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHJlc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0ZWFtIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGVhbUluaXQgPSBmdW5jdGlvbiAoJFRlYW1JRE9iaiwgJFJlc291cmNlSURPYmosICRUZWFtVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqKSB7CiAgICAgICAgJFRlYW1JRE9iai5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1RlYW1Vc2VyTGlzdCcsCiAgICAgICAgICAgICAgICBUZWFtSUQ6ICRUZWFtSURPYmoudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIHRydWUpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlbGVjdGVkSUQgPSAkUmVzb3VyY2VJRE9iai52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuVGVhbVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXNwb25zZS5UZWFtVXNlckxpc3QsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOZXdPcHRpb24gPSBuZXcgT3B0aW9uKFZhbHVlLCBJbmRleCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG9wdGlvbiB0ZXh0LCBiZWNhdXNlIG9mIHdyb25nIGh0bWwgcXVvdGluZyBvZiB0ZXh0IGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGhpcyBpcyBuZWVkZWQgZm9yIElFLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5pbm5lckhUTUwgPSBDb3JlLkFwcC5Fc2NhcGVIVE1MKFZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNlbGVjdGVkSUQgJiYgU2VsZWN0ZWRJRC5pbmRleE9mKEluZGV4KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5hcHBlbmQoTmV3T3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSByZWRyYXcgZXZlbnQgZm9yIElucHV0RmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gQ29sbGFwc2VWYWx1ZXMoJFZhbHVlT2JqLCBWYWx1ZXMpIHsKICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJycpOwogICAgICAgICAgICAkLmVhY2goVmFsdWVzLCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgQ291bnQgPSBWYWx1ZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9ICQoJy5EaWFsb2cnKS5jc3MoJ3otaW5kZXgnKTsKCiAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJFZhbHVlT2JqLmh0bWwoKSArIFZhbHVlICsgJzxicj4nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVzLnNwbGljZSgtQ291bnQsIDIpOwogICAgICAgICAgICAgICAgICAgICQoJzxhIC8+JykuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdEaWFsb2dUb29sdGlwTGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCcrJXMgbW9yZScsIENvdW50LTIpKQogICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJFRvb2x0aXBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEhUTUwgPSAnPHA+JyArIFZhbHVlcy5qb2luKCc8YnI+JykgKyAnPC9wPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlTGVmdCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZVRvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBleGlzdGluZyB0b29sdGlwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZ1Rvb2x0aXAnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRXZlbnQucGFnZVggfHwgRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEV2ZW50LnBhZ2VZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFdmVudC5jbGllbnRYIHx8IEV2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZICs9IDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUb29sdGlwSW5kZXggIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEluZGV4ID0gcGFyc2VJbnQoVG9vbHRpcEluZGV4LCAxMCkgKyA1MDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9IDQwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRvb2x0aXAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdBcHBvaW50bWVudFRvb2x0aXAgRGlhbG9nVG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKFRvb2x0aXBIVE1MKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ3otaW5kZXgnLCBUb29sdGlwSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnYXV0bycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCdib2R5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFlQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZVRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFhQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZUxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdG9vbHRpcCBvbiBhbnkgb3V0c2lkZSBjbGljawogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkNsb3NlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuRGlhbG9nVG9vbHRpcExpbmsnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJFZhbHVlT2JqKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29sbGFwc2UgcmVhZCBvbmx5IHZhbHVlcwogICAgICAgIGlmICgkVGVhbVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkVGVhbVZhbHVlT2JqLCAkVGVhbVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXNvdXJjZVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkUmVzb3VyY2VWYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNhbGVuZGFyIHNldHRpbmdzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclNldHRpbmdzSW5pdCgpIHsKICAgICAgICB2YXIgJENhbGVuZGFyU2V0dGluZ3NPYmogPSAkKCcjQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbicpLAogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTDsKCiAgICAgICAgaWYgKCEkQ2FsZW5kYXJTZXR0aW5nc09iai5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0hUTUwgPSBDb3JlLlRlbXBsYXRlLlJlbmRlcignQWdlbnQvQXBwb2ludG1lbnRDYWxlbmRhci9DYWxlbmRhclNldHRpbmdzRGlhbG9nJywgewogICAgICAgICAgICAnU2hvd25BcHBvaW50bWVudHNTdHJnJzogQ29yZS5Db25maWcuR2V0KCdTaG93bkFwcG9pbnRtZW50c1N0cmcnKQogICAgICAgIH0pOwoKICAgICAgICAvLyBDYWxlbmRhciBzZXR0aW5ncyBidXR0b24KICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkU2hvd25BcHBvaW50bWVudHMgPSAkKCcjU2hvd25BcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93bkFwcG9pbnRtZW50czogJFNob3duQXBwb2ludG1lbnRzLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRBcHBvaW50bWVudCcgKyAoQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclNldHRpbmdzU2hvdycpKSB7CiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLnRyaWdnZXIoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzb3VyY2VTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZXNvdXJjZSBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gUmVzb3VyY2VTZXR0aW5nc0luaXQoKSB7CiAgICAgICAgdmFyICRSZXNvdXJjZVNldHRpbmdzT2JqID0gJCgnI1Jlc291cmNlU2V0dGluZ3NCdXR0b24nKSwKICAgICAgICAgICAgUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0hUTUw7CgogICAgICAgIGlmICghJFJlc291cmNlU2V0dGluZ3NPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dIVE1MID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoJ0FnZW50L0FwcG9pbnRtZW50Q2FsZW5kYXIvUmVzb3VyY2VTZXR0aW5nc0RpYWxvZycsIENvcmUuQ29uZmlnLkdldCgnU2hvd25SZXNvdXJjZVNldHRpbmdzJykpOwoKICAgICAgICAvLyBSZXNvdXJjZSBzZXR0aW5ncyBidXR0b24KICAgICAgICAkUmVzb3VyY2VTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhSZXNvdXJjZVNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkTGlzdENvbnRhaW5lciA9ICQoJy5BbGxvY2F0aW9uTGlzdENvbnRhaW5lcicpLmZpbmQoJy5Bc3NpZ25lZEZpZWxkcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duUmVzb3VyY2VzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJExpc3RDb250YWluZXIpICYmICRMaXN0Q29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCgkTGlzdENvbnRhaW5lci5maW5kKCdsaScpLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtZmllbGRuYW1lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5TaG93blJlc291cmNlcyA9IEpTT04uc3RyaW5naWZ5KFNob3duUmVzb3VyY2VzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLlNldEFsbG9jYXRpb25MaXN0KCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBSZXNvdXJjZVNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFkZHMgcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzIGJ1dHRvbiAodHJhc2ggY2FuKSB0byB2aWV3IGFuZCBpbml0aWFsaXplcyBpdHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCkgewogICAgICAgIHZhciAkUmVzdG9yZVNldHRpbmdzT2JqOwoKICAgICAgICAvLyBTa2lwIGlmIGJ1dHRvbiBpcyBub3QgbmVlZGVkIG9yIHdlIGFscmVhZHkgaGF2ZSBvbmUuCiAgICAgICAgaWYgKAogICAgICAgICAgICAhQ29yZS5Db25maWcuR2V0KCdSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykKICAgICAgICAgICAgfHwgJCgnI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKS5sZW5ndGggPiAwCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSB0aGUgYnV0dG9uLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmogPSAkKCc8YSAvPicpLmF0dHIoJ2lkJywgJ1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycpKQogICAgICAgICAgICAuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLXRyYXNoJykpOwoKICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGNvbHVtbiBoZWFkZXIuCiAgICAgICAgJCgndHIuZmMtc3VwZXIgKyB0ciAuZmMtY2VsbC1jb250ZW50JykuYXBwZW5kKCRSZXN0b3JlU2V0dGluZ3NPYmopOwoKICAgICAgICAvLyBSZWdpc3RlciBjbGljayBoYW5kbGVyLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzOiAnU2hvd25SZXNvdXJjZXMnLAogICAgICAgICAgICAgICAgICAgIFRlYW1JRDogJCgnI1RlYW0nKS52YWwoKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBUb2dnbGVBSkFYTG9hZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIE9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVwZGF0ZWQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gU2hvdyAtIFNob3cgb3IgaGlkZSB0aGUgQUpBWCBsb2FkZXIgaW1hZ2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhbmQgaGlkZXMgYW4gYWpheCBsb2FkZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgd2hpY2ggaXMgdXBkYXRlcyB2aWEgYWpheC4KICAgICAqLwogICAgZnVuY3Rpb24gVG9nZ2xlQUpBWExvYWRlcigkRWxlbWVudCwgU2hvdykgewogICAgICAgIHZhciAkTG9hZGVyID0gJCgnI0FKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSksCiAgICAgICAgICAgIExvYWRlckhUTUwgPSAnPHNwYW4gaWQ9IkFKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICciIGNsYXNzPSJBSkFYTG9hZGVyIj48L3NwYW4+JzsKCiAgICAgICAgLy8gRWxlbWVudCBub3QgcHJlc2VudAogICAgICAgIGlmICghJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgbG9hZGVyCiAgICAgICAgaWYgKFNob3cpIHsKICAgICAgICAgICAgaWYgKCEkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoTG9hZGVySFRNTCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJExvYWRlci5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQbHVnaW5Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFBsdWdpbkZpZWxkcyAtIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBwbHVnaW4gc2VhcmNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcGx1Z2luIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCA9IGZ1bmN0aW9uICgkUGx1Z2luRmllbGRzKSB7CgogICAgICAgIGZ1bmN0aW9uIEluaXRSZW1vdmVCdXR0b25zKCkgewogICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJykub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJFJlbW92ZU9iaiA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJFJlbW92ZU9iai5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICAgICBMaW5rSUQgPSAkUmVtb3ZlT2JqLmRhdGEoJ2xpbmtJZCcpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgJFBhcmVudCA9ICRSZW1vdmVPYmoucGFyZW50KCk7CgogICAgICAgICAgICAgICAgUGx1Z2luRGF0YS5zcGxpY2UoUGx1Z2luRGF0YS5pbmRleE9mKExpbmtJRCksIDEpOwogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICAgICAkUGFyZW50LnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBMaW5rSUQsIExpbmtOYW1lKSB7CiAgICAgICAgICAgIHZhciAkUGx1Z2luQ29udGFpbmVyT2JqID0gJCgnI1BsdWdpbkNvbnRhaW5lcl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgJEV4aXN0aW5nTGlua3MgPSAkUGx1Z2luQ29udGFpbmVyT2JqLmZpbmQoJy5MaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKSwKICAgICAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqID0gJCgnPGRpdiAvPicpLAogICAgICAgICAgICAgICAgJFVSTE9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgIExpbmtVUkwgPSBQbHVnaW5VUkwucmVwbGFjZSgnJXMnLCBMaW5rSUQpOwoKICAgICAgICAgICAgaWYgKCRFeGlzdGluZ0xpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGx1Z2luRGF0YS5wdXNoKExpbmtJRCk7CiAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hZGRDbGFzcygnTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSk7CgogICAgICAgICAgICAkVVJMT2JqLmF0dHIoJ2hyZWYnLCBMaW5rVVJMKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoTGlua05hbWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZU9iai5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdSZW1vdmVCdXR0b24nKQogICAgICAgICAgICAgICAgLmRhdGEoJ3BsdWdpbktleScsIFBsdWdpbktleSkKICAgICAgICAgICAgICAgIC5kYXRhKCdsaW5rSWQnLCBMaW5rSUQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBSkFYTnVtYmVyID0gKytBSkFYQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiAyMAogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAnQXV0b0NvbXBsZXRlWEhSJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBmcm9tIHRoZSBsYXRlc3QgYWpheCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFKQVhDb3VudGVyICE9PSBDdXJyZW50QUpBWE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIHRoaXMuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJykudHJpZ2dlcignc2VsZWN0LkF1dG9jb21wbGV0ZScpOwogICAgICAgICAgICAgICAgQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgVUkuaXRlbS5rZXksIFVJLml0ZW0ubGFiZWwpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwgUGx1Z2luS2V5KTsKICAgICAgICB9KTsKCiAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEVkaXRBcHBvaW50bWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IERhdGEgLSBIYXNoIHdpdGggY2FsbCBhbmQgYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWN0aW9uIC0gRWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3ViYWN0aW9uIC0gRWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuVGl0bGUgLSBBcHBvaW50bWVudCB0aXRsZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5EZXNjcmlwdGlvbiAtIEFwcG9pbnRtZW50IGRlc2NyaXB0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkxvY2F0aW9uIC0gQXBwb2ludG1lbnQgbG9jYXRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRZZWFyIC0gQXBwb2ludG1lbnQgc3RhcnQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1vbnRoIC0gQXBwb2ludG1lbnQgc3RhcnQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnREYXkgLSBBcHBvaW50bWVudCBzdGFydCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRIb3VyIC0gQXBwb2ludG1lbnQgc3RhcnQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1pbnV0ZSAtIEFwcG9pbnRtZW50IHN0YXJ0IG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRZZWFyIC0gQXBwb2ludG1lbnQgZW5kIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTW9udGggLSBBcHBvaW50bWVudCBlbmQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kRGF5IC0gQXBwb2ludG1lbnQgZW5kIGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRIb3VyIC0gQXBwb2ludG1lbnQgZW5kIGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTWludXRlIC0gQXBwb2ludG1lbnQgZW5kIG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BbGxEYXkgLSBJcyBhcHBvaW50bWVudCBhbiBhbGwtZGF5IGFwcG9pbnRtZW50ICgwfDEpPwogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHN1Ym1pdHMgYW4gZWRpdCBhcHBvaW50bWVudCBjYWxsIHRvIHRoZSBiYWNrZW5kIGFuZCByZWZyZXNoZXMgdGhlIHZpZXcuCiAgICAgICovCiAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQgPSBmdW5jdGlvbiAoRGF0YSkgewogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICAkKCcuT3ZlcnZpZXdDb250cm9sJykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBBZ2VudEFwcG9pbnRtZW50QWdlbnRPdmVydmlldyBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Jyk7CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPSAkTWFzdGVyQWN0aW9uTGluay5kYXRhKCdhcHBvaW50bWVudElkJyk7CgogICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coewogICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICBpZDogQXBwb2ludG1lbnRJRAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGZ1bmN0aW9uYWxpdGllcyBmb3IgQWdlbnRBcHBvaW50bWVudEVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuSW5pdCgpOwogICAgICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CiAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkKCcjQWxsRGF5JykpOwogICAgICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQoewogICAgICAgICAgICAkUmVjdXJyaW5nOiAkKCcjUmVjdXJyaW5nJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZTogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdjogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXREaXY6ICQoJyNSZWN1cnJlbmNlTGltaXREaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdDogJCgnI1JlY3VycmVuY2VMaW1pdCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxEYXk6ICQoJyNSZWN1cnJlbmNlVW50aWxEYXknKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDb3VudERpdjogJCgnI1JlY3VycmVuY2VDb3VudERpdicpCiAgICAgICAgfSk7CiAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAgICAgICAgICROb3RpZmljYXRpb25UZW1wbGF0ZTogJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXY6ICQoJyNOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCcpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXk6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheScpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKICAgICAgICB9KTsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIFRhcmdldE5TLlRpY2tldEluaXQoewogICAgICAgICAgICAkVGlja2V0VGVtcGxhdGU6ICQoJyNUaWNrZXRUZW1wbGF0ZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tU3RyaW5nRGl2OiAkKCcjVGlja2V0Q3VzdG9tU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21DcmVhdGlvbkRpdjogJCgnI1RpY2tldEN1c3RvbUNyZWF0aW9uRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lOiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lRGF5OiAkKCcjVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXknKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lTW9udGg6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoJyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21EYXRlVGltZVllYXI6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZVllYXInKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lSG91cjogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSG91cicpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGU6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1pbnV0ZScpCiAgICAgICAgfSk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBUYXJnZXROUy5UZWFtSW5pdCgkKCcjVGVhbUlEJyksICQoJyNSZXNvdXJjZUlEJyksICQoJ2xhYmVsW2Zvcj0iVGVhbUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJyksICQoJ2xhYmVsW2Zvcj0iUmVzb3VyY2VJRCJdICsgZGl2LkZpZWxkIHAuUmVhZE9ubHlWYWx1ZScpKTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnKSA+IDEpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCgkKCcuUGx1Z2luRmllbGQnKSwgJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCkpOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJyksIGZ1bmN0aW9uIChGb3JtKSB7CiAgICAgICAgICAgIHZhciBEYXRhID0gbmV3IE9iamVjdCgpLAogICAgICAgICAgICAgICAgRGF5cyA9IG5ldyBBcnJheSgpLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgICAgICAgICBNb250aHMgPSBuZXcgQXJyYXkoKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBkYXlzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCJpbnB1dCNEYXlzIikudmFsKERheXMuam9pbigpKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBtb250aCBkYXlzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgTW9udGhEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCJpbnB1dCNNb250aERheXMiKS52YWwoTW9udGhEYXlzLmpvaW4oKSk7CgogICAgICAgICAgICAvLyBzZXJpYWxpemUgbW9udGhzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBNb250aHMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I01vbnRocyIpLnZhbChNb250aHMuam9pbigpKTsKCiAgICAgICAgICAgICQoRm9ybSkuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JykuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChFbGVtZW50LnR5cGUgPT0gJ2NoZWNrYm94JykgewogICAgICAgICAgICAgICAgICAgIERhdGFbRWxlbWVudC5pZF0gPSAkKEVsZW1lbnQpLnByb3AoJ2NoZWNrZWQnKSA/ICcxJyA6ICcwJzsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFbGVtZW50Lm5hbWUgPT0gJ0N1c3RvbWVyU2VsZWN0ZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEYXRhW0VsZW1lbnQubmFtZV0gJiYgJChFbGVtZW50KS5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50Lm5hbWVdID0gJChFbGVtZW50KS52YWwoKTsKICAgICAgICAgICAgICAgICAgICB9Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkudmFsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgVGFyZ2V0TlMuRWRpdEFwcG9pbnRtZW50KERhdGEpOwogICAgICAgIH0pOwoKICAgICAgICAkKCIuQnV0dG9uVGFibGUgYnV0dG9uIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBEdXBsaWNhdGUgYXBwb2ludG1lbnQKICAgICAgICAkKCcjRWRpdEZvcm1Db3B5Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIFJlc2V0IEFwcG9pbnRtZW50SUQsIHJlbW92ZSBDb3B5ICYgRGVsZXRlIGJ1dHRvbnMKICAgICAgICAgICAgJCgiI0VkaXRBcHBvaW50bWVudEZvcm0gaW5wdXQjQXBwb2ludG1lbnRJRCIpLnZhbCgiIik7CiAgICAgICAgICAgICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNhdmUgdGhlIGFwcG9pbnRtZW50CiAgICAgICAgJCgnI0VkaXRGb3JtU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIERlbGV0ZSB0aGUgYXBwb2ludG1lbnQKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdFZGl0QXBwb2ludG1lbnRJRCcpKSB7CiAgICAgICAgICAgICQoJyNFZGl0Rm9ybURlbGV0ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJykpKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkVkaXRBcHBvaW50bWVudCh7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IENvcmUuQ29uZmlnLkdldCgnRWRpdEFwcG9pbnRtZW50SUQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdEZWxldGVBcHBvaW50bWVudCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBFZGl0IHBhcmVudCBhcHBvaW50bWVudAogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0VkaXRQYXJlbnRJRCcpKSB7CiAgICAgICAgICAgICQoJyNFZGl0UGFyZW50Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgiI0NoYWxsZW5nZVRva2VuIikudmFsKCksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEOiBDb3JlLkNvbmZpZy5HZXQoJ0VkaXRQYXJlbnRJRCcpCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50JyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2h0bWwnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAkKCcjRWRpdEZvcm1DYW5jZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUnKS5yZW1vdmVDbGFzcygnUGVyc2lzdGVudCcpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRlcGlja2VyIGJ1dHRvbnMuCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnKSA+IDIpIHsKICAgICAgICAgICAgJC5lYWNoKFsnU3RhcnQnLCAnRW5kJywgJ1JlY3VycmVuY2VVbnRpbCcsICdOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSddLCBmdW5jdGlvbiAoSW5kZXgsIFByZWZpeCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5EYXRlcGlja2VyLkluaXQoewogICAgICAgICAgICAgICAgICAgIERheTogJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQcmVmaXgpICsgJ0RheScpLAogICAgICAgICAgICAgICAgICAgIE1vbnRoOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnTW9udGgnKSwKICAgICAgICAgICAgICAgICAgICBZZWFyOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnWWVhcicpLAogICAgICAgICAgICAgICAgICAgIEhvdXI6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdIb3VyJyksCiAgICAgICAgICAgICAgICAgICAgTWludXRlOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnTWludXRlJyksCiAgICAgICAgICAgICAgICAgICAgV2Vla0RheVN0YXJ0OiBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.CustomerSearch.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gNThmYWNlMjJkZjRiMzU2NzIwOTdjZWQ4NDg0YmVkN2YyYjRmMmRmNyAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEJhY2t1cERhdGEKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2F2ZXMgQ3VzdG9tZXIgZGF0YSBmb3IgbGF0ZXIgcmVzdG9yZS4KICAgICAqLwogICAgdmFyIEJhY2t1cERhdGEgPSB7CiAgICAgICAgICAgIEN1c3RvbWVySW5mbzogJycsCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICcnLAogICAgICAgICAgICBDdXN0b21lcktleTogJycKICAgICAgICB9LAogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE5lZWRlZCBmb3IgdGhlIGNoYW5nZSBldmVudCBvZiBjdXN0b21lciBmaWVsZHMsIGlmIEFjdGl2ZUF1dG9Db21wbGV0ZSBpcyBmYWxzZSAoZGlzYWJsZWQpLgogICAgICovCiAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50ID0ge307CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBEaXNhYmxlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBjdXN0b21lciBJRCwgaWYgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYoJCgnI1RlbXBsYXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5wcm9wKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGaXJzdCBzZWxlY3QgYSBjdXN0b21lciB1c2VyLCB0aGVuIHNlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nKSk7CiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykuYWRkQ2xhc3MoJ0Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IFZhbHVlIC0gVGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFjdGl2YXRlIHRoZSBjdXN0b21lciBJRCBzZWxlY3Rpb24gYnV0dG9uLCBpZiAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYgKCQoJyNUZW1wbGF0ZVNlbGVjdGlvbkN1c3RvbWVySUQnKS5sZW5ndGggJiYgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5oYXNDbGFzcygnRGlzYWJsZWQnKSkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykucHJvcCgndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicpKTsKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5yZW1vdmVDbGFzcygnRGlzYWJsZWQnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0Q3VzdG9tZXJJbmZvCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJVc2VySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJJbmZvKEN1c3RvbWVyVXNlcklEKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVySW5mbycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2lnbmF0dXJlVVJMOwoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CgogICAgICAgICAgICAkKCcjQ3VzdG9tZXJJRCcpLnZhbChSZXNwb25zZS5DdXN0b21lcklEKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbChSZXNwb25zZS5DdXN0b21lcklEKTsKCiAgICAgICAgICAgIC8vIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIHN1YnNjcmliZXJzCiAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVySW5mby5DYWxsYmFjaycsIFtSZXNwb25zZS5DdXN0b21lcklEXSk7CgogICAgICAgICAgICAvLyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICAgICAgJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUYWJsZUhUTUxTdHJpbmcpOwoKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAovLyAgICAgICAgICAgICAvLyBvbmx5IGV4ZWN1dGUgdGhpcyBwYXJ0LCBpZiBpbiBBZ2VudFRpY2tldEVtYWlsIG9yIEFnZW50VGlja2V0UGhvbmUKLy8gICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScpIHsKLy8gICAgICAgICAgICAgICAgIHZhciAkRm9ybSA9IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyA/ICQoJyNOZXdFbWFpbFRpY2tldCcpIDogJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgIC8vIG9ubHkgZXhlY3V0ZSB0aGlzIHBhcnQsIGlmIGluIEFnZW50VGlja2V0RW1haWwgb3IgQWdlbnRUaWNrZXRQaG9uZSBvciBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICB2YXIgJEZvcm07CiAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjTmV3RW1haWxUaWNrZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJykgewogICAgICAgICAgICAgICAgICAgICRGb3JtID0gJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpOwogICAgICAgICAgICAgICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICAgICAgICAgLy8gcmVzZXQgc2VydmljZQogICAgICAgICAgICAgICAgJCgnI1NlcnZpY2VJRCcpLmF0dHIoJ3NlbGVjdGVkSW5kZXgnLCAwKTsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJEZvcm0sICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzaWduYXR1cmUgaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgaWYgKCQoJyNEZXN0JykudmFsKCkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJ0FjdGlvbj0nICsgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSArICc7U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKCcjRGVzdCcpLnZhbCgpICsgJztTZWxlY3RlZEN1c3RvbWVyVXNlcj0nICsgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI1NpZ25hdHVyZScpLmF0dHIoJ3NyYycsIFNpZ25hdHVyZVVSTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFByb2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAvLyByZXNldCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUlEJykuYXR0cignc2VsZWN0ZWRJbmRleCcsIDApOwogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlcnZpY2VzICh0cmlnZ2VyIFNlcnZpY2VJRCBjaGFuZ2UgZXZlbnQpCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ3VzdG9tZXJJRCcpLmNsb3Nlc3QoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBHZXRDdXN0b21lclRpY2tldHMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lclVzZXJJRAogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgdGlja2V0cy4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJUaWNrZXRzKEN1c3RvbWVyVXNlcklELCBDdXN0b21lcklEKSB7CgogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAnQ3VzdG9tZXJUaWNrZXRzJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQ6IEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICBDdXN0b21lcklEOiBDdXN0b21lcklECiAgICAgICAgfTsKCiAgICAgICAgLy8gY2hlY2sgaWYgY3VzdG9tZXIgdGlja2V0cyBzaG91bGQgYmUgc2hvd24KICAgICAgICBpZiAodHlwZW9mIENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXBhcnNlSW50KENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKS5TaG93Q3VzdG9tZXJUaWNrZXRzLCAxMCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBDdXN0b21lckhpc3RvcnlFdmVudHMKICAgICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5HZXRDdXN0b21lclRpY2tldHMKICAgICAgICAgKiBAZnVuY3Rpb24KICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBldmVudHMgZm9yIEN1c3RvbWVyIEhpc3Rvcnkgb3ZlcnZpZXcgdGFibGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQ3VzdG9tZXJIaXN0b3J5RXZlbnRzKCkgewogICAgICAgICAgICAkKCdzZWxlY3RbbmFtZT1SZXNwb25zZUlEXScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgVVJMOwogICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3QgYm94IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4gZnJvbSB0aGUgc2FtZSB3aW5kb3cuCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoJzAnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoJ3NlbGVjdFtuYW1lPVJlc3BvbnNlSURdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIC5NYXN0ZXJBY3Rpb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnYS5NYXN0ZXJBY3Rpb25MaW5rJyk7CgogICAgICAgICAgICAgICAgLy8gUHJldmVudCBNYXN0ZXJBY3Rpb24gb24gTW9kZXJuaXplIGlucHV0IGZpZWxkcy4KICAgICAgICAgICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0lucHV0RmllbGRfU2VhcmNoJykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFdmVudCBtdXN0IGJlIGRvbmUgaW4gdGhlIHBhcmVudCB3aW5kb3cgYmVjYXVzZSBBZ2VudFRpY2tldEN1c3RvbWVyIGlzIGluIHBvcHVwLgogICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJykgewogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuRXhlY3V0ZUluUGFyZW50V2luZG93KGZ1bmN0aW9uKFdpbmRvd09iamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dPYmplY3QuQ29yZS5VSS5Qb3B1cC5GaXJlUG9wdXBFdmVudCgnVVJMJywgeyBVUkw6ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKSB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLkNsb3NlUG9wdXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5LgogICAgICAgICAgICAgICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgiI1NvcnRCeSIpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBTb3J0ZWREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbiA9ICQodGhpcykudmFsKCkuc3BsaXQoJ3wnKTsKCiAgICAgICAgICAgICAgICBpZiAoU2VsZWN0aW9uLmxlbmd0aCA9PT0gMikgewoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHNvcnRlZCBjdXN0b21lciB0aWNrZXRzLgogICAgICAgICAgICAgICAgICAgIFNvcnRlZERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdDdXN0b21lclRpY2tldHMnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQ6IEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRCeTogU2VsZWN0aW9uWzBdLAogICAgICAgICAgICAgICAgICAgICAgICBPcmRlckJ5OiBTZWxlY3Rpb25bMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBTb3J0ZWREYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclRpY2tldHMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5odG1sKFJlc3BvbnNlLkN1c3RvbWVyVGlja2V0c0hUTUxTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIEFjdGl2YXRlIE1vZGVybml6ZSBmaWVsZHMuCiAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoKTsKICAgICAgICAgICAgQ29yZS5BcHAuU3Vic2NyaWJlKCdFdmVudC5VSS5BY2NvcmRpb24uT3BlbkVsZW1lbnQnLCBmdW5jdGlvbigkRWxlbWVudCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcwogICAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVyVGlja2V0cwogICAgICAgICAqIEBmdW5jdGlvbgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlLgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbmQgc2hvd3MgY3VzdG9tZXIgdGlja2V0IGxpbmtzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCkgewogICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuZmluZCgnLkFyaWFSb2xlTWFpbicpLnJlbW92ZUF0dHIoJ3JvbGUnKS5yZW1vdmVDbGFzcygnQXJpYVJvbGVNYWluJyk7CgogICAgICAgICAgICAvLyBSZXBsYWNlIG92ZXJ2aWV3IG1vZGUgbGlua3MgKFMsIE0sIEwgdmlldyksIHBhZ2luYXRpb24gbGlua3Mgd2l0aCBBSkFYCiAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5maW5kKCcuT3ZlcnZpZXdab29tIGEsIC5QYWdpbmF0aW9uIGEsIC5UYWJsZVNtYWxsIHRoIGEnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBDdXQgb3V0IEJhc2VVUkwgYW5kIHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSBVUkwKICAgICAgICAgICAgICAgIHZhciBMaW5rID0gJCh0aGlzKS5hdHRyKCdocmVmJyksCiAgICAgICAgICAgICAgICAgICAgVVJMQ29tcG9uZW50czsKCiAgICAgICAgICAgICAgICBVUkxDb21wb25lbnRzID0gTGluay5zcGxpdCgnPycsIDIpOwoKICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMQ29tcG9uZW50c1swXSwgVVJMQ29tcG9uZW50c1sxXSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclRpY2tldHMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUaWNrZXRzSFRNTFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuU3BsaXRTZWxlY3Rpb24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LlRpY2tldFNwbGl0Lk9wZW5TcGxpdFNlbGVjdGlvbigkKHRoaXMpLmF0dHIoJ2hyZWYnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIEluaXQgYWNjb3JkaW9uIG9mIG92ZXJ2aWV3IGFydGljbGUgcHJldmlldwogICAgICAgICAgICBDb3JlLlVJLkFjY29yZGlvbi5Jbml0KCQoJy5QcmV2aWV3ID4gdWwnKSwgJ2xpIGgzIGEnLCAnLkhpZGRlbkJsb2NrJyk7CgogICAgICAgICAgICAvLyBFdmVudHMgZm9yIEN1c3RvbWVyIEhpc3RvcnkgdGFibGUgLSBBZ2VudFRpY2tldFBob25lLCBBZ2VudFRpY2tldEVtYWlsIGFuZCBBZ2VudFRpY2tldEN1c3RvbWVyIHNjcmVlbnMuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJyB8fAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8CiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDdXN0b21lcicgfHwKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudENoYXRBcHBlbmQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySGlzdG9yeUV2ZW50cygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgIC8vIHNob3cgY3VzdG9tZXIgdGlja2V0cwogICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVGlja2V0cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUaWNrZXRzSFRNTFN0cmluZyk7CiAgICAgICAgICAgICAgICBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcygpOwoKICAgICAgICAgICAgICAgIC8vIGNsaWNrIGV2ZW50IGZvciBvcGVuaW5nIHBvcHVwCiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuQXNQb3B1cCcpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuU3BsaXRTZWxlY3Rpb24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRTcGxpdC5PcGVuU3BsaXRTZWxlY3Rpb24oJCh0aGlzKS5hdHRyKCdocmVmJykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tQaG9uZUN1c3RvbWVyQ291bnRMaW1pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluIEFnZW50VGlja2V0UGhvbmUsIHRoaXMgY2hlY2tzIGlmIG1vcmUgdGhhbiBvbmUgZW50cnkgaXMgYWxsb3dlZAogICAgICogICAgICBpbiB0aGUgY3VzdG9tZXIgbGlzdCBhbmQgYmxvY2tzL3VuYmxvY2tzIHRoZSBhdXRvY29tcGxldGUgZmllbGQgYXMgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCkgewoKICAgICAgICAvLyBPbmx5IG9wZXJhdGUgaW4gQWdlbnRUaWNrZXRQaG9uZQogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRQaG9uZScpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgbXVsdGlwbGUgZnJvbSBlbnRyaWVzIGFyZSBhbGxvd2VkCiAgICAgICAgaWYgKHBhcnNlSW50KENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKS5BbGxvd011bHRpcGxlRnJvbSwgMTApKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkKCcjVGlja2V0Q3VzdG9tZXJDb250ZW50RnJvbUN1c3RvbWVyIGlucHV0LkN1c3RvbWVyVGlja2V0VGV4dCcpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgJCgnI0Zyb21DdXN0b21lcicpLnZhbCgnJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICAkKCcjRGVzdCcpLnRyaWdnZXIoJ2ZvY3VzJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkKCcjRnJvbUN1c3RvbWVyJykudmFsKCcnKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSW5pdFNpbXBsZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBtb2R1bGUuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRTaW1wbGUgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgQ3VzdG9tZXJTZWFyY2hUeXBlID0gJEVsZW1lbnQuZGF0YSgnY3VzdG9tZXItc2VhcmNoLXR5cGUnKTsKCiAgICAgICAgaWYgKEN1c3RvbWVyU2VhcmNoVHlwZSkgewogICAgICAgICAgICBDb3JlLlVJLkF1dG9jb21wbGV0ZS5Jbml0KCRFbGVtZW50LCBmdW5jdGlvbiAoUmVxdWVzdCwgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnU2VhcmNoJyArIEN1c3RvbWVyU2VhcmNoVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLlVJLkF1dG9jb21wbGV0ZS5HZXRDb25maWcoJ01heFJlc3VsdHNEaXNwbGF5ZWQnKQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmRhdGEoJ0F1dG9Db21wbGV0ZVhIUicsIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWYWx1ZURhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQucmVtb3ZlRGF0YSgnQXV0b0NvbXBsZXRlWEhSJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5MYWJlbCArIChDdXN0b21lclNlYXJjaFR5cGUgPT0gJ0N1c3RvbWVyVXNlcicgPyAnICgnICsgdGhpcy5WYWx1ZSArICcpJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5WYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZShWYWx1ZURhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKFVJLml0ZW0udmFsdWUpLnRyaWdnZXIoJ3NlbGVjdC5BdXRvY29tcGxldGUnKTsKCiAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LCAnQ3VzdG9tZXJTZWFyY2gnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBtb2R1bGUuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMgZm9yIEFnZW50VGlja2V0Q3VzdG9tZXIKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInKSB7CiAgICAgICAgICAgIEdldEN1c3RvbWVyVGlja2V0cygkKCcjQ3VzdG9tZXJBdXRvQ29tcGxldGUnKS52YWwoKSwgJCgnI0N1c3RvbWVySUQnKS52YWwoKSk7CgogICAgICAgICAgICAkRWxlbWVudC5ibHVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC52YWwoKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5SZXNldEN1c3RvbWVySW5mbygpOwogICAgICAgICAgICAgICAgICAgIERlYWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmVtcHR5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gRW5hYmxlIGZyZWUgc2VsZWN0aW9uIG9yIGlucHV0IG9mIEN1c3RvbWVySUQgZmllbGQgb24gQWdlbnRUaWNrZXRQcm9jZXNzIGFuZCBBZ2VudFRpY2tldEN1c3RvbWVyLgogICAgICAgIGlmICgoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UHJvY2VzcycKICAgICAgICAgICAgJiYgIUNvcmUuQ29uZmlnLkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcm9jZXNzOjpDdXN0b21lcklEUmVhZE9ubHknKSkKICAgICAgICAgICAgfHwKICAgICAgICAgICAgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJwogICAgICAgICAgICAmJiAhQ29yZS5Db25maWcuR2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEN1c3RvbWVyOjpDdXN0b21lcklEUmVhZE9ubHknKSkKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICQoJyNDdXN0b21lckF1dG9Db21wbGV0ZScpLm9uKCdibHVyIGtleXVwJyAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYoJCgnI0N1c3RvbWVyQXV0b0NvbXBsZXRlJykudmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERlYWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMgZm9yIEFnZW50VGlja2V0UGhvbmUgYW5kIEFnZW50VGlja2V0RW1haWwKICAgICAgICBpZiAoKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScpICYmICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgpICE9PSAnJykgewogICAgICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8ganVzdCBzYXZlIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjdXN0b21lciBpbmZvCiAgICAgICAgaWYgKCQoJyNDdXN0b21lckluZm8nKS5sZW5ndGgpIHsKICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lckluZm8gPSAkKCcjQ3VzdG9tZXJJbmZvIC5Db250ZW50JykuaHRtbCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAvLyBIaWRlIHRvb2x0aXAgaW4gYXV0b2NvbXBsZXRlIGZpZWxkLCBpZiB1c2VyIGFscmVhZHkgdHlwZWQgc29tZXRoaW5nIHRvIHByZXZlbnQgdGhlIGF1dG9jb21wbGV0ZSBsaXN0CiAgICAgICAgICAgIC8vIHRvIGJlIGhpZGRlbiB1bmRlciB0aGUgdG9vbHRpcC4gKE9ubHkgbmVlZGVkIGZvciBzZXJ2ZXJzaWRlIGVycm9ycykKICAgICAgICAgICAgJEVsZW1lbnQub2ZmKCdrZXl1cC5WYWxpZGF0ZScpLm9uKCdrZXl1cC5WYWxpZGF0ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgdmFyIFZhbHVlID0gJEVsZW1lbnQudmFsKCk7CiAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC5oYXNDbGFzcygnU2VydmVyRXJyb3InKSAmJiBWYWx1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICQoJyNPVE9CT19VSV9Ub29sdGlwc19FcnJvclRvb2x0aXAnKS5oaWRlKCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLkFwcC5TdWJzY3JpYmUoJ0V2ZW50LkN1c3RvbWVyVXNlckFkZHJlc3NCb29rLkFkZFRpY2tldEN1c3RvbWVyLkNhbGxiYWNrLicgKyAkRWxlbWVudC5hdHRyKCdpZCcpLCBmdW5jdGlvbihVc2VyTG9naW4sIEN1c3RvbWVyVGlja2V0VGV4dCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKEN1c3RvbWVyVGlja2V0VGV4dCk7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcigkRWxlbWVudC5hdHRyKCdpZCcpLCBDdXN0b21lclRpY2tldFRleHQsIFVzZXJMb2dpbik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IENvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCdBdXRvQ29tcGxldGVYSFInLCBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBWYWx1ZURhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5yZW1vdmVEYXRhKCdBdXRvQ29tcGxldGVYSFInKTsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLkxhYmVsICsgIiAoIiArIHRoaXMuVmFsdWUgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b21lciBsaXN0IHJlcHJlc2VudGF0aW9uIChzZWUgQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyBmcm9tIERlZmF1bHRzLnBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b21lciB1c2VyIGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoVmFsdWVEYXRhKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyS2V5ID0gVUkuaXRlbS5rZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJWYWx1ZSA9IFVJLml0ZW0udmFsdWU7CgogICAgICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lcktleSA9IEN1c3RvbWVyS2V5OwogICAgICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lckVtYWlsID0gQ3VzdG9tZXJWYWx1ZTsKCiAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoQ3VzdG9tZXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldFBob25lJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFbyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRDdXN0b21lclVzZXIKICAgICAgICAgICAgICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIGZvciBBZ2VudFRpY2tldEN1c3RvbWVyLnBtCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclVzZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VySUQnKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLnZhbChDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lclVzZXJPcHRpb24iIGlkPSJDdXN0b21lclVzZXJPcHRpb24iPicpLnZhbChDdXN0b21lcktleSkuYXBwZW5kVG8oJEVsZW1lbnQuY2xvc2VzdCgnZm9ybScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgICAgICAgICAgICAgIEdldEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcigkKEV2ZW50LnRhcmdldCkuYXR0cignaWQnKSwgQ3VzdG9tZXJWYWx1ZSwgQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCAnQ3VzdG9tZXJTZWFyY2gnKTsKCiAgICAgICAgICAgIC8vIFJlbWVtYmVyIGlmIGF1dG9jb21wbGV0ZSBpdGVtIHdhcyBmb2N1c2VkIChieSBrZXlib2FyZCBuYXZpZ2F0aW9uIG9yIG1vdXNlKS4KICAgICAgICAgICAgJEVsZW1lbnQub24oJ2F1dG9jb21wbGV0ZWZvY3VzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cyA9IHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiAkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKSA9PT0gJ29iamVjdCcpIHsKCiAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciBpZiB0aGUgYXV0b2NvbXBsZXRlIHdpZGdldCBpcyBsZWZ0IGJ5IG1vdXNlLgogICAgICAgICAgICAgICAgJCgkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKS5tZW51LmVsZW1lbnQpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGlmIHRoZSBhdXRvY29tcGxldGUgd2lkZ2V0IGlzIGxlZnQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvbi4KICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBieSBvdmVycmlkZSB0aGUgX21vdmUgbWV0aG9kIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3Bwb3NpdGUgZXZlbnQgb2YgYXV0b2NvbXBsZXRlZm9jdXMuCiAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKS5fbW92ZSA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaChudWxsLCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSAmJiAvXnByZXZpb3VzLy50ZXN0KGRpcmVjdGlvbikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51LmlzTGFzdEl0ZW0oKSAmJiAvXm5leHQvLnRlc3QoZGlyZWN0aW9uKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSh0aGlzLnRlcm0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBtb3VzZWxlYXZlIGZvciByZW1vdmluZyBzZWxlY3Rpb24gb2YgYXV0b2NvbXBsZXRlIHdpZGdldC4KICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1lbnUuZWxlbWVudCkudHJpZ2dlcignbW91c2VsZWF2ZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51WyBkaXJlY3Rpb24gXShldmVudCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiBhdXRvY29tcGxldGUgd2FzIGZvY3VzZWQsIGJ1dCB0aGVuIGNsb3NlZCBieSBhIGJsdXIsIGNsZWFyIHRoZSBzZWFyY2ggZmllbGQgc2luY2UgdGhpcyB2YWx1ZSB3YXMKICAgICAgICAgICAgLy8gICBuZXZlciBleHBsaWNpdGx5IGNvbmZpcm1lZC4gRG8gdGhpcyBhbHNvIHdoZW4gdXNlciBkZWNpZGVzIHRvIGNsaWNrIG91dHNpZGUgdGhlIGF1dG9jb21wbGV0ZSBsaXN0LAogICAgICAgICAgICAvLyAgIHdoaWNoIGNhdXNlcyB0aGUgbGlzdCB0byBjbG9zZS4gUGxlYXNlIHNlZSBidWcjMTM1MzcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICRFbGVtZW50Lm9uKCdhdXRvY29tcGxldGVjbG9zZScsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMKICAgICAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50Lm9yaWdpbmFsRXZlbnQgPT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5vcmlnaW5hbEV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBFdmVudC5vcmlnaW5hbEV2ZW50LnR5cGUgPT0gJ2JsdXInCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRQaG9uZScKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5ibHVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRmllbGRWYWx1ZSA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkVmFsdWUgIT09IEJhY2t1cERhdGEuQ3VzdG9tZXJFbWFpbCAmJiBGaWVsZFZhbHVlICE9PSBCYWNrdXBEYXRhLkN1c3RvbWVyS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJJRCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJPcHRpb24nKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2hvd0N1c3RvbWVySUQnKS5odG1sKCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoQmFja3VwRGF0YS5DdXN0b21lckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVySUQnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UHJvY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0N1c3RvbWVySUQnKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplcyB0aGUgY3VzdG9tZXIgZmllbGQuCiAgICAgICAgICAgICAgICBUYXJnZXROUy5Jbml0Q3VzdG9tZXJGaWVsZCgkRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9uIHVubG9hZCByZW1vdmUgb2xkIHNlbGVjdGVkIGRhdGEuIElmIHRoZSBwYWdlIGlzIHJlbG9hZGVkICh3aXRoIEY1KSB0aGlzIGRhdGEKICAgICAgICAvLyBzdGF5cyBpbiB0aGUgZmllbGQgYW5kIGludm9rZXMgYW4gYWpheCByZXF1ZXN0IG90aGVyd2lzZS4gV2UgbmVlZCB0byB1c2UgYmVmb3JldW5sb2FkCiAgICAgICAgLy8gaGVyZSBpbnN0ZWFkIG9mIHVubG9hZCBiZWNhdXNlIHRoZSBVUkwgb2YgdGhlIHdpbmRvdyBkb2VzIG5vdCBjaGFuZ2Ugb24gcmVsb2FkIHdoaWNoCiAgICAgICAgLy8gZG9lc24ndCB0cmlnZ2VyIHBhZ2VoaWRlLgogICAgICAgICQod2luZG93KS5vbignYmVmb3JldW5sb2FkLkN1c3RvbWVyU2VhcmNoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoJycpOwogICAgICAgICAgICByZXR1cm47IC8vIHJldHVybiBub3RoaW5nIHRvIHN1cHByZXNzIHRoZSBjb25maXJtYXRpb24gbWVzc2FnZQogICAgICAgIH0pOwoKICAgICAgICBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGh0bWxEZWNvZGUoVGV4dCl7CiAgICAgICAgcmV0dXJuIFRleHQucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFkZFRpY2tldEN1c3RvbWVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBmYWxzZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZAogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyVmFsdWUgLSBUaGUgcmVhZGFibGUgY3VzdG9tZXIgaWRlbnRpZmllci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lcktleSAtIEN1c3RvbWVyIGtleSBvbiBzeXN0ZW0uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU2V0QXNUaWNrZXRDdXN0b21lciAtICBTZXQgdGhpcyBjdXN0b21lciBhcyBtYWluIHRpY2tldCBjdXN0b21lci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgdGlja2V0IGN1c3RvbWVyCiAgICAgKi8KICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyID0gZnVuY3Rpb24gKEZpZWxkLCBDdXN0b21lclZhbHVlLCBDdXN0b21lcktleSwgU2V0QXNUaWNrZXRDdXN0b21lcikgewoKICAgICAgICB2YXIgJENsb25lID0gJCgnLkN1c3RvbWVyVGlja2V0VGVtcGxhdGUnICsgRmllbGQpLmNsb25lKCksCiAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0Q291bnRlciA9ICQoJyNDdXN0b21lclRpY2tldENvdW50ZXInICsgRmllbGQpLnZhbCgpLAogICAgICAgICAgICBUaWNrZXRDdXN0b21lcklEcyA9IDAsCiAgICAgICAgICAgIElzRHVwbGljYXRlZCA9IGZhbHNlLAogICAgICAgICAgICBJc0ZvY3VzZWQgPSAoJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5hdHRyKCdpZCcpID09IEZpZWxkKSwKICAgICAgICAgICAgU3VmZml4OwoKICAgICAgICBpZiAodHlwZW9mIEN1c3RvbWVyS2V5ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBDdXN0b21lcktleSA9IGh0bWxEZWNvZGUoQ3VzdG9tZXJLZXkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEN1c3RvbWVyVmFsdWUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHZhciBDdXJyZW50UXVvdGF0aW9uLAogICAgICAgICAgICBNdWx0aUVudHJ5ID0gWycnXSwKICAgICAgICAgICAgU2VlbkF0ICAgICA9IDAsCiAgICAgICAgICAgIG4gICAgICAgICAgPSAwOwoKICAgICAgICAvLyBkbyBhIG1hbnVhbCBzcGxpdCB0aGF0IGtlZXBzIHRyYWNrIG9mIHF1b3RhdGlvbgogICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IEN1c3RvbWVyVmFsdWUubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIHZhciBDaGFyID0gQ3VzdG9tZXJWYWx1ZS5jaGFyQXQoaSk7CgogICAgICAgICAgICBpZiAoIEN1cnJlbnRRdW90YXRpb24gKSB7CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dICs9IENoYXI7CiAgICAgICAgICAgICAgICBpZiAoIENoYXIgPT09IEN1cnJlbnRRdW90YXRpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgQ3VycmVudFF1b3RhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggQ2hhciA9PT0gJyInIHx8IENoYXIgPT09ICInIiApIHsKICAgICAgICAgICAgICAgIE11bHRpRW50cnlbbl0gICAgKz0gQ2hhcjsKICAgICAgICAgICAgICAgIEN1cnJlbnRRdW90YXRpb24gID0gQ2hhcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggU2VlbkF0ID09PSAxICYmICggQ2hhciA9PT0gJywnIHx8IENoYXIgPT09ICI7IiApICkgewogICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgICAgU2VlbkF0ICAgICAgICA9IDA7CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIENoYXIgPT09ICdAJyApIHsKICAgICAgICAgICAgICAgICAgICBTZWVuQXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgTXVsdGlFbnRyeVtuXSArPSBDaGFyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIG4gPiAwICkgewogICAgICAgICAgICBmb3IgKCB2YXIgbSA9IDA7IG0gPD0gbjsgbSsrICkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIoIEZpZWxkLCBNdWx0aUVudHJ5W21dLnRyaW0oKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAkKCdbY2xhc3MqPUN1c3RvbWVyVGlja2V0VGV4dF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PT0gQ3VzdG9tZXJWYWx1ZSkgewogICAgICAgICAgICAgICAgSXNEdXBsaWNhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChJc0R1cGxpY2F0ZWQpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0R1cGxpY2F0ZWREaWFsb2coRmllbGQpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBnZXQgbnVtYmVyIG9mIGhvdyBtdWNoIGN1c3RvbWVyIHRpY2tldCBhcmUgcHJlc2VudAogICAgICAgIFRpY2tldEN1c3RvbWVySURzID0gJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl0nKS5sZW5ndGg7CgogICAgICAgIC8vIGluY3JlbWVudCBjdXN0b21lciBjb3VudGVyCiAgICAgICAgQ3VzdG9tZXJUaWNrZXRDb3VudGVyKys7CgogICAgICAgIC8vIHNldCBzdWZmaXgKICAgICAgICBTdWZmaXggPSAnXycgKyBDdXN0b21lclRpY2tldENvdW50ZXI7CgogICAgICAgIC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBjbGFzc2VzCiAgICAgICAgJENsb25lLnJlbW92ZUNsYXNzKCdIaWRkZW4gQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZScgKyBGaWVsZCk7CgogICAgICAgIC8vIGNvcHkgdmFsdWVzIGFuZCBjaGFuZ2UgaWRzIGFuZCBuYW1lcwogICAgICAgICRDbG9uZS5maW5kKCc6aW5wdXQsIGEnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBJRCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdpZCcsIElEICsgU3VmZml4KTsKICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJWYWx1ZSk7CiAgICAgICAgICAgIGlmIChJRCAhPT0gJ0N1c3RvbWVyU2VsZWN0ZWQnKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ25hbWUnLCBJRCArIFN1ZmZpeCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBldmVudCBoYW5kbGVyIHRvIHJhZGlvIGJ1dHRvbgogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdDdXN0b21lclRpY2tldFJhZGlvJykpIHsKCiAgICAgICAgICAgICAgICBpZiAoVGlja2V0Q3VzdG9tZXJJRHMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzZXQgY291bnRlciBhcyB2YWx1ZQogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJUaWNrZXRDb3VudGVyKTsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIGNoYW5nZSBmdW5jdGlvbiB0byByYWRpbyBidXR0b24gdG8gc2VsZWN0IGN1c3RvbWVyCiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvdwogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlJlbG9hZEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgY3VzdG9tZXIga2V5IGlmIHByZXNlbnQKICAgICAgICAgICAgaWYoJCh0aGlzKS5oYXNDbGFzcygnQ3VzdG9tZXJLZXknKSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhZGQgZXZlbnQgaGFuZGxlciB0byByZW1vdmUgYnV0dG9uCiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ1JlbW92ZUJ1dHRvbicpKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm93CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVtb3ZlQ3VzdG9tZXJUaWNrZXQoJCh0aGlzKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIEN1c3RvbWVySGlzdG9yeSB0YWJsZSBpZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgY3VzdG9tZXIgdXNlcnMKICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudCcgKyBGaWVsZCArICcgLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gc2V0IGJ1dHRvbiB2YWx1ZQogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ01vdmVDdXN0b21lckJ1dHRvbicpKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgTW92ZUN1c3RvbWVyS2V5ID0gJCgnLkN1c3RvbWVyS2V5JywgJCh0aGlzKS5wYXJlbnQoKSkudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVDdXN0b21lclZhbCA9ICQoJy5DdXN0b21lclRpY2tldFRleHQnLCAkKHRoaXMpLnBhcmVudCgpKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0RmllbGQgICAgID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoJ1RvTW92ZScpICA/ICdUb0N1c3RvbWVyJyAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5oYXNDbGFzcygnQ2NNb3ZlJykgID8gJ0NjQ3VzdG9tZXInICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKCdCY2NNb3ZlJykgPyAnQmNjQ3VzdG9tZXInIDogJyc7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBlbnRyeQogICAgICAgICAgICAgICAgICAgICQoJy5SZW1vdmVCdXR0b24nLCAkKHRoaXMpLnBhcmVudCgpKS5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGN1c3RvbWVyIHRvIHRoZSB0YXJnZXQgZmllbGQKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcihUYXJnZXRGaWVsZCwgTW92ZUN1c3RvbWVyVmFsLCBNb3ZlQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBzaG93IGNvbnRhaW5lcgogICAgICAgICQoJyNUaWNrZXRDdXN0b21lckNvbnRlbnQnICsgRmllbGQpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAvLyBhcHBlbmQgdG8gY29udGFpbmVyCiAgICAgICAgJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudCcgKyBGaWVsZCkuYXBwZW5kKCRDbG9uZSk7CgogICAgICAgIC8vIHNldCBuZXcgdmFsdWUgZm9yIEN1c3RvbWVyVGlja2V0Q291bnRlcgogICAgICAgICQoJyNDdXN0b21lclRpY2tldENvdW50ZXInICsgRmllbGQpLnZhbChDdXN0b21lclRpY2tldENvdW50ZXIpOwogICAgICAgIGlmICgoQ3VzdG9tZXJLZXkgIT09ICcnICYmIFRpY2tldEN1c3RvbWVySURzID09PSAwICYmIChGaWVsZCA9PT0gJ1RvQ3VzdG9tZXInIHx8IEZpZWxkID09PSAnRnJvbUN1c3RvbWVyJykpIHx8IFNldEFzVGlja2V0Q3VzdG9tZXIpIHsKICAgICAgICAgICAgaWYgKFNldEFzVGlja2V0Q3VzdG9tZXIpIHsKICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclNlbGVjdGVkXycgKyBDdXN0b21lclRpY2tldENvdW50ZXIpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKS50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdOmZpcnN0JykucHJvcCgnY2hlY2tlZCcsIHRydWUpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBzZWFyY2ggZmllbGQuCiAgICAgICAgJCgnIycgKyBGaWVsZCkudmFsKCcnKTsKCiAgICAgICAgLy8gUmUtZm9jdXMgdGhlIGZpZWxkLCBidXQgb25seSBpZiBpdCB3YXMgcHJldmlvdXNseSBmb2N1c2VkLgogICAgICAgIGlmIChJc0ZvY3VzZWQpIHsKICAgICAgICAgICAgJCgnIycgKyBGaWVsZCkuZm9jdXMoKTsKICAgICAgICB9CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKCiAgICAgICAgLy8gUmVsb2FkIENyeXB0IG9wdGlvbnMgb24gc3BlY2lmaWMgc2NyZWVucy4KICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgJCgnI0NyeXB0S2V5SUQnKS5sZW5ndGgKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnIycgKyBGaWVsZCkuY2xvc2VzdCgnZm9ybScpLCAnQUpBWFVwZGF0ZScpOwogICAgICAgIH0KCiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGF0IGF0IGxlYXN0IG9uZSBjdXN0b21lciBoYXMgYmVlbiBhZGRlZCwKICAgICAgICAvLyB3ZSBjYW4gcmVtb3ZlIGV2ZW50dWFsIGVycm9ycyBmcm9tIHRoZSBjdXN0b21lciBmaWVsZAogICAgICAgICQoJyNGcm9tQ3VzdG9tZXIsICNUb0N1c3RvbWVyJykKICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdFcnJvciBTZXJ2ZXJFcnJvcicpCiAgICAgICAgICAgIC5jbG9zZXN0KCcuRmllbGQnKQogICAgICAgICAgICAucHJldignbGFiZWwnKQogICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ0xhYmVsRXJyb3InKTsKICAgICAgICBDb3JlLkZvcm0uRXJyb3JUb29sdGlwcy5IaWRlVG9vbHRpcCgpOwoKICAgICAgICBBY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlbW92ZUN1c3RvbWVyVGlja2V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gT2JqZWN0IC0gSlF1ZXJ5IG9iamVjdCB1c2VkIGFzIGJhc2UgdG8gZGVsZXRlIGl0J3MgcGFyZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGN1c3RvbWVyIHRpY2tldCBlbnRyeS4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVtb3ZlQ3VzdG9tZXJUaWNrZXQgPSBmdW5jdGlvbiAoT2JqZWN0KSB7CiAgICAgICAgdmFyIFRpY2tldEN1c3RvbWVySURzLAogICAgICAgICRGaWVsZCA9IE9iamVjdC5jbG9zZXN0KCcuRmllbGQnKSwKICAgICAgICAkRm9ybTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtID0gT2JqZWN0LmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgIFRpY2tldEN1c3RvbWVySURzID0gJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl0nKS5sZW5ndGg7CiAgICAgICAgaWYgKFRpY2tldEN1c3RvbWVySURzID09PSAwKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlJlc2V0Q3VzdG9tZXJJbmZvKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWxvYWQgQ3J5cHQgb3B0aW9ucyBvbiBzcGVjaWZpYyBzY3JlZW5zLgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAkKCcjQ3J5cHRLZXlJRCcpLmxlbmd0aAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkRm9ybSwgJ0FKQVhVcGRhdGUnKTsKICAgICAgICB9CgogICAgICAgIGlmKCEkKCcuQ3VzdG9tZXJDb250YWluZXIgaW5wdXRbdHlwZT0icmFkaW8iXScpLmlzKCc6Y2hlY2tlZCcpKXsKICAgICAgICAgICAgLy9zZXQgdGhlIGZpcnN0IG9uZSBhcyBjaGVja2VkCiAgICAgICAgICAgICQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdOmZpcnN0JykucHJvcCgnY2hlY2tlZCcsIHRydWUpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRGaWVsZC5maW5kKCcuQ3VzdG9tZXJUaWNrZXRUZXh0OnZpc2libGUnKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgJEZpZWxkLmFkZENsYXNzKCdIaWRkZW4nKTsKCiAgICAgICAgICAgIERlYWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgfQoKICAgICAgICBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVzZXRDdXN0b21lckluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgc2VsZWN0ZWQgY3VzdG9tZXIgaW5mby4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVzZXRDdXN0b21lckluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJJRCcpLnZhbCgnJyk7CiAgICAgICAgICAgICQoJyNDdXN0b21lcklEJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLnZhbCgnJyk7CiAgICAgICAgICAgICQoJyNTaG93Q3VzdG9tZXJJRCcpLmh0bWwoJycpOwoKICAgICAgICAgICAgLy8gcmVzZXQgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgICAgICAkKCcjQ3VzdG9tZXJJbmZvIC5Db250ZW50JykuaHRtbChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnbm9uZScpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZWxvYWRDdXN0b21lckluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lcktleQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVsb2FkcyBpbmZvIGZvciBzZWxlY3RlZCBjdXN0b21lci4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVsb2FkQ3VzdG9tZXJJbmZvID0gZnVuY3Rpb24gKEN1c3RvbWVyS2V5KSB7CgogICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgR2V0Q3VzdG9tZXJUaWNrZXRzKEN1c3RvbWVyS2V5KTsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIGRhdGEgZm9yIGN1c3RvbWVyIGluZm8gdGFibGUKICAgICAgICBHZXRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwoKICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIFNlbGVjdGVkQ3VzdG9tZXJVc2VyCiAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKEN1c3RvbWVyS2V5KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0Q3VzdG9tZXJGaWVsZAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9ICRFbGVtZW50IC0gSlF1ZXJ5IG9iamVjdC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjdXN0b21lciBmaWVsZHMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRDdXN0b21lckZpZWxkID0gZnVuY3Rpb24gKCRFbGVtZW50KSB7CiAgICAgICAgdmFyIE9iamVjdElkID0gJEVsZW1lbnQuYXR0cignaWQnKTsKCiAgICAgICAgJCgnIycgKyBPYmplY3RJZCkub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIGlmICghJCgnIycgKyBPYmplY3RJZCkudmFsKCkgfHwgJCgnIycgKyBPYmplY3RJZCkudmFsKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGF1dG9jb21wbGV0aW9uIGlzIGRpc2FibGVkIGFuZCBvbmx5IGF2YWlsYWJsZSB2aWEgdGhlIGNsaWNrCiAgICAgICAgICAgIC8vIG9mIGEgYnV0dG9uIG5leHQgdG8gdGhlIGlucHV0IGZpZWxkLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMKICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50IHRoZSBub3JtYWwgd2F5LgogICAgICAgICAgICBpZiAoIUNvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnQWN0aXZlQXV0b0NvbXBsZXRlJykpIHsKICAgICAgICAgICAgICAgIC8vIHdlIHdhaXQgc29tZSB0aW1lIGFmdGVyIHRoaXMgZXZlbnQgdG8gY2hlY2ssIGlmIHRoZSBzZWFyY2ggYnV0dG9uCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBmaWVsZCB3YXMgcHJlc3NlZC4gSWYgc28sIG5vIGFjdGlvbiBpcyBuZWVkZWQKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgZXZlbnQgd2FzIGZpcmVkIHdpdGhvdXQgY2xpY2tpbmcgdGhlIHNlYXJjaCBidXR0b24sCiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB0aGUgdXNlciBjbGlja2VkIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGFkZCB0aGUgY3VzdG9tZXIgKHRoZSBlbnRlcmVkIHZhbHVlKSB0byB0aGUgbGlzdAoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50W09iamVjdElkXSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF0rKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQ29yZS5VSS5BdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uQ2xpY2tlZFtPYmplY3RJZF0pIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50W09iamVjdElkXTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgQ29yZS5VSS5BdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uQ2xpY2tlZFtPYmplY3RJZF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF0gPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBPYmplY3RJZCkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLyBJZiB0aGUgYXV0b2NvbXBsZXRlIHBvcHVwIHdpbmRvdyBpcyB2aXNpYmxlLCBkZWxheSB0aGlzIGNoYW5nZSBldmVudC4KICAgICAgICAgICAgLy8gSXQgbWlnaHQgYmUgY2F1c2VkIGJ5IGNsaWNraW5nIHdpdGggdGhlIG1vdXNlIGludG8gdGhlIGF1dG9jb21wbGV0ZSBsaXN0LgogICAgICAgICAgICAvLyBXYWl0IHVudGlsIGl0IGlzIGNsb3NlZCB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYWRkIGEgY3VzdG9tZXIgdHdpY2UuCgogICAgICAgICAgICBpZiAoJEVsZW1lbnQuYXV0b2NvbXBsZXRlKCJ3aWRnZXQiKS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAkKCcjJyArIE9iamVjdElkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoT2JqZWN0SWQsICQoJyMnICsgT2JqZWN0SWQpLnZhbCgpKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjJyArIE9iamVjdElkKS5vbigna2V5cHJlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpewogICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5BZGRUaWNrZXRDdXN0b21lcihPYmplY3RJZCwgJCgnIycgKyBPYmplY3RJZCkudmFsKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgU2hvd0R1cGxpY2F0ZWREaWFsb2cKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZCAtIElEIG9iamVjdCBvZiB0aGUgZWxlbWVudCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXMgb24gY2xvc2UgZXZlbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBzaG93cyBhbiBhbGVydCBkaWFsb2cgZm9yIGR1cGxpY2F0ZWQgZW50cmllcy4KICAgICAqLwogICAgVGFyZ2V0TlMuU2hvd0R1cGxpY2F0ZWREaWFsb2cgPSBmdW5jdGlvbihGaWVsZCl7CiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0FsZXJ0KAogICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRHVwbGljYXRlZCBlbnRyeScpLAogICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJykgKyAnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSXQgaXMgZ29pbmcgdG8gYmUgZGVsZXRlZCBmcm9tIHRoZSBmaWVsZCwgcGxlYXNlIHRyeSBhZ2Fpbi4nKSwKICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkFsZXJ0JykpOwogICAgICAgICAgICAgICAgJCgnIycgKyBGaWVsZCkudmFsKCcnKTsKICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGQpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaCB8fCB7fSkpOwo=</File>
        <File Location="doc/en/AppointmentToTicket.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="calendar_appointment">
            <ColumnAdd Name="future_task_id" Required="false" Type="INTEGER"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="calendar_appointment">
            <ColumnDrop Name="future_task_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>