<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ProcessTicketTemplates</Name>
    <Version>11.0.5</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-29 15:02:06" Version="11.0.5">Updated package with ACL-related changes from core.</ChangeLog>
    <ChangeLog Date="2026-04-27 16:15:25" Version="11.0.4">Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2026-02-05 13:22:19" Version="11.0.3">Update to OTOBO 11.0.15.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:57:56" Version="11.0.2">Update to OTOBO 11.0.8.</ChangeLog>
    <ChangeLog Date="2024-12-19 08:05:53" Version="11.0.1">Initial release.</ChangeLog>
    <Description Lang="en">The package ProcessTicketTemplates enables standard templates for process management activity dialogs in the agent interface.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>469394dae566ab48236cc4b42a332ef4326af972</BuildCommitID>
    <BuildDate>2026-10-29 15:02:10</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminProcessManagementActivityDialog.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5Qcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5RGlhbG9nLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlEaWFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgJFNlbGYtPntTdWJhY3Rpb259ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmFjdGlvbicgKSB8fCAnJzsKCiAgICBteSAkQWN0aXZpdHlEaWFsb2dJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICAgICB8fCAnJzsKICAgIG15ICRFbnRpdHlJRCAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VudGl0eUlEJyApIHx8ICcnOwoKICAgIG15ICVTZXNzaW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5HZXRTZXNzaW9uSUREYXRhKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICApOwoKICAgICMgY29udmVydCBKU09OIHN0cmluZyB0byBhcnJheQogICAgJFNlbGYtPntTY3JlZW5zUGF0aH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgRGF0YSA9PiAkU2Vzc2lvbkRhdGF7UHJvY2Vzc01hbmFnZW1lbnRTY3JlZW5zUGF0aH0KICAgICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRW50aXR5T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkRCOjpFbnRpdHknKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6REI6OkFjdGl2aXR5RGlhbG9nJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjcmVhdGUgYXZhaWxhYmxlIEZpZWxkcyBsaXN0CiAgICBteSAkQXZhaWxhYmxlRmllbGRzTGlzdCA9IHsKICAgICAgICBBcnRpY2xlICAgICA9PiAnQXJ0aWNsZScsCiAgICAgICAgU3RhdGUgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFByaW9yaXR5ICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBMb2NrICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBRdWV1ZSAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgQ3VzdG9tZXJJRCAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIE93bmVyICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBQZW5kaW5nVGltZSA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpdGxlICAgICAgID0+ICdUaXRsZScsCiAgICB9OwoKICAgICMgYWRkIHNlcnZpY2UgYW5kIFNMQSBmaWVsZHMsIGlmIG9wdGlvbiBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRBdmFpbGFibGVGaWVsZHNMaXN0LT57U2VydmljZX0gPSAnU2VydmljZUlEJzsKICAgICAgICAkQXZhaWxhYmxlRmllbGRzTGlzdC0+e1NMQX0gICAgID0gJ1NMQUlEJzsKICAgIH0KCiAgICAjIGFkZCB0aWNrZXQgdHlwZSBmaWVsZCwgaWYgb3B0aW9uIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJEF2YWlsYWJsZUZpZWxkc0xpc3QtPntUeXBlfSA9ICdUeXBlSUQnOwogICAgfQoKICAgICMgYWRkIHJlc3BvbnNpYmxlIGZpZWxkLCBpZiBvcHRpb24gaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZy4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgJEF2YWlsYWJsZUZpZWxkc0xpc3QtPntSZXNwb25zaWJsZX0gPSAnUmVzcG9uc2libGVJRCc7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCB2YWx1ZXMgJXskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkTmFtZTsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyBpbnRlcm5hbCBmaWVsZHMgZm9yIHByb2Nlc3MgbWFuYWdlbWVudAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGROYW1lIGVxICdQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZE5hbWUgZXEgJ1Byb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCc7CgogICAgICAgICRBdmFpbGFibGVGaWVsZHNMaXN0LT57IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSJ9ID0gJER5bmFtaWNGaWVsZE5hbWU7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBY3Rpdml0eURpYWxvZ05ldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FjdGl2aXR5RGlhbG9nTmV3JyApIHsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICdOZXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBY3Rpdml0eURpYWxvZ05ld0FjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FjdGl2aXR5RGlhbG9nTmV3QWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgQWN0aXZpdHkgRGlhbG9nIGRhdGEKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dEYXRhOwoKICAgICAgICAjIGdldCBwYXJhbWV0ZXIgZnJvbSB3ZWIgYnJvd3NlcgogICAgICAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5fR2V0UGFyYW1zKCk7CgogICAgICAgICMgc2V0IG5ldyBjb25mZ3VyYXRpb24KICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57TmFtZX0gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRHZXRQYXJhbS0+e05hbWV9OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntFbnRpdHlJRH0gICAgICAgICAgICAgICAgICAgICAgID0gJEdldFBhcmFtLT57RW50aXR5SUR9OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfSAgICAgICAgICAgID0gJEdldFBhcmFtLT57SW50ZXJmYWNlfTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0Rlc2NyaXB0aW9uU2hvcnR9ICAgICA9ICRHZXRQYXJhbS0+e0Rlc2NyaXB0aW9uU2hvcnR9OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RGVzY3JpcHRpb25Mb25nfSAgICAgID0gJEdldFBhcmFtLT57RGVzY3JpcHRpb25Mb25nfTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICAgICAgICAgICA9ICRHZXRQYXJhbS0+e1Blcm1pc3Npb259OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSAgICAgICAgID0gJEdldFBhcmFtLT57UmVxdWlyZWRMb2NrfSB8fCAwOwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57U3VibWl0QWR2aWNlVGV4dH0gICAgID0gJEdldFBhcmFtLT57U3VibWl0QWR2aWNlVGV4dH07CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntTdWJtaXRCdXR0b25UZXh0fSAgICAgPSAkR2V0UGFyYW0tPntTdWJtaXRCdXR0b25UZXh0fTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0lucHV0RmllbGREZWZpbml0aW9ufSA9ICRHZXRQYXJhbS0+e0lucHV0RmllbGREZWZpbml0aW9ufTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0RpcmVjdFN1Ym1pdH0gICAgICAgICA9ICRHZXRQYXJhbS0+e0RpcmVjdFN1Ym1pdH0gfHwgMDsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ZpZWxkc30gICAgICAgICAgICAgICA9IHt9OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRPcmRlcn0gICAgICAgICAgID0gW107CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkR2V0UGFyYW0tPntGaWVsZHN9ICkgKSB7CgogICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKCBAeyAkR2V0UGFyYW0tPntGaWVsZHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGROYW1lOwogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEF2YWlsYWJsZUZpZWxkc0xpc3QtPnskRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICAjIHNldCBmaWVsZHMgaGFzaAogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9LT57JEZpZWxkTmFtZX0gPSB7fTsKCiAgICAgICAgICAgICAgICAjIHNldCBmaWVsZCBvcmRlciBhcnJheQogICAgICAgICAgICAgICAgcHVzaCBAeyAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ZpZWxkT3JkZXJ9IH0sICRGaWVsZE5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGZpZWxkIGRldGFpbCBjb25maWcgdG8gZmllbGRzCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJEdldFBhcmFtLT57RmllbGREZXRhaWxzfSApICkgewogICAgICAgICAgICBGSUVMRERFVEFJTDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZERldGFpbCAoIHNvcnQga2V5cyAleyAkR2V0UGFyYW0tPntGaWVsZERldGFpbHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEREVUQUlMIGlmICEkRmllbGREZXRhaWw7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEREVUQUlMIGlmICEkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ZpZWxkc30tPnskRmllbGREZXRhaWx9OwoKICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRzfS0+eyRGaWVsZERldGFpbH0gPSAkR2V0UGFyYW0tPntGaWVsZERldGFpbHN9LT57JEZpZWxkRGV0YWlsfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY29ycmVjdCBJbnRlcmZhY2UgdmFsdWUKICAgICAgICBteSAlSW50ZXJmYWNlcyA9ICgKICAgICAgICAgICAgQWdlbnRJbnRlcmZhY2UgICAgPT4gWydBZ2VudEludGVyZmFjZSddLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiBbJ0N1c3RvbWVySW50ZXJmYWNlJ10sCiAgICAgICAgICAgIEJvdGhJbnRlcmZhY2VzICAgID0+IFsgJ0FnZW50SW50ZXJmYWNlJywgJ0N1c3RvbWVySW50ZXJmYWNlJyBdLAogICAgICAgICk7CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9ID0gJEludGVyZmFjZXN7ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfSB9OwoKICAgICAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gKSB7CiAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfSA9ICRJbnRlcmZhY2Vze0FnZW50fTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1ldGVycwogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBpZiAoICEkR2V0UGFyYW0tPntOYW1lfSApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3J7TmFtZVNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3J7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPSBUcmFuc2xhdGFibGUoJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRHZXRQYXJhbS0+e0Rlc2NyaXB0aW9uU2hvcnR9ICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcntEZXNjcmlwdGlvblNob3J0U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9ye0RlY3JpcHRpb25TaG9ydEVycm9yTWVzc2FnZX0gPSBUcmFuc2xhdGFibGUoJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgcGVybWlzc2lvbiBleGlzdHMKICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFtLT57UGVybWlzc2lvbn0gJiYgJEdldFBhcmFtLT57UGVybWlzc2lvbn0gbmUgJycgKSB7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uTGlzdCA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpQZXJtaXNzaW9uJyk7CgogICAgICAgICAgICBteSAlUGVybWlzc2lvbkxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyRQZXJtaXNzaW9uTGlzdH07CgogICAgICAgICAgICBpZiAoICEkUGVybWlzc2lvbkxvb2t1cHsgJEdldFBhcmFtLT57UGVybWlzc2lvbn0gfSApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgZXJyb3IgY2xhc3MKICAgICAgICAgICAgICAgICRFcnJvcntQZXJtaXNzaW9uU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiByZXF1aXJlZCBsb2NrIGV4aXN0cwogICAgICAgIGlmICggJEdldFBhcmFtLT57UmVxdWlyZWRMb2NrfSAmJiAkR2V0UGFyYW0tPntSZXF1aXJlZExvY2t9IG5lIDEgKSB7CgogICAgICAgICAgICAjIGFkZCBzZXJ2ZXIgZXJyb3IgZXJyb3IgY2xhc3MKICAgICAgICAgICAgJEVycm9ye1JlcXVpcmVkTG9ja1NlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJldHVybiB0byBlZGl0IHNjcmVlbgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXQoCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0RhdGEgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICA9PiAnTmV3JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgZW50aXR5IElECiAgICAgICAgbXkgJEVudGl0eUlEID0gJEVudGl0eU9iamVjdC0+RW50aXR5SURHZW5lcmF0ZSgKICAgICAgICAgICAgRW50aXR5VHlwZSA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgY2FuJ3QgZ2VuZXJhdGUgYSBuZXcgRW50aXR5SUQKICAgICAgICBpZiAoICEkRW50aXR5SUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCJUaGVyZSB3YXMgYW4gZXJyb3IgZ2VuZXJhdGluZyBhIG5ldyBFbnRpdHlJRCBmb3IgdGhpcyBBY3Rpdml0eURpYWxvZyIpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2Ugc2F2ZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gcHJvY2VzcyBzY3JlZW4KICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dJRCA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dBZGQoCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntOYW1lfSwKICAgICAgICAgICAgRW50aXR5SUQgPT4gJEVudGl0eUlELAogICAgICAgICAgICBDb25maWcgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBpZiBjYW4ndCBjcmVhdGUKICAgICAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoIlRoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgQWN0aXZpdHlEaWFsb2ciKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGVudGl0eSBzeW5jIHN0YXRlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRW50aXR5T2JqZWN0LT5FbnRpdHlTeW5jU3RhdGVTZXQoCiAgICAgICAgICAgIEVudGl0eVR5cGUgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgRW50aXR5SUQgICA9PiAkRW50aXR5SUQsCiAgICAgICAgICAgIFN5bmNTdGF0ZSAgPT4gJ25vdF9zeW5jJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIGlmIGNhbid0IHNldAogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGhlcmUgd2FzIGFuIGVycm9yIHNldHRpbmcgdGhlIGVudGl0eSBzeW5jIHN0YXR1cyBmb3IgQWN0aXZpdHlEaWFsb2cgZW50aXR5OiAlcycsCiAgICAgICAgICAgICAgICAgICAgJEVudGl0eUlECiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgdGhpcyBzY3JlZW4gZnJvbSBzZXNzaW9uIHNjcmVlbiBwYXRoCiAgICAgICAgJFNlbGYtPl9Qb3BTZXNzaW9uU2NyZWVuKCBPbmx5Q3VycmVudCA9PiAxICk7CgogICAgICAgIG15ICRSZWRpcmVjdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQb3B1cFJlZGlyZWN0JyApIHx8ICcnOwoKICAgICAgICAjIGdldCBsYXRlc3QgY29uZmlnIGRhdGEgdG8gc2VuZCBpdCBiYWNrIHRvIG1haW4gd2luZG93CiAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nQ29uZmlnID0gJFNlbGYtPl9HZXRBY3Rpdml0eURpYWxvZ0NvbmZpZygKICAgICAgICAgICAgRW50aXR5SUQgPT4gJEVudGl0eUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZGVkIHRvIG9wZW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgcG9wdXAgc2hvdWxkIGdvIGJhY2sKICAgICAgICBpZiAoICRSZWRpcmVjdCAmJiAkUmVkaXJlY3QgZXEgJzEnICkgewoKICAgICAgICAgICAgJFNlbGYtPl9QdXNoU2Vzc2lvblNjcmVlbigKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2dJRCwKICAgICAgICAgICAgICAgIEVudGl0eUlEICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9LAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBY3Rpdml0eURpYWxvZ0VkaXQnICAgICAgICAgICAgICAgIyBhbHdheXMgdXNlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUmVkaXJlY3RGaWVsZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQb3B1cFJlZGlyZWN0SUQnICkgfHwgJyc7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFub3RoZXIgcG9wdXAgd2luZG93CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1BvcHVwUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBSZWRpcmVjdCA9PiAxLAogICAgICAgICAgICAgICAgU2NyZWVuICAgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0ZpZWxkRWRpdCcsCiAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgID0+ICRSZWRpcmVjdEZpZWxkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxhc3Qgc2NyZWVuCiAgICAgICAgICAgIG15ICRMYXN0U2NyZWVuID0gJFNlbGYtPl9Qb3BTZXNzaW9uU2NyZWVuKCk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIG5lZWRlZCB0byByZXR1cm4gdG8gbWFpbiBzY3JlZW4gb3IgdG8gYmUgcmVkaXJlY3RlZCB0byBsYXN0IHNjcmVlbgogICAgICAgICAgICBpZiAoICRMYXN0U2NyZWVuLT57QWN0aW9ufSBlcSAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudCcgKSB7CgogICAgICAgICAgICAgICAgIyBjbG9zZSB0aGUgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1BvcHVwUmVzcG9uc2UoCiAgICAgICAgICAgICAgICAgICAgQ2xvc2VQb3B1cCA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGxhc3Qgc2NyZWVuCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9Qb3B1cFJlc3BvbnNlKAogICAgICAgICAgICAgICAgICAgIFJlZGlyZWN0ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTY3JlZW4gICAgID0+ICRMYXN0U2NyZWVuLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFjdGl2aXR5RGlhbG9nRWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FjdGl2aXR5RGlhbG9nRWRpdCcgKSB7CgogICAgICAgICMgY2hlY2sgZm9yIEFjdGl2aXR5RGlhbG9nSUQKICAgICAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoIk5lZWQgQWN0aXZpdHlEaWFsb2dJRCEiKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHRoaXMgc2NyZWVuIGZyb20gc2Vzc2lvbiBzY3JlZW4gcGF0aAogICAgICAgICRTZWxmLT5fUG9wU2Vzc2lvblNjcmVlbiggT25seUN1cnJlbnQgPT4gMSApOwoKICAgICAgICAjIGdldCBBY3Rpdml0eSBEaWFsb2cgZGF0YQogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0RhdGEgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEFjdGl2aXR5RGlhbG9nSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgdmFsaWQgQWN0aXZpdHkgRGlhbG9nIGRhdGEKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2dEYXRhKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBnZXQgZGF0YSBmb3IgQWN0aXZpdHlEaWFsb2dJRCAlcycsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nSUQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93RWRpdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0lEICAgPT4gJEFjdGl2aXR5RGlhbG9nSUQsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRGF0YSA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgPT4gJ0VkaXQnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBY3R2aXR5RGlhbG9nRWRpdEFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FjdGl2aXR5RGlhbG9nRWRpdEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IEFjdGl2aXR5IERpYWxvZyBEYXRhCiAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1ldGVyIGZyb20gd2ViIGJyb3dzZXIKICAgICAgICBteSAkR2V0UGFyYW0gPSAkU2VsZi0+X0dldFBhcmFtcygpOwoKICAgICAgICAjIHNldCBuZXcgY29uZmd1cmF0aW9uCiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkR2V0UGFyYW0tPntOYW1lfTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9ICAgICAgICAgICAgICAgICAgICAgICA9ICRHZXRQYXJhbS0+e0VudGl0eUlEfTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gICAgICAgICAgICA9ICRHZXRQYXJhbS0+e0ludGVyZmFjZX07CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntEZXNjcmlwdGlvblNob3J0fSAgICAgPSAkR2V0UGFyYW0tPntEZXNjcmlwdGlvblNob3J0fTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0Rlc2NyaXB0aW9uTG9uZ30gICAgICA9ICRHZXRQYXJhbS0+e0Rlc2NyaXB0aW9uTG9uZ307CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSAgICAgICAgICAgPSAkR2V0UGFyYW0tPntQZXJtaXNzaW9ufTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gICAgICAgICA9ICRHZXRQYXJhbS0+e1JlcXVpcmVkTG9ja30gfHwgMDsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e1N1Ym1pdEFkdmljZVRleHR9ICAgICA9ICRHZXRQYXJhbS0+e1N1Ym1pdEFkdmljZVRleHR9OwogICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57U3VibWl0QnV0dG9uVGV4dH0gICAgID0gJEdldFBhcmFtLT57U3VibWl0QnV0dG9uVGV4dH07CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnB1dEZpZWxkRGVmaW5pdGlvbn0gPSAkR2V0UGFyYW0tPntJbnB1dEZpZWxkRGVmaW5pdGlvbn07CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntEaXJlY3RTdWJtaXR9ICAgICAgICAgPSAkR2V0UGFyYW0tPntEaXJlY3RTdWJtaXR9IHx8IDA7CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9ICAgICAgICAgICAgICAgPSB7fTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ZpZWxkT3JkZXJ9ICAgICAgICAgICA9IFtdOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEdldFBhcmFtLT57RmllbGRzfSApICkgewoKICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lICggQHsgJEdldFBhcmFtLT57RmllbGRzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZpZWxkTmFtZTsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRBdmFpbGFibGVGaWVsZHNMaXN0LT57JEZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgIyBzZXQgZmllbGRzIGhhc2gKICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRzfS0+eyRGaWVsZE5hbWV9ID0ge307CgogICAgICAgICAgICAgICAgIyBzZXQgZmllbGQgb3JkZXIgYXJyYXkKICAgICAgICAgICAgICAgIHB1c2ggQHsgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZE9yZGVyfSB9LCAkRmllbGROYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBmaWVsZCBkZXRhaWwgY29uZmlnIHRvIGZpZWxkcwogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRHZXRQYXJhbS0+e0ZpZWxkRGV0YWlsc30gKSApIHsKICAgICAgICAgICAgRklFTERERVRBSUw6CiAgICAgICAgICAgIGZvciBteSAkRmllbGREZXRhaWwgKCBzb3J0IGtleXMgJXsgJEdldFBhcmFtLT57RmllbGREZXRhaWxzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUVMRERFVEFJTCBpZiAhJEZpZWxkRGV0YWlsOwogICAgICAgICAgICAgICAgbmV4dCBGSUVMRERFVEFJTCBpZiAhJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9LT57JEZpZWxkRGV0YWlsfTsKCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ZpZWxkc30tPnskRmllbGREZXRhaWx9ID0gJEdldFBhcmFtLT57RmllbGREZXRhaWxzfS0+eyRGaWVsZERldGFpbH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBmaWVsZHMgaW4gY2FzZSB0aGV5IGRvbid0IGhhdmUgZGV0YWlscwogICAgICAgIGZvciBteSAkRmllbGROYW1lICggc29ydCBrZXlzICV7ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRzfSB9ICkgewogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9LT57JEZpZWxkTmFtZX0gKSApIHsKICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRzfS0+eyRGaWVsZE5hbWV9LT57RGVzY3JpcHRpb25TaG9ydH0gPSAkRmllbGROYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjb3JyZWN0IEludGVyZmFjZSB2YWx1ZQogICAgICAgIG15ICVJbnRlcmZhY2VzID0gKAogICAgICAgICAgICBBZ2VudEludGVyZmFjZSAgICA9PiBbJ0FnZW50SW50ZXJmYWNlJ10sCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0+IFsnQ3VzdG9tZXJJbnRlcmZhY2UnXSwKICAgICAgICAgICAgQm90aEludGVyZmFjZXMgICAgPT4gWyAnQWdlbnRJbnRlcmZhY2UnLCAnQ3VzdG9tZXJJbnRlcmZhY2UnIF0sCiAgICAgICAgKTsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gPSAkSW50ZXJmYWNlc3sgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9IH07CgogICAgICAgIGlmICggISRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfSApIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9ID0gJEludGVyZmFjZXN7QWdlbnR9OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICBpZiAoICEkR2V0UGFyYW0tPntOYW1lfSApIHsKCiAgICAgICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBlcnJvciBjbGFzcwogICAgICAgICAgICAkRXJyb3J7TmFtZVNlcnZlckVycm9yfSAgICAgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3J7TmFtZVNlcnZlckVycm9yTWVzc2FnZX0gPSBUcmFuc2xhdGFibGUoJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRHZXRQYXJhbS0+e0Rlc2NyaXB0aW9uU2hvcnR9ICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcntEZXNjcmlwdGlvblNob3J0U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9ye0RlY3JpcHRpb25TaG9ydEVycm9yTWVzc2FnZX0gPSBUcmFuc2xhdGFibGUoJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgcGVybWlzc2lvbiBleGlzdHMKICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFtLT57UGVybWlzc2lvbn0gJiYgJEdldFBhcmFtLT57UGVybWlzc2lvbn0gbmUgJycgKSB7CgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkxpc3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbTo6UGVybWlzc2lvbicpOwoKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25Mb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQHskUGVybWlzc2lvbkxpc3R9OwoKICAgICAgICAgICAgaWYgKCAhJFBlcm1pc3Npb25Mb29rdXB7ICRHZXRQYXJhbS0+e1Blcm1pc3Npb259IH0gKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICAgICAkRXJyb3J7UGVybWlzc2lvblNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgcmVxdWlyZWQgbG9jayBleGlzdHMKICAgICAgICBpZiAoICRHZXRQYXJhbS0+e1JlcXVpcmVkTG9ja30gJiYgJEdldFBhcmFtLT57UmVxdWlyZWRMb2NrfSBuZSAxICkgewoKICAgICAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIGVycm9yIGNsYXNzCiAgICAgICAgICAgICRFcnJvcntSZXF1aXJlZExvY2tTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBpcyBhbiBlcnJvciByZXR1cm4gdG8gZWRpdCBzY3JlZW4KICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dFZGl0KAogICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dEYXRhID0+ICRBY3Rpdml0eURpYWxvZ0RhdGEsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgPT4gJ0VkaXQnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2Ugc2F2ZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdG8gb3ZlcnZpZXcgc2NyZWVuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nVXBkYXRlKAogICAgICAgICAgICBJRCAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2dJRCwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9LAogICAgICAgICAgICBFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9LAogICAgICAgICAgICBDb25maWcgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBpZiBjYW4ndCB1cGRhdGUKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoIlRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgQWN0aXZpdHlEaWFsb2ciKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGVudGl0eSBzeW5jIHN0YXRlCiAgICAgICAgJFN1Y2Nlc3MgPSAkRW50aXR5T2JqZWN0LT5FbnRpdHlTeW5jU3RhdGVTZXQoCiAgICAgICAgICAgIEVudGl0eVR5cGUgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgRW50aXR5SUQgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9LAogICAgICAgICAgICBTeW5jU3RhdGUgID0+ICdub3Rfc3luYycsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBpZiBjYW4ndCBzZXQKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZXJlIHdhcyBhbiBlcnJvciBzZXR0aW5nIHRoZSBlbnRpdHkgc3luYyBzdGF0dXMgZm9yIEFjdGl2aXR5RGlhbG9nIGVudGl0eTogJXMnLAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntFbnRpdHlJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSB0aGlzIHNjcmVlbiBmcm9tIHNlc3Npb24gc2NyZWVuIHBhdGgKICAgICAgICAkU2VsZi0+X1BvcFNlc3Npb25TY3JlZW4oIE9ubHlDdXJyZW50ID0+IDEgKTsKCiAgICAgICAgbXkgJFJlZGlyZWN0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BvcHVwUmVkaXJlY3QnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGxhdGVzdCBjb25maWcgZGF0YSB0byBzZW5kIGl0IGJhY2sgdG8gbWFpbiB3aW5kb3cKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dDb25maWcgPSAkU2VsZi0+X0dldEFjdGl2aXR5RGlhbG9nQ29uZmlnKAogICAgICAgICAgICBFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZGVkIHRvIG9wZW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgcG9wdXAgc2hvdWxkIGdvIGJhY2sKICAgICAgICBpZiAoICRSZWRpcmVjdCAmJiAkUmVkaXJlY3QgZXEgJzEnICkgewoKICAgICAgICAgICAgJFNlbGYtPl9QdXNoU2Vzc2lvblNjcmVlbigKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2dJRCwKICAgICAgICAgICAgICAgIEVudGl0eUlEICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RW50aXR5SUR9LAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBY3Rpdml0eURpYWxvZ0VkaXQnICAgICAgICAgICAgICAgIyBhbHdheXMgdXNlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUmVkaXJlY3RGaWVsZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQb3B1cFJlZGlyZWN0SUQnICkgfHwgJyc7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFub3RoZXIgcG9wdXAgd2luZG93CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1BvcHVwUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBSZWRpcmVjdCA9PiAxLAogICAgICAgICAgICAgICAgU2NyZWVuICAgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0ZpZWxkRWRpdCcsCiAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgID0+ICRSZWRpcmVjdEZpZWxkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxhc3Qgc2NyZWVuCiAgICAgICAgICAgIG15ICRMYXN0U2NyZWVuID0gJFNlbGYtPl9Qb3BTZXNzaW9uU2NyZWVuKCk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIG5lZWRlZCB0byByZXR1cm4gdG8gbWFpbiBzY3JlZW4gb3IgdG8gYmUgcmVkaXJlY3RlZCB0byBsYXN0IHNjcmVlbgogICAgICAgICAgICBpZiAoICRMYXN0U2NyZWVuLT57QWN0aW9ufSBlcSAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudCcgKSB7CgogICAgICAgICAgICAgICAgIyBjbG9zZSB0aGUgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1BvcHVwUmVzcG9uc2UoCiAgICAgICAgICAgICAgICAgICAgQ2xvc2VQb3B1cCA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGxhc3Qgc2NyZWVuCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9Qb3B1cFJlc3BvbnNlKAogICAgICAgICAgICAgICAgICAgIFJlZGlyZWN0ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTY3JlZW4gICAgID0+ICRMYXN0U2NyZWVuLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0pTT04gPT4gJEFjdGl2aXR5RGlhbG9nQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENsb3NlIHBvcHVwCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2xvc2VQb3B1cCcgKSB7CgogICAgICAgICMgY2xvc2UgdGhlIHBvcHVwCiAgICAgICAgcmV0dXJuICRTZWxmLT5fUG9wdXBSZXNwb25zZSgKICAgICAgICAgICAgQ2xvc2VQb3B1cCA9PiAxLAogICAgICAgICAgICBDb25maWdKU09OID0+ICcnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBFcnJvcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgiVGhpcyBzdWJhY3Rpb24gaXMgbm90IHZhbGlkIiksCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXRBY3Rpdml0eURpYWxvZ0NvbmZpZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IG5ldyBBY3Rpdml0eURpYWxvZyBDb25maWcgYXMgSlNPTgogICAgbXkgJFByb2Nlc3NEdW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpEQjo6UHJvY2VzcycpLT5Qcm9jZXNzRHVtcCgKICAgICAgICBSZXN1bHRUeXBlID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjdGl2aXR5RGlhbG9nQ29uZmlnOwogICAgJEFjdGl2aXR5RGlhbG9nQ29uZmlne0FjdGl2aXR5RGlhbG9nfSA9ICgpOwogICAgJEFjdGl2aXR5RGlhbG9nQ29uZmlne0FjdGl2aXR5RGlhbG9nfS0+eyAkUGFyYW17RW50aXR5SUR9IH0gPSAkUHJvY2Vzc0R1bXAtPntBY3Rpdml0eURpYWxvZ30tPnsgJFBhcmFte0VudGl0eUlEfSB9OwoKICAgIHJldHVybiBcJUFjdGl2aXR5RGlhbG9nQ29uZmlnOwp9CgpzdWIgX1Nob3dFZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgQWN0aXZpdHkgRGlhbG9nIGluZm9ybWF0aW9uCiAgICBteSAkQWN0aXZpdHlEaWFsb2dEYXRhID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRGF0YX0gfHwge307CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIGxhc3Qgc2NyZWVuIGFjdGlvbiBpcyBtYWluIHNjcmVlbgogICAgaWYgKCAkU2VsZi0+e1NjcmVlbnNQYXRofS0+Wy0xXS0+e0FjdGlvbn0gZXEgJ0FkbWluUHJvY2Vzc01hbmFnZW1lbnQnICkgewoKICAgICAgICAjIHNob3cgY2xvc2UgcG9wdXAgbGluawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbG9zZVBvcHVwJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgc2hvdyBnbyBiYWNrIGxpbmsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnR29CYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJFNlbGYtPntTY3JlZW5zUGF0aH0tPlstMV0tPntBY3Rpb259ICAgIHx8ICcnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICRTZWxmLT57U2NyZWVuc1BhdGh9LT5bLTFdLT57U3ViYWN0aW9ufSB8fCAnJywKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkU2VsZi0+e1NjcmVlbnNQYXRofS0+Wy0xXS0+e0lEfSAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBFbnRpdHlJRCAgPT4gJFNlbGYtPntTY3JlZW5zUGF0aH0tPlstMV0tPntFbnRpdHlJRH0gIHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgYXZhaWxhYmxlIEZpZWxkcyBsaXN0CiAgICBteSAkQXZhaWxhYmxlRmllbGRzTGlzdCA9IHsKICAgICAgICBBcnRpY2xlICAgICA9PiAnQXJ0aWNsZScsCiAgICAgICAgU3RhdGUgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFByaW9yaXR5ICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBMb2NrICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBRdWV1ZSAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgQ3VzdG9tZXJJRCAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIE93bmVyICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBQZW5kaW5nVGltZSA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpdGxlICAgICAgID0+ICdUaXRsZScsCiAgICB9OwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgYWRkIHNlcnZpY2UgYW5kIFNMQSBmaWVsZHMsIGlmIG9wdGlvbiBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRBdmFpbGFibGVGaWVsZHNMaXN0LT57U2VydmljZX0gPSAnU2VydmljZUlEJzsKICAgICAgICAkQXZhaWxhYmxlRmllbGRzTGlzdC0+e1NMQX0gICAgID0gJ1NMQUlEJzsKICAgIH0KCiAgICAjIGFkZCB0aWNrZXQgdHlwZSBmaWVsZCwgaWYgb3B0aW9uIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJEF2YWlsYWJsZUZpZWxkc0xpc3QtPntUeXBlfSA9ICdUeXBlSUQnOwogICAgfQoKICAgICMgYWRkIHJlc3BvbnNpYmxlIGZpZWxkLCBpZiBvcHRpb24gaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZy4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgJEF2YWlsYWJsZUZpZWxkc0xpc3QtPntSZXNwb25zaWJsZX0gPSAnUmVzcG9uc2libGVJRCc7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCB2YWx1ZXMgJXskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkTmFtZTsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyBpbnRlcm5hbCBmaWVsZHMgZm9yIHByb2Nlc3MgbWFuYWdlbWVudAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGROYW1lIGVxICdQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZE5hbWUgZXEgJ1Byb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCc7CgogICAgICAgICRBdmFpbGFibGVGaWVsZHNMaXN0LT57IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSJ9ID0gJER5bmFtaWNGaWVsZE5hbWU7CiAgICB9CgogICAgIyBsb2NhbGl6ZSBhdmFpbGFibGUgZmllbGRzCiAgICBteSAlQXZhaWxhYmxlRmllbGRzID0gJXskQXZhaWxhYmxlRmllbGRzTGlzdH07CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtBY3Rpb259ICYmICRQYXJhbXtBY3Rpb259IGVxICdFZGl0JyApIHsKCiAgICAgICAgIyBnZXQgdXNlZCBmaWVsZHMgYnkgdGhlIGFjdGl2aXR5IGRpYWxvZwogICAgICAgIG15ICVBc3NpZ25lZEZpZWxkczsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9ICkgKSB7CiAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICV7ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57RmllbGRzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZpZWxkOwogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICAgICAkQXNzaWduZWRGaWVsZHN7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHVzZWQgZmllbGRzIGZyb20gYXZhaWxhYmxlIGxpc3QKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBc3NpZ25lZEZpZWxkcyApIHsKICAgICAgICAgICAgZGVsZXRlICRBdmFpbGFibGVGaWVsZHN7JEZpZWxkfTsKICAgICAgICB9CgogICAgICAgICMgc29ydCBieSB0cmFuc2xhdGVkIGZpZWxkIG5hbWVzCiAgICAgICAgbXkgJUF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWQ7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQXZhaWxhYmxlRmllbGRzICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRpb24gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEZpZWxkKTsKICAgICAgICAgICAgJEF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWR7JEZpZWxkfSA9ICRUcmFuc2xhdGlvbjsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBhdmFpbGFibGUgZmllbGRzCiAgICAgICAgZm9yIG15ICRGaWVsZCAoCiAgICAgICAgICAgIHNvcnQgeyAkQXZhaWxhYmxlRmllbGRzVHJhbnNsYXRlZHskYX0gY21wICRBdmFpbGFibGVGaWVsZHNUcmFuc2xhdGVkeyRifSB9CiAgICAgICAgICAgIGtleXMgJUF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdmFpbGFibGVGaWVsZFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGaWVsZCAgICAgICAgICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICBGaWVsZG5hbWVUcmFuc2xhdGVkID0+ICRBdmFpbGFibGVGaWVsZHNUcmFuc2xhdGVkeyRGaWVsZH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IHVzZWQgZmllbGRzCiAgICAgICAgQVNTSUdORURGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZE9yZGVyfSB9ICkgewogICAgICAgICAgICBuZXh0IEFTU0lHTkVERklFTEQgaWYgISRBc3NpZ25lZEZpZWxkc3skRmllbGR9OwoKICAgICAgICAgICAgbXkgJEZpZWxkQ29uZmlnID0gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntGaWVsZHN9LT57JEZpZWxkfTsKCiAgICAgICAgICAgIG15ICRGaWVsZENvbmZpZ0pTT04gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXNzaWduZWRGaWVsZFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGaWVsZCAgICAgICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWcgPT4gJEZpZWxkQ29uZmlnSlNPTiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgb3RoZXIgYWZmZWN0ZWQgcHJvY2Vzc2VzIGJ5IGVkaXRpbmcgdGhpcyBhY3Rpdml0eSAoaWYgYXBwbGljYWJsZSkKICAgICAgICBteSAkQWZmZWN0ZWRBY3Rpdml0aWVzID0gJFNlbGYtPl9DaGVja0FjdGl2aXR5RGlhbG9nVXNhZ2UoCiAgICAgICAgICAgIEVudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBAeyRBZmZlY3RlZEFjdGl2aXRpZXN9ICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFZGl0V2FybmluZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUxpc3QgPT4gam9pbiggJywgJywgQHskQWZmZWN0ZWRBY3Rpdml0aWVzfSApLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJ0VkaXQgQWN0aXZpdHkgRGlhbG9nICIlcyInLAogICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57TmFtZX0KICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgc29ydCBieSB0cmFuc2xhdGVkIGZpZWxkIG5hbWVzCiAgICAgICAgbXkgJUF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWQ7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQXZhaWxhYmxlRmllbGRzICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRpb24gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEZpZWxkKTsKICAgICAgICAgICAgJEF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWR7JEZpZWxkfSA9ICRUcmFuc2xhdGlvbjsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBhdmFpbGFibGUgZmllbGRzCiAgICAgICAgZm9yIG15ICRGaWVsZCAoCiAgICAgICAgICAgIHNvcnQgeyAkQXZhaWxhYmxlRmllbGRzVHJhbnNsYXRlZHskYX0gY21wICRBdmFpbGFibGVGaWVsZHNUcmFuc2xhdGVkeyRifSB9CiAgICAgICAgICAgIGtleXMgJUF2YWlsYWJsZUZpZWxkc1RyYW5zbGF0ZWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdmFpbGFibGVGaWVsZFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGaWVsZCAgICAgICAgICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICBGaWVsZG5hbWVUcmFuc2xhdGVkID0+ICRBdmFpbGFibGVGaWVsZHNUcmFuc2xhdGVkeyRGaWVsZH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RpdGxlfSA9IFRyYW5zbGF0YWJsZSgnQ3JlYXRlIE5ldyBBY3Rpdml0eSBEaWFsb2cnKTsKICAgIH0KCiAgICAjIGdldCBpbnRlcmZhY2UgaW5mb3MKICAgIGlmICggZGVmaW5lZCAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gKSB7CiAgICAgICAgbXkgJEludGVyZmFjZUxlbmd0aCA9IHNjYWxhciBAeyAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gfTsKICAgICAgICBpZiAoICRJbnRlcmZhY2VMZW5ndGggPT0gMiApIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9ID0gJ0JvdGhJbnRlcmZhY2VzJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSW50ZXJmYWNlTGVuZ3RoID09IDEgKSB7CiAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfSA9ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntDb25maWd9LT57SW50ZXJmYWNlfS0+WzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9ID0gJ0FnZW50SW50ZXJmYWNlJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e0ludGVyZmFjZX0gPSAnQWdlbnRJbnRlcmZhY2UnOwogICAgfQoKICAgICMgY3JlYXRlIGludGVyZmFjZSBzZWxlY3Rpb24KICAgICRQYXJhbXtJbnRlcmZhY2VTZWxlY3Rpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEFnZW50SW50ZXJmYWNlICAgID0+IFRyYW5zbGF0YWJsZSgnQWdlbnQgSW50ZXJmYWNlJyksCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgSW50ZXJmYWNlJyksCiAgICAgICAgICAgIEJvdGhJbnRlcmZhY2VzICAgID0+IFRyYW5zbGF0YWJsZSgnQWdlbnQgYW5kIEN1c3RvbWVyIEludGVyZmFjZScpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdJbnRlcmZhY2UnLAogICAgICAgIElEICAgICAgICAgICA9PiAnSW50ZXJmYWNlJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0NvbmZpZ30tPntJbnRlcmZhY2V9IHx8ICcnLAogICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljS2V5JywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3JlYXRlIHBlcm1pc3Npb24gc2VsZWN0aW9uCiAgICAkUGFyYW17UGVybWlzc2lvblNlbGVjdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTeXN0ZW06OlBlcm1pc3Npb24nKSB8fCBbJ3J3J10sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQZXJtaXNzaW9uJywKICAgICAgICBJRCAgICAgICAgICAgPT4gJ1Blcm1pc3Npb24nLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHx8ICcnLAogICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljS2V5JywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScgLiAoICRQYXJhbXtQZXJtaXNzaW9uU2VydmVyRXJyb3J9IHx8ICcnICksCiAgICApOwoKICAgICMgY3JlYXRlICJyZXF1aXJlZCBsb2NrIiBzZWxlY3Rpb24KICAgICRQYXJhbXtSZXF1aXJlZExvY2tTZWxlY3Rpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIDAgPT4gVHJhbnNsYXRhYmxlKCdObycpLAogICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgICA9PiAnUmVxdWlyZWRMb2NrJywKICAgICAgICBJRCAgICAgICAgICA9PiAnUmVxdWlyZWRMb2NrJywKICAgICAgICBTZWxlY3RlZElEICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gfHwgMCwKICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljS2V5JywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte1JlcXVpcmVkTG9ja1NlcnZlckVycm9yfSB8fCAnJyApLAogICAgKTsKCiAgICAjIGNyZWF0ZSBEaXNwbGF5IHNlbGVjdGlvbgogICAgJFBhcmFte0Rpc3BsYXlTZWxlY3Rpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIDAgPT4gVHJhbnNsYXRhYmxlKCdEbyBub3Qgc2hvdyBGaWVsZCcpLAogICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnU2hvdyBGaWVsZCcpLAogICAgICAgICAgICAyID0+IFRyYW5zbGF0YWJsZSgnU2hvdyBGaWVsZCBBcyBNYW5kYXRvcnknKSwKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgID0+ICdEaXNwbGF5JywKICAgICAgICBJRCAgICAgICAgICA9PiAnRGlzcGxheScsCiAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY0tleScsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgQENoYW5uZWxMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbW11bmljYXRpb25DaGFubmVsJyktPkNoYW5uZWxMaXN0KCk7CgogICAgIyBBbGxvdyBvbmx5IEludGVybmFsIGFuZCBQaG9uZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLCB0aGlzIGhhcyB0byBiZSBoYXJkIGNvZGVkIGF0IHRoZSBtb21lbnQuCiAgICBteSAlQ2hhbm5lbHMgPSBtYXAgeyAkXy0+e0NoYW5uZWxOYW1lfSA9PiAkXy0+e0Rpc3BsYXlOYW1lfSB9CiAgICAgICAgZ3JlcCB7ICRfLT57Q2hhbm5lbE5hbWV9IGVxICdJbnRlcm5hbCcgfHwgJF8tPntDaGFubmVsTmFtZX0gZXEgJ1Bob25lJyB9CiAgICAgICAgQENoYW5uZWxMaXN0OwoKICAgICMgY3JlYXRlIENvbW11bmljYXRpb24gQ2hhbm5lbCBzZWxlY3Rpb24gKCkKICAgICRQYXJhbXtDb21tdW5pY2F0aW9uQ2hhbm5lbFNlbGVjdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQ2hhbm5lbHMsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAnSW50ZXJuYWwnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0NvbW11bmljYXRpb25DaGFubmVsJywKICAgICAgICBJRCAgICAgICAgICAgID0+ICdDb21tdW5pY2F0aW9uQ2hhbm5lbCcsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnQWxwaGFudW1lcmljJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgJVRpbWVVbml0c1NlbGVjdGlvbkxpc3QgPSAoCiAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ0RvIG5vdCBzaG93IEZpZWxkJyksCiAgICAgICAgMiA9PiBUcmFuc2xhdGFibGUoJ1Nob3cgRmllbGQgQXMgTWFuZGF0b3J5JyksCiAgICApOwoKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAkVGltZVVuaXRzU2VsZWN0aW9uTGlzdHsxfSA9ICdTaG93IEZpZWxkJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBUaW1lVW5pdHMgc2VsZWN0aW9uCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKCiAgICAgICAgJFBhcmFte1RpbWVVbml0c1NlbGVjdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVRpbWVVbml0c1NlbGVjdGlvbkxpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgSUQgICAgICAgICAgICA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNDb250YWluZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyJywKICAgICk7CgojIEVPIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICMgZXh0cmFjdCBwYXJhbWV0ZXJzIGZyb20gY29uZmlnCiAgICAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gICAgID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRGF0YX0tPntDb25maWd9LT57RGVzY3JpcHRpb25TaG9ydH07CiAgICAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSAgICAgID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRGF0YX0tPntDb25maWd9LT57RGVzY3JpcHRpb25Mb25nfTsKICAgICRQYXJhbXtTdWJtaXRBZHZpY2VUZXh0fSAgICAgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dEYXRhfS0+e0NvbmZpZ30tPntTdWJtaXRBZHZpY2VUZXh0fTsKICAgICRQYXJhbXtTdWJtaXRCdXR0b25UZXh0fSAgICAgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dEYXRhfS0+e0NvbmZpZ30tPntTdWJtaXRCdXR0b25UZXh0fTsKICAgICRQYXJhbXtJbnB1dEZpZWxkRGVmaW5pdGlvbn0gPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dEYXRhfS0+e0NvbmZpZ30tPntJbnB1dEZpZWxkRGVmaW5pdGlvbn07CiAgICAkUGFyYW17RGlyZWN0U3VibWl0fSAgICAgICAgID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRGF0YX0tPntDb25maWd9LT57RGlyZWN0U3VibWl0fSA/ICcgY2hlY2tlZCcgOiAnJzsKCiAgICAjIEFkZCBjb2RlIG1pcnJvciBsYW5ndWFnZSBtb2RlLgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFZGl0b3JMYW5ndWFnZU1vZGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAndGV4dC94LXlhbWwnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJBZG1pblByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlEaWFsb2ciLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQWN0aXZpdHlEaWFsb2dEYXRhfSwKICAgICAgICB9LAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRHZXRQYXJhbTsKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbWV0ZXJzIGZyb20gd2ViIGJyb3dzZXIKICAgIGZvciBteSAkUGFyYW1OYW1lICgKICAgICAgICBxdyggTmFtZSBFbnRpdHlJRCBJbnRlcmZhY2UgRGVzY3JpcHRpb25TaG9ydCBEZXNjcmlwdGlvbkxvbmcgUGVybWlzc2lvbiBSZXF1aXJlZExvY2sgU3VibWl0QWR2aWNlVGV4dAogICAgICAgIFN1Ym1pdEJ1dHRvblRleHQgSW5wdXRGaWVsZERlZmluaXRpb24gRGlyZWN0U3VibWl0ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFtLT57JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICkgfHwgJyc7CiAgICB9CgogICAgbXkgJEZpZWxkcyAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmllbGRzJyApIHx8ICcnOwogICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgIGlmICgkRmllbGRzKSB7CiAgICAgICAgJEdldFBhcmFtLT57RmllbGRzfSA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJEZpZWxkcywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEdldFBhcmFtLT57RmllbGRzfSA9ICcnOwogICAgfQoKICAgIG15ICRGaWVsZERldGFpbHMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmllbGREZXRhaWxzJyApIHx8ICcnOwoKICAgIGlmICgkRmllbGREZXRhaWxzKSB7CiAgICAgICAgJEdldFBhcmFtLT57RmllbGREZXRhaWxzfSA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJEZpZWxkRGV0YWlscywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEdldFBhcmFtLT57RmllbGREZXRhaWxzfSA9ICcnOwogICAgfQoKICAgIHJldHVybiAkR2V0UGFyYW07Cn0KCnN1YiBfUG9wU2Vzc2lvblNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXN0U2NyZWVuOwoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17T25seUN1cnJlbnR9ICYmICRQYXJhbXtPbmx5Q3VycmVudH0gPT0gMSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBsYXN0IHNjcmVlbiBhY3Rpb24gaXMgY3VycmVudCBzY3JlZW4gYWN0aW9uCiAgICAgICAgaWYgKCAkU2VsZi0+e1NjcmVlbnNQYXRofS0+Wy0xXS0+e0FjdGlvbn0gZXEgJFNlbGYtPntBY3Rpb259ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgbGFzdCBzY3JlZW4KICAgICAgICAgICAgJExhc3RTY3JlZW4gPSBwb3AgQHsgJFNlbGYtPntTY3JlZW5zUGF0aH0gfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZW1vdmUgbGFzdCBzY3JlZW4KICAgICAgICAkTGFzdFNjcmVlbiA9IHBvcCBAeyAkU2VsZi0+e1NjcmVlbnNQYXRofSB9OwogICAgfQoKICAgICMgY29udmVydCBzY3JlZW5zIHBhdGggdG8gc3RyaW5nIChKU09OKQogICAgbXkgJEpTT05TY3JlZW5zUGF0aCA9IG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSA9PiAkU2VsZi0+e1NjcmVlbnNQYXRofSwKICAgICk7CgogICAgIyB1cGRhdGUgc2Vzc2lvbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnUHJvY2Vzc01hbmFnZW1lbnRTY3JlZW5zUGF0aCcsCiAgICAgICAgVmFsdWUgICAgID0+ICRKU09OU2NyZWVuc1BhdGgsCiAgICApOwoKICAgIHJldHVybiAkTGFzdFNjcmVlbjsKfQoKc3ViIF9QdXNoU2Vzc2lvblNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIHNjcmVlbiB0byB0aGUgc2NyZWVuIHBhdGgKICAgIHB1c2ggQHsgJFNlbGYtPntTY3JlZW5zUGF0aH0gfSwgewogICAgICAgIEFjdGlvbiAgICA9PiAkU2VsZi0+e0FjdGlvbn0gfHwgJycsCiAgICAgICAgU3ViYWN0aW9uID0+ICRQYXJhbXtTdWJhY3Rpb259LAogICAgICAgIElEICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgIEVudGl0eUlEICA9PiAkUGFyYW17RW50aXR5SUR9LAogICAgfTsKCiAgICAjIGNvbnZlcnQgc2NyZWVucyBwYXRoIHRvIHN0cmluZyAoSlNPTikKICAgIG15ICRKU09OU2NyZWVuc1BhdGggPSBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gJFNlbGYtPntTY3JlZW5zUGF0aH0sCiAgICApOwoKICAgICMgdXBkYXRlIHNlc3Npb24KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50U2NyZWVuc1BhdGgnLAogICAgICAgIFZhbHVlICAgICA9PiAkSlNPTlNjcmVlbnNQYXRoLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9Qb3B1cFJlc3BvbnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBpZiAoICRQYXJhbXtSZWRpcmVjdH0gJiYgJFBhcmFte1JlZGlyZWN0fSBlcSAxICkgewoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1JlZGlyZWN0JywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSlNPTiA9PiAkUGFyYW17Q29uZmlnSlNPTn0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17U2NyZWVufSB9LAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0Nsb3NlUG9wdXB9ICYmICRQYXJhbXtDbG9zZVBvcHVwfSBlcSAxICkgewoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Nsb3NlUG9wdXAnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdKU09OID0+ICRQYXJhbXtDb25maWdKU09OfSwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIkFkbWluUHJvY2Vzc01hbmFnZW1lbnRQb3B1cFJlc3BvbnNlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0NoZWNrQWN0aXZpdHlEaWFsb2dVc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBwYXJlbnRzIHdpdGggYWxsIHRoZSBkZXRhaWxzCiAgICBteSAkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6REI6OkFjdGl2aXR5JyktPkFjdGl2aXR5TGlzdEdldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgQFVzYWdlOwoKICAgICMgc2VhcmNoIGVudGl0eSBpZCBpbiBhbGwgcGFyZW50cwogICAgUEFSRU5UOgogICAgZm9yIG15ICRQYXJlbnREYXRhICggQHskTGlzdH0gKSB7CiAgICAgICAgbmV4dCBQQVJFTlQgaWYgISRQYXJlbnREYXRhOwogICAgICAgIG5leHQgUEFSRU5UIGlmICEkUGFyZW50RGF0YS0+e0FjdGl2aXR5RGlhbG9nc307CiAgICAgICAgRU5USVRZOgogICAgICAgIGZvciBteSAkRW50aXR5SUQgKCBAeyAkUGFyZW50RGF0YS0+e0FjdGl2aXR5RGlhbG9nc30gfSApIHsKICAgICAgICAgICAgaWYgKCAkRW50aXR5SUQgZXEgJFBhcmFte0VudGl0eUlEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFVzYWdlLCAkUGFyZW50RGF0YS0+e05hbWV9OwogICAgICAgICAgICAgICAgbGFzdCBFTlRJVFk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxAVXNhZ2U7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketProcess.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5Njc1MzM4MDdmZjQ2NjRlZjFkMmJmODExNzlmY2E4OWNmYjUxYjUzIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRQcm9jZXNzLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByb2Nlc3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwp1c2UgTGlzdDo6VXRpbCBxdyhub25lKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBNYWlsOjpBZGRyZXNzICgpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MgJFNlbGYsICRUeXBlOwoKICAgICMgZ2xvYmFsIGNvbmZpZyBoYXNoIGZvciBpZCBkaXNzb2x1dGlvbgogICAgJFNlbGYtPntOYW1lVG9JRH0gPSB7CiAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBTdGF0ZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFByaW9yaXR5ICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBQcmlvcml0eUlEICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgTG9jayAgICAgICAgICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgTG9ja0lEICAgICAgICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgUXVldWUgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBDdXN0b21lciAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIEN1c3RvbWVyTm8gICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAnQ3VzdG9tZXJVc2VySUQnLAogICAgICAgIE93bmVyICAgICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBPd25lcklEICAgICAgICA9PiAnT3duZXJJRCcsCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgVHlwZUlEICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgU0xBICAgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBTTEFJRCAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNlcnZpY2UgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIFJlc3BvbnNpYmxlICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBSZXNwb25zaWJsZUlEICA9PiAnUmVzcG9uc2libGVJRCcsCiAgICAgICAgUGVuZGluZ1RpbWUgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBBcnRpY2xlICAgICAgICA9PiAnQXJ0aWNsZScsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcgKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWY7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAkU2VsZi0+e0ZpcnN0QWN0aXZpdHlEaWFsb2d9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpcnN0QWN0aXZpdHlEaWFsb2cnICk7CiAgICAkU2VsZi0+e0xpbmtUaWNrZXRJRH0gICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xpbmtUaWNrZXRJRCcgKSB8fCAnJzsKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApICAgIHx8ICcnOwoKICAgICMgZ2V0IHRoZSB0aWNrZXQgaW5mb3JtYXRpb24gb24gbGluayBhY3Rpb25zCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldElEfSApIHsKICAgICAgICBteSAlVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntMaW5rVGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEV4dGVuZGVkID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSA9IFwlVGlja2V0RGF0YTsKCiAgICAgICAgIyBzZXQgTGlua1RpY2tldElEIHBhcmFtIGZvciBzaG93aW5nIG9uIG1haW4gZm9ybQogICAgICAgICRQYXJhbXtMaW5rVGlja2V0SUR9ID0gJFNlbGYtPntMaW5rVGlja2V0SUR9OwogICAgfQoKICAgICMgZ2V0IHRoZSBhcnRpY2xlIGluZm9ybWF0aW9uIG9uIGxpbmsgYWN0aW9ucwogICAgaWYgKCAkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX0gPSBcJUFydGljbGU7CgogICAgICAgICMgc2V0IEFydGljbGVJRCBwYXJhbSBmb3Igc2hvd2luZyBvbiBtYWluIGZvcm0KICAgICAgICAkUGFyYW17QXJ0aWNsZUlEfSA9ICRTZWxmLT57QXJ0aWNsZUlEfTsKICAgIH0KCiAgICBpZiAoJFRpY2tldElEKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjb25maWd1cmVkIHJlcXVpcmVkIHBlcm1pc3Npb24KICAgICAgICAjIGZvciB0aGUgQWN0aXZpdHlEaWFsb2cgKGlmIHRoZXJlIGlzIG9uZSkKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uID0gJ3J3JzsKICAgICAgICBpZiAoJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQpIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nSGFzaFJlZiA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nSGFzaFJlZikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nUGVybWlzc2lvbiA9ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWYtPntQZXJtaXNzaW9ufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uICksCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgICAgICBpZiAoJEFDTCkgewoKICAgICAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2dIYXNoUmVmKSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgaXQncyBhbHJlYWR5IGxvY2tlZCBieSBzb21lYm9keSBlbHNlCiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1JlcXVpcmVkTG9ja30gKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTG9jayAmJiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWxvYWQgdGhlIHBhcmVudCB3aW5kb3cgdG8gc2hvdyB0aGUgdXBkYXRlZCBsb2NrIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGFyZW50UmVsb2FkfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZSBsaW5rLgogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVuZGVyTG9ja2VkfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIG5vdGlmeSB0aGUgYWdlbnQgdGhhdCB0aGUgdGlja2V0IHdhcyBsb2NrZWQKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtOb3RpZnl9IH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICIkVGlja2V0TnVtYmVyOiAiIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaWNrZXQgbG9ja2VkLiIpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQb3NzaWJsZUFjdGl2aXR5RGlhbG9ncyA9IHsgMSA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCB9OwoKICAgICAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICA9PiAkUG9zc2libGVBY3Rpdml0eURpYWxvZ3MsCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICAgICAgID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICAgICAgICAgID0+ICctJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgJXskUG9zc2libGVBY3Rpdml0eURpYWxvZ3N9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxpc3Qgb25seSBBY3RpdmUgcHJvY2Vzc2VzIGJ5IGRlZmF1bHQKICAgIG15IEBQcm9jZXNzU3RhdGVzID0gKCdBY3RpdmUnKTsKCiAgICAjIHNldCBJc01haW5XaW5kb3csIElzQWpheFJlcXVlc3QsIElzUHJvY2Vzc0Vucm9sbCBmb3IgcHJvcGVyIGVycm9yIHJlc3BvbnNlcywgc2NyZWVuIGRpc3BsYXkKICAgICMgYW5kIHByb2Nlc3MgbGlzdAogICAgJFNlbGYtPntJc01haW5XaW5kb3d9ICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lzTWFpbldpbmRvdycgKSAgICB8fCAnJzsKICAgICRTZWxmLT57SXNBamF4UmVxdWVzdH0gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJc0FqYXhSZXF1ZXN0JyApICAgfHwgJyc7CiAgICAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXNQcm9jZXNzRW5yb2xsJyApIHx8ICcnOwoKICAgICMgZmV0Y2ggYWxzbyBGYWRlQXdheSBwcm9jZXNzZXMgdG8gY29udGludWUgd29ya2luZyB3aXRoIGV4aXN0aW5nIHRpY2tldHMsIGJ1dCBub3QgdG8gc3RhcnQgbmV3CiAgICAjICAgIG9uZXMKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgcHVzaCBAUHJvY2Vzc1N0YXRlcywgJ0ZhZGVBd2F5JzsKICAgIH0KCiAgICAjIGNyZWF0ZSBwcm9jZXNzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnID0+IHsKICAgICAgICAgICAgQWN0aXZpdHlPYmplY3QgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5JyksCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nT2JqZWN0ICAgPT4gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LAogICAgICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbicpLAogICAgICAgICAgICBUcmFuc2l0aW9uQWN0aW9uT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbicpLAogICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgICMgZ2V0IHByb2Nlc3NlcwogICAgbXkgJFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICk7CgogICAgIyBhbHNvIGdldCB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgaW5pdGlhdGVkIGJ5IGN1c3RvbWVycywgYXMgYW4gYWN0aXZpdHkgZGlhbG9nIG1pZ2h0IGJlCiAgICAjIGNvbmZpZ3VyZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UKICAgIG15ICRGb2xsb3d1cFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+ICdhbGwnLAogICAgKTsKCiAgICBteSAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2Nlc3NFbnRpdHlJRCcgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICYmICFJc0hhc2hSZWZXaXRoRGF0YSgkRm9sbG93dXBQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gUHJvY2VzcyBjb25maWd1cmVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgcHJvY2VzcyBsaXN0IGZvciBBQ0xzLCB1c2Ugb25seSBlbnRpdGllcyBpbnN0ZWFkIG9mIG5hbWVzLCBjb252ZXJ0IGZyb20KICAgICMgICBQMSA9PiBOYW1lIHRvIFAxID0+IFAxLiBBcyBBQ0xzIHNob3VsZCB3b3JrIG9ubHkgYWdhaW5zdCBlbnRpdGllcwogICAgbXkgJVByb2Nlc3NMaXN0QUNMID0gbWFwIHsgJF8gPT4gJF8gfSBzb3J0IGtleXMgJXskUHJvY2Vzc0xpc3R9OwoKICAgICMgdmFsaWRhdGUgdGhlIFByb2Nlc3NMaXN0IHdpdGggc3RvcmVkIEFDTHMKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnUHJvY2VzcycsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVByb2Nlc3NMaXN0QUNMLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgKTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgJiYgJEFDTCApIHsKCiAgICAgICAgIyBnZXQgQUNMIHJlc3VsdHMKICAgICAgICBteSAlQUNMRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgIyByZWNvdmVyIHByb2Nlc3MgbmFtZXMKICAgICAgICBteSAlUmVkdWNlZFByb2Nlc3NMaXN0ID0gbWFwIHsgJF8gPT4gJFByb2Nlc3NMaXN0LT57JF99IH0gc29ydCBrZXlzICVBQ0xEYXRhOwoKICAgICAgICAjIHJlcGxhY2Ugb3JpZ2luYWwgcHJvY2VzcyBsaXN0IHdpdGggdGhlIHJlZHVjZWQgb25lCiAgICAgICAgJFByb2Nlc3NMaXN0ID0gXCVSZWR1Y2VkUHJvY2Vzc0xpc3Q7CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICk7CgogICAgIyBpZiB3ZSBoYXZlIG5vIHN1YmFjdGlvbiBkaXNwbGF5IHRoZSBwcm9jZXNzIGxpc3QgdG8gc3RhcnQgYSBuZXcgb25lCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICMgdG8gZGlzcGxheSB0aGUgcHJvY2VzcyBsaXN0IGlzIG1hbmRhdG9yeSB0byBoYXZlIHByb2Nlc3NlcyB0aGF0IGFnZW50IGNhbiBzdGFydAogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBQcm9jZXNzIGNvbmZpZ3VyZWQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9jZXNzIGlkIChpZiBhbnksIGEgcHJvY2VzcyBzaG91bGQgYmUgcHJlLXNlbGVjdGVkKQogICAgICAgICRQYXJhbXtQcm9jZXNzSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVTZWxlY3RQcm9jZXNzfSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9EaXNwbGF5UHJvY2Vzc0xpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0xpc3QgICAgID0+ICRQcm9jZXNzTGlzdCwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQgfHwgJFBhcmFte1Byb2Nlc3NJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBwcm9jZXNzIGZyb20gdGhlIGxpc3QgaXMgdmFsaWQsIHByZXZlbnQgdGFtcGVyIHdpdGggcHJvY2VzcyBzZWxlY3Rpb24KICAgICMgICAgbGlzdCAobm90IGV4aXN0aW5nLCBpbnZhbGlkIGFuIGZhZGUgYXdheSBwcm9jZXNzZXMgbXVzdCBub3QgYmUgYWJsZSB0byBzdGFydCBhIG5ldyBwcm9jZXNzCiAgICAjICAgIHRpY2tldCkKICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnCiAgICAgICAgJiYgISRQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgJFNlbGYtPntJc01haW5XaW5kb3d9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgZXJyb3IgbWVzc2FnZSAoYXMgaXQgd2lsbCBiZSBpbmplY3RlZCBpbiB0aGUgSFRNTCkKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaGUgc2VsZWN0ZWQgcHJvY2VzcyBpcyBpbnZhbGlkISIpOwoKICAgICAgICAjIHJldHVybiBhIHByZWRlZmluZWQgSFRNTCBzdHJ1Y3R1cmUgYXMgdGhlIEFKQVggY2FsbCBpcyBleHBlY3RpbmcgYW5kIEhUTUwgcmVzcG9uc2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdiBjbGFzcz0iU2VydmVyRXJyb3IiIGRhdGEtbWVzc2FnZT0iJyAuICRFcnJvck1lc3NhZ2UgLiAnIj48L2Rpdj4nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgaW52YWxpZCBwcm9jZXNzIGlzIGRldGVjdGVkIG9uIGEgQWN0aXZpdHlEaWFsb2cgcG9wLXVwIHNjcmVlbiBzaG93IGFuIGVycm9yIG1lc3NhZ2UKICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZycKICAgICAgICAmJiAhJEZvbGxvd3VwUHJvY2Vzc0xpc3QtPnskUHJvY2Vzc0VudGl0eUlEfQogICAgICAgICYmICEkU2VsZi0+e0lzTWFpbldpbmRvd30KICAgICAgICApCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQcm9jZXNzICVzIGlzIGludmFsaWQhJywgJFByb2Nlc3NFbnRpdHlJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMKICAgICMgY29sbGVjdHMgYSBtaXh0dXJlIG9mIHByZXNlbnQgdmFsdWVzIGJvdHRvbSB0byB0b3A6CiAgICAjIFN5c0NvbmZpZyBEZWZhdWx0VmFsdWVzLCBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWVzLCBUaWNrZXRWYWx1ZXMsIFN1Ym1pdHRlZFZhbHVlcwogICAgIyBpbmNsdWRpbmcgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBhbmQgUHJvY2Vzc0VudGl0eUlECiAgICAjIGFsc28gc2V0cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gd2hpY2ggY29udGFpbnMgYWxsIERGcyBvZiB0aGUgY3VycmVudCBEaWFsb2cKICAgICMgaXMgdXNlZCBmb3I6CiAgICAjIC0gUGFyYW1ldGVyIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nCiAgICAjIC0gd2lsbCBiZSB1c2VkIGZvciBBQ0wgY2hlY2tpbmcgbGF0ZXIgb24KICAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5fR2V0UGFyYW0oCiAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICApOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RvcmVBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzTmFtZSAgICAgPT4gJFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewoKICAgICAgICAjIGluaXRpYWwgcmVuZGVyaW5nIC0gcHJlLWZpbGwgZHluYW1pYyBmaWVsZHMgd2l0aCB0aWNrZXQgdmFsdWVzCiAgICAgICAgbXkgJVRpY2tldDsKICAgICAgICBpZiAoJFRpY2tldElEKSB7CiAgICAgICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgd2ViIHJlcXVlc3QuCiAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgdmFsdWVzIGZyb20gdGhlIHdlYiByZXF1ZXN0LAogICAgICAgICAgICAjIGJlY2F1c2Ugc3VibWl0cywgc3VjY2Vzc2Z1bCBhbmQgdW5zdWNjZXNzZnVsIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkgYWJvdmUuCiAgICAgICAgICAgIGlmICggKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSAmJiAkVGlja2V0SUQgKSB7CgogICAgICAgICAgICAgICAgIyBWYWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0LgogICAgICAgICAgICAgICAgJEdldFBhcmFtLT57RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEaXNwbGF5QWN0aXZpdHlEaWFsb2dBSkFYJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewoKICAgICAgICAjIGRlbGV0ZSB2aXNpYmlsaXR5IGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nSFRNTCA9ICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQWN0aXZpdHlEaWFsb2dIVE1MLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwoKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgIHJldHVybiAkU2VsZi0+X1JlbmRlckFqYXgoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3ViYWN0aW9uIGlzIGludmFsaWQhJyksCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKc3ViIF9SZW5kZXJBamF4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEZhdGFsRXJyb3IgaXMgc2FmZSBiZWNhdXNlIGEgSlNPTiBzdHJ1Y3R1cmUgaXMgZXhwZWN0aW5nLCB0aGVuIGl0IHdpbGwgcmVzdWx0IGludG8gYQogICAgIyBjb21tdW5pY2F0aW9ucyBlcnJvcgoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckFqYXgnICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcsICdfUmVuZGVyQWpheCcgKSwKICAgICAgICApOwogICAgfQogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpLT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdObyBBY3Rpdml0eURpYWxvZyBjb25maWd1cmVkIGZvciAlcyBpbiBfUmVuZGVyQWpheCEnLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAlRmllbGRzUHJvY2Vzc2VkOwogICAgbXkgQEpTT05Db2xsZWN0b3I7CiAgICBteSAkU2VydmljZXM7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgdGhlIGFjdGl2aXR5IGRpYWxvZydzIFN1Ym1pdCBQYXJhbXMgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgU2tpcCBpZiB3ZSdyZSB3b3JraW5nIG9uIGEgZmllbGQgdGhhdCB3YXMgYWxyZWFkeSBkb25lIHdpdGggb3Igd2l0aG91dCBJRAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0KICAgICAgICAgICAgJiYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtczsKCiAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnT3duZXJJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRPd25lcnMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBPd25lciB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1Jlc3BvbnNpYmxlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgUmVzcG9uc2libGUgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdRdWV1ZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFF1ZXVlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFF1ZXVlIHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17R2V0UGFyYW19eyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTdGF0ZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFN0YXRlIHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdQcmlvcml0eUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBQcmlvcml0eSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTZXJ2aWNlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZXJ2aWNlcyA9ICREYXRhOwoKICAgICAgICAgICAgIyBhZGQgU2VydmljZSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlcnZpY2VJRCBmcm9tIHdlYiByZXF1ZXN0KQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTTEFJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgICMgaWYgU0xBIGlzIHJlbmRlciBiZWZvcmUgc2VydmljZSAoYnkgaXQgb3JkZXIgaW4gdGhlIGZpZWxkcykgaXQgbmVlZHMgdG8gY3JlYXRlCiAgICAgICAgICAgICMgdGhlIHNlcnZpY2UgbGlzdAogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkU2VydmljZXMpICkgewogICAgICAgICAgICAgICAgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFNMQSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlbGVjdGVkSUQgZnJvbSB3ZWIgcmVxdWVzdCkKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTTEFJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1R5cGVJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQWRkIFR5cGUgdG8gdGhlIEpTT05Db2xsZWN0b3IgKFVzZSBTZWxlY3RlZElEIGZyb20gd2ViIHJlcXVlc3QpLgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1R5cGVJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCgogICAgIyBhY3RpdmF0ZSBzdGFuZGFyZCB0ZW1wbGF0ZXMgaWYgYXJ0aWNsZSBpcyBjb25maWd1cmVkIGFuZCBzdGFuZGFyZCB0ZW1wbGF0ZXMgYXJlIG5vdCBleHBsaWNpdGx5IHNldCB0byAwCiAgICBteSAkQWN0aXZhdGVTdGFuZGFyZFRlbXBsYXRlcyA9IDA7CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317QXJ0aWNsZX0gKSB7CiAgICAgICAgJEFjdGl2YXRlU3RhbmRhcmRUZW1wbGF0ZXMgPSBkZWZpbmVkICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317QXJ0aWNsZX17Q29uZmlnfXtTdGFuZGFyZFRlbXBsYXRlc30gPyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e0FydGljbGV9e0NvbmZpZ317U3RhbmRhcmRUZW1wbGF0ZXN9IDogMTsKICAgIH0KICAgIGlmICggJEFjdGl2YXRlU3RhbmRhcmRUZW1wbGF0ZXMgKSB7CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFkZCBTdGFuZGFyZFRlbXBsYXRlIHRvIHRoZSBKU09OQ29sbGVjdG9yIChVc2UgU2VsZWN0ZWRJRCBmcm9tIHdlYiByZXF1ZXN0KS4KICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICB9CiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwoKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwoKICAgICMgcmV0cmlldmUgZmllbGQgcmVzdHJpY3Rpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEF1dG9zZWxlY3QgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBdXRvc2VsZWN0JykgfHwgdW5kZWY7CiAgICBteSAkTG9vcFByb3RlY3Rpb24gID0gMTAwOwogICAgbXkgJUNoYW5nZWRFbGVtZW50cyA9ICRQYXJhbXtHZXRQYXJhbX17RWxlbWVudENoYW5nZWR9ID8gKCAkUGFyYW17R2V0UGFyYW19e0VsZW1lbnRDaGFuZ2VkfSA9PiAxICkgOiAoKTsKICAgIGlmICggJENoYW5nZWRFbGVtZW50c3tTZXJ2aWNlSUR9ICkgewogICAgICAgICRDaGFuZ2VkRWxlbWVudHN7Q3VzdG9tZXJVc2VySUR9ID0gMTsKICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVySUR9ICAgICA9IDE7CiAgICB9CgogICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKSwKICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH0sCiAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSB8fCAnJywKICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgQXV0b3NlbGVjdCAgICAgICAgICAgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24gLy8gJycsCiAgICAgICAgTG9vcFByb3RlY3Rpb24gICAgICAgICAgICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgKTsKIyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwoKICAgIGlmICggJEFjdGl2YXRlU3RhbmRhcmRUZW1wbGF0ZXMgKSB7CiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcyggJFBhcmFte0dldFBhcmFtfS0+JSogKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfXtTdGFuZGFyZFRlbXBsYXRlSUR9CiAgICAgICAgICAgICYmICEkU3RhbmRhcmRUZW1wbGF0ZXMtPnsgJFBhcmFte0dldFBhcmFtfXtTdGFuZGFyZFRlbXBsYXRlSUR9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17U3RhbmRhcmRUZW1wbGF0ZUlEfSA9ICcnOwogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze1N0YW5kYXJkVGVtcGxhdGVJRH0gPSAxOwogICAgICAgIH0KICAgIH0KIyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCgogICAgJFBhcmFte0dldFBhcmFtfXtEeW5hbWljRmllbGR9IC8vPSB7fTsKCiAgICAjIHNldCBuZXcgdmFsdWVzCiAgICBteSAkREZQYXJhbSA9IHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0R5bmFtaWNGaWVsZH0tPiUqLAogICAgICAgICREeW5GaWVsZFN0YXRlc3tOZXdWYWx1ZXN9LT4lKiwKICAgIH07CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ICkgKSB7CiAgICAgICAgcHVzaCBASlNPTkNvbGxlY3RvciwgewogICAgICAgICAgICBOYW1lID0+ICdSZXN0cmljdGlvbnNfVmlzaWJpbGl0eScsCiAgICAgICAgICAgIERhdGEgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgIH07CiAgICB9CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICROYW1lICgga2V5cyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfS0+JSogKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXskTmFtZX07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtNdWx0aVZhbHVlfSAmJiByZWYgJERGUGFyYW0tPnsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgIGZvciBteSAkaSAoIDAgLi4gJCN7ICRERlBhcmFtLT57IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSB9ICkgewogICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgICAgID8gKCAkREZQYXJhbS0+eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In1bJGldIC8vICcnICkKICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICRERlBhcmFtLT57IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifVskaV0gXSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgIHB1c2ggQEpTT05Db2xsZWN0b3IsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAiXyRpIiwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkREZQYXJhbS0+eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In1bJGldLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB0ZW1wbGF0ZSB2YWx1ZSBmb3Iga2VlcGluZyB0ZW1wbGF0ZXMgaW4gbGluZSB3aXRoIEFDTHMKICAgICAgICAgICAgaWYgKCAhJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e05vdEFDTFJlZHVjaWJsZX0gKSB7CiAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICgKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycgXSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgcHVzaCBASlNPTkNvbGxlY3RvciwgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICJfVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICA/ICggJERGUGFyYW0tPnsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9IC8vICcnICkKICAgICAgICAgICAgOgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkREZQYXJhbS0+eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICk7CgogICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgIHB1c2ggQEpTT05Db2xsZWN0b3IsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJERGUGFyYW0tPnsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICB9OwogICAgfQoKICAgIGZvciBteSAkU2V0RmllbGQgKCB2YWx1ZXMgJER5bkZpZWxkU3RhdGVze1NldHN9LT4lKiApIHsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNldEZpZWxkLT57RHluYW1pY0ZpZWxkQ29uZmlnfTsKCiAgICAgICAgIyB0aGUgZnJvbnRlbmQgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5uZXIgZmllbGQgaW5jbHVkaW5nIGl0cyBpbmRleCBvciB0aGUgJ19UZW1wbGF0ZScgc3VmZml4CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRnJvbnRlbmROYW1lICgga2V5cyAkU2V0RmllbGQtPntGaWVsZFN0YXRlc30tPiUqICkgewoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtNdWx0aVZhbHVlfSAmJiByZWYgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI3sgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldIC8vICcnICkKICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHB1c2ggQEpTT05Db2xsZWN0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJEZyb250ZW5kTmFtZSAuICJfJGkiLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUgdmFsdWUgZm9yIGtlZXBpbmcgdGVtcGxhdGVzIGluIGxpbmUgd2l0aCBBQ0xzCiAgICAgICAgICAgICAgICBpZiAoICEkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17Tm90QUNMUmVkdWNpYmxlfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgcHVzaCBASlNPTkNvbGxlY3RvciwgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lIC4gIl9UZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICA/ICggJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSAvLyAnJyApCiAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICBwdXNoIEBKU09OQ29sbGVjdG9yLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgogICAgaWYgKCAkQWN0aXZhdGVTdGFuZGFyZFRlbXBsYXRlcyAmJiAkQ2hhbmdlZEVsZW1lbnRze1N0YW5kYXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJFBhcmFte0dldFBhcmFtfXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzCiAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkUGFyYW17R2V0UGFyYW19e1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBKU09OQ29sbGVjdG9yLCAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlUHJvY2Vzc0RpYWxvZycsCiAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oIFtASlNPTkNvbGxlY3Rvcl0gKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCiMgPWN1dAojCiMgX0dldFBhcmFtKCkKIwojIHJldHVybnMgdGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBvZiB0aGUgc3VibWl0dGVkIGluZm9ybWF0aW9uCiMKIyBUaGlzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgdGhlIGRpZmZlcmVudCBjYWxsZXJzOgojCiMgICAgIEluaXRpYWwgY2FsbCB3aXRoIHNlbGVjdGVkIFByb2Nlc3M6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIERlZmF1bHRWYWx1ZXMgZm9yIHRoZSBjb25maWd1cmVkIEZpZWxkcyBpbiB0aGF0IEFjdGl2aXR5RGlhbG9nCiMgICAgICAgICBEZWZhdWx0VmFsdWVzIGZvciB0aGUgNCByZXF1aXJlZCBGaWVsZHMgUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eQojCiMgICAgIEZpcnN0IFN0b3JlIGNhbGwgc3VibWl0dGluZyBhbiBBY3Rpdml0eSBEaWFsb2c6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIFN1Ym1pdHRlZFZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgQWN0aXZpdHlEaWFsb2cKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMgZm9yIGludmlzaWJsZSBmaWVsZHMgb2YgdGhhdCBBY3Rpdml0eURpYWxvZwojICAgICAgICAgRGVmYXVsdFZhbHVlcyBmb3IgdGhlIDQgcmVxdWlyZWQgRmllbGRzIFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkKIyAgICAgICAgICAgICBpZiBub3QgY29uZmlndXJlZCBpbiB0aGUgQWN0aXZpdHlEaWFsb2cKIwojICAgICBBY3Rpdml0eURpYWxvZyBmaWxsb3V0IHJlcXVlc3Qgb24gZXhpc3RpbmcgVGlja2V0OgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBUaWNrZXRWYWx1ZXMKIwojICAgICBBY3Rpdml0eURpYWxvZyBzdG9yZSByZXF1ZXN0IG9yIEFqYXhVcGRhdGUgcmVxdWVzdCBvbiBleGlzdGluZyBUaWNrZXRzOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBUaWNrZXRWYWx1ZXMgZm9yIGFsbCBub3QtU3VibWl0dGVkIFZhbHVlcwojICAgICAgICAgU3VibWl0dGVkIFZhbHVlcwojCiMgICAgIG15ICRHZXRQYXJhbSA9IF9HZXRQYXJhbSgKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAojICAgICApOwojCiMgPWN1dAoKc3ViIF9HZXRQYXJhbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KFByb2Nlc3NFbnRpdHlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfR2V0UGFyYW0nICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAkUHJvY2Vzc0VudGl0eUlEICAgICAgICA9ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9OwogICAgbXkgJFRpY2tldElEICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnLAogICAgKTsKICAgIG15ICRBY3Rpdml0eUVudGl0eUlEOwogICAgbXkgJVZhbHVlc0dvdHRlbjsKICAgIG15ICRWYWx1ZTsKCiAgICAjIGdldCBhY3Rpdml0eSBkaWFsb2cgb2JqZWN0CiAgICBteSAkQWN0aXZpdHlEaWFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyk7CgogICAgIyBjcmVhdGUgcHJvY2VzcyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgIEFjdGl2aXR5T2JqZWN0ICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpLAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ09iamVjdCAgID0+ICRBY3Rpdml0eURpYWxvZ09iamVjdCwKICAgICAgICAgICAgVHJhbnNpdGlvbk9iamVjdCAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb24nKSwKICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbk9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb24nKSwKICAgICAgICB9CiAgICApOwogICAgbXkgJFByb2Nlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKCiAgICAjIElmIHdlIGdvdCBubyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBubyBUaWNrZXRJRAogICAgIyB3ZSBoYXZlIHRvIGdldCB0aGUgUHJvY2Vzc2VzJyBTdGFydHBvaW50CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAmJiAoICEkVGlja2V0SUQgfHwgJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgKSB7CiAgICAgICAgbXkgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgfHwgISRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0dvdCBubyBTdGFydCBBY3Rpdml0eUVudGl0eUlEIG9yIFN0YXJ0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgZm9yIFByb2Nlc3M6ICVzIGluIF9HZXRQYXJhbSEnLAogICAgICAgICAgICAgICAgJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ307CiAgICAgICAgJEFjdGl2aXR5RW50aXR5SUQgICAgICAgPSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGdldCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGlmIHRoZXJlIGlzIGEgdGlja2V0IHRoZW4gaXMgbm90IGFuIEFKQVggcmVxdWVzdAogICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJUdldFBhcmFtID0gJVRpY2tldDsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVHZXRQYXJhbSApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBnZXQgVGlja2V0IGZvciBUaWNrZXRJRDogJXMgaW4gX0dldFBhcmFtIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAgICAgJEFjdGl2aXR5RW50aXR5SUQgPSAkVGlja2V0ewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoIlByb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCIpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICggISRBY3Rpdml0eUVudGl0eUlEICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBkZXRlcm1pbmUgQWN0aXZpdHlFbnRpdHlJRC4gRHluYW1pY0ZpZWxkIG9yIENvbmZpZyBpc25cJ3Qgc2V0IHByb3Blcmx5IScKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICAkR2V0UGFyYW17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gPSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRDsKICAgICRHZXRQYXJhbXtBY3Rpdml0eUVudGl0eUlEfSAgICAgICA9ICRBY3Rpdml0eUVudGl0eUlEIC8vICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpdml0eUVudGl0eUlEJyApOwogICAgJEdldFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gICAgICAgID0gJFByb2Nlc3NFbnRpdHlJRDsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHlkaWFsb2dzJ3MgU3VibWl0IFBhcmFtcyBvciBDb25maWcgUGFyYW1zCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBTa2lwIGlmIHdlJ3JlIHdvcmtpbmcgb24gYSBmaWVsZCB0aGF0IHdhcyBhbHJlYWR5IGRvbmUgd2l0aCBvciB3aXRob3V0IElECiAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSAmJiAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSBkeW5hbWljIGZpZWxkcyBzZXBhcmF0ZWx5CiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtczsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmaWVsZHMKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmplY3QnICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCb2R5JyApOwojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcgKTsKIyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgIEB7ICRHZXRQYXJhbXtJbmZvcm1Vc2VySUR9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVmFsdWVzR290dGVue0FydGljbGV9ID0gMSBpZiAoICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkR2V0UGFyYW17Qm9keX0gKTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtUaW1lVW5pdHN9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpbWVVbml0cycgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CiAgICAgICAgICAgIG15ICRQcmVmaXggPSAnUGVuZGluZ1RpbWUnOwoKICAgICAgICAgICAgIyBPaywgd2UgbmVlZCB0byB0cnkgdG8gZmluZCB0aGUgdGFyZ2V0IHN0YXRlIG5vdwogICAgICAgICAgICBteSAlU3RhdGVEYXRhOwoKICAgICAgICAgICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICAgICAgICAgIG15ICRTdGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpOwoKICAgICAgICAgICAgIyBXYXMgc29tZXRoaW5nIHN1Ym1pdHRlZCBmcm9tIHRoZSBHVUk/CiAgICAgICAgICAgIG15ICRUYXJnZXRTdGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXRlSUQnICk7CiAgICAgICAgICAgIGlmICgkVGFyZ2V0U3RhdGVJRCkgewogICAgICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRhcmdldFN0YXRlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDE6IGRlZmF1bHQgdmFsdWUgb2YgZGlhbG9nIGZpZWxkIFN0YXRlCiAgICAgICAgICAgIGlmICggISVTdGF0ZURhdGEgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtTdGF0ZX17RGVmYXVsdFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtTdGF0ZX17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRmFsbGJhY2sgMjogZGVmYXVsdCB2YWx1ZSBvZiBkaWFsb2cgZmllbGQgU3RhdGVJRAogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGVJRH17RGVmYXVsdFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGVJRH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRmFsbGJhY2sgMzogZXhpc3RpbmcgdGlja2V0IHN0YXRlCiAgICAgICAgICAgIGlmICggISVTdGF0ZURhdGEgJiYgJVRpY2tldCApIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwZW5kaW5nIHRpbWUgdmFsdWVzCiAgICAgICAgICAgICMgZGVwZW5kcyBvbiBTdGF0ZVR5cGUgY29udGFpbmluZyAnXnBlbmRpbmcnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YXRlRGF0YSApCiAgICAgICAgICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgbWFwIHRoZSBHZXRQYXJhbSBEYXRlIFZhbHVlcyB0byBvdXIgRGF0ZVBhcmFtSGFzaAogICAgICAgICAgICAgICAgbXkgJURhdGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeCwKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAoICRQcmVmaXggLiAkXyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAoICRQcmVmaXggLiAkXyApICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGlmIGFsbCB2YWx1ZXMgYXJlIHByZXNlbnQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdEYXknIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnSG91cicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgcmVjYWxjdWxhdGUgdGltZSBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICVEYXRlUGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlRGF0ZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcmVmb3JtYXQgZm9yIHN0b3JpbmcgKGUuZy4gdGFrZSBvdXQgUHJlZml4KQogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSB9ID0gbWFwIHsgJF8gPT4gJERhdGVQYXJhbXsgJFByZWZpeCAuICRfIH0gfSBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlc0dvdHRlbntQZW5kaW5nVGltZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vbiBEeW5hbWljRmllbGRzCiAgICAgICAgIyAxLiB0cnkgdG8gZ2V0IHRoZSByZXF1aXJlZCBwYXJhbQogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICk7CgogICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBJRCBmaWVsZCBtYWtlIHN1cmUgdGhlIHZhbHVlIHdpdGhvdXQgSUQgd29uJ3QgYmUgaW4gdGhlCiAgICAgICAgICAgICMgJUdldFBhcmFtIEhhc2ggYW55IG1vcmUKICAgICAgICAgICAgIyBleGNsdWRlIHF1ZXVlIGZyb20gdGhpcyBhcyB3ZSBuZWVkIGl0IGZvciBzY3JpcHQgZmllbGQgZXZhbHVhdGlvbgogICAgICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgICAgIG15ICRRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkVmFsdWUgKTsKICAgICAgICAgICAgICAgIGlmICgkUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkUXVldWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSA9fiBteyguKilJRCR9eG1zICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyQxfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSAgICAgPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBnb3QgdGlja2V0IHBhcmFtcywgdGhlIEdldFBhcmFtIEhhc2ggd2FzIGFscmVhZHkgZmlsbGVkIGJlZm9yZSB0aGUgbG9vcAogICAgICAgICMgYW5kIHdlIGNhbiBuZXh0IG91dAogICAgICAgIGlmICggJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnUXVldWUnICYmICEkR2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKSB7CiAgICAgICAgICAgIG15ICRVc2VyRGVmYXVsdFF1ZXVlID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpVc2VyRGVmYXVsdFF1ZXVlJykgfHwgJyc7CiAgICAgICAgICAgIGlmICgkVXNlckRlZmF1bHRRdWV1ZSkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFVzZXJEZWZhdWx0UXVldWU7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICAgICA9ICRRdWV1ZUlEOwogICAgICAgICAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gU3VibWl0dGVkIG5vciBUaWNrZXQgUGFyYW0gZ2V0IEFjdGl2aXR5RGlhbG9nIENvbmZpZyBQYXJhbQogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBuZSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KICAgIH0KCiAgICBSRVFVSVJFREZJRUxETE9PUDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkIChxdyhRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5KSkgewogICAgICAgICRWYWx1ZSA9IHVuZGVmOwogICAgICAgIGlmICggISRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdCRDdXJyZW50RmllbGQiKTsKICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEZWZhdWx0JXMgQ29uZmlnIFZhbHVlIG1pc3NpbmchJywKICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgIGlmICgkRGVzdCkgewoKICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CgogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZVBhcnRzWzBdOwogICAgICAgICRHZXRQYXJhbXtRdWV1ZX0gICA9ICRRdWV1ZVBhcnRzWzFdOwoKICAgICAgICAkVmFsdWVzR290dGVue1F1ZXVlSUR9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhbHNvIHRoZSBJRHMgZm9yIHRoZSBSZXF1aXJlZCBmaWxlcyAoaWYgdGhleSBhcmUgbm90IHByZXNlbnQpCiAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZX0gJiYgISRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRHZXRQYXJhbXtRdWV1ZX0gKTsKICAgIH0KICAgIGlmICggJEdldFBhcmFte1N0YXRlfSAmJiAhJEdldFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtTdGF0ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUxvb2t1cCggU3RhdGUgPT4gJEdldFBhcmFte1N0YXRlfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17TG9ja30gJiYgISRHZXRQYXJhbXtMb2NrSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtMb2NrSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvY2snKS0+TG9ja0xvb2t1cCggTG9jayA9PiAkR2V0UGFyYW17TG9ja30gKTsKICAgIH0KICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5fSAmJiAhJEdldFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpLT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJEdldFBhcmFte1ByaW9yaXR5fSwKICAgICAgICApOwogICAgfQoKICAgICMgYW5kIGFsbW9zdCBmaW5hbGx5IHdlJ2xsIGhhdmUgdGhlIHNwZWNpYWwgcGFyYW1ldGVyczoKICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGwnICk7CiAgICAkR2V0UGFyYW17T3duZXJBbGx9ICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsJyApOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKTsKCiAgICAjIGhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0ge307CgogICAgIyBQYXJzZSBkZWZpbml0aW9uIGlmIHByZXNlbnQKICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57SW5wdXRGaWVsZERlZmluaXRpb259ICkgewogICAgICAgIG15ICRJbnB1dEZpZWxkRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkxvYWQoCiAgICAgICAgICAgIERhdGEgPT4gJEFjdGl2aXR5RGlhbG9nLT57SW5wdXRGaWVsZERlZmluaXRpb259LAogICAgICAgICk7CgogICAgICAgIG15ICREeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXRJbnB1dERlZmluaXRpb25EeW5hbWljRmllbGRzKAogICAgICAgICAgICBJbnB1dEZpZWxkRGVmaW5pdGlvbiA9PiAkSW5wdXRGaWVsZERlZmluaXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJER5bmFtaWNGaWVsZHMgLy8ge307CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfSApICkgewogICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgIERGTkFNRToKICAgICAgICBmb3IgbXkgJERGTmFtZSAoIG1hcCB7L15EeW5hbWljRmllbGRfKC4rKSQvfSBrZXlzICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPiUqICkgewogICAgICAgICAgICBuZXh0IERGTkFNRSBpZiAkU2VsZi0+e0R5bmFtaWNGaWVsZH17JERGTmFtZX07CgogICAgICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17JERGTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICRERk5hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgIyBvdmVyd3JpdGUgZHluYW1pYyBmaWVsZCBjb25maWcgZGVmYXVsdCB2YWx1ZSB3aXRoIGFjdGl2aXR5IGRpYWxvZyBkZWZhdWx0IHZhbHVlLCBpZiBwcmVzZW50CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUifQogICAgICAgICAgICAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUifXtEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX17Q29uZmlnfXtEZWZhdWx0VmFsdWV9ID0gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIn17RGVmYXVsdFZhbHVlfTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBDb25maWcgb2YgdGhlIGN1cnJlbnQgRHluYW1pY0ZpZWxkCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX07CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9CiAgICAgICAgICAgICAgICAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkRHluYW1pY0ZpZWxkTmFtZSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgR2V0IER5bmFtaWNGaWVsZCBWYWx1ZXMKICAgICAgICAkR2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICAjIEFDTENvbXBhdAogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9ID0gJEdldFBhcmFteyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9OwogICAgfQoKICAgIHJldHVybiBcJUdldFBhcmFtOwp9CgpzdWIgX091dHB1dEFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkVGlja2V0SUQgICAgICAgICAgICAgICA9ICRQYXJhbXtHZXRQYXJhbX17VGlja2V0SUR9OwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBDaGVjayBuZWVkZWQgcGFyYW1ldGVyczoKICAgICMgUHJvY2Vzc0VudGl0eUlEIG9ubHkKICAgICMgVGlja2V0SUQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgaWYgKCAhJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gfHwgKCAhJFRpY2tldElEICYmICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApICkgewogICAgICAgIG15ICRNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdHb3Qgbm8gUHJvY2Vzc0VudGl0eUlEIG9yIFRpY2tldElEIGFuZCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIScpOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZzsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAlRXJyb3IgICAgICAgICA9ICgpOwogICAgbXkgJUVycm9yTWVzc2FnZXMgPSAoKTsKCiAgICAjIElmIHdlIGhhZCBFcnJvcnMsIHdlIGdvdCBhbiBFcnJvciBoYXNoCiAgICAlRXJyb3IgICAgICAgICA9ICV7ICRQYXJhbXtFcnJvcn0gfSAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApOwogICAgJUVycm9yTWVzc2FnZXMgPSAleyAkUGFyYW17RXJyb3JNZXNzYWdlc30gfSBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3JNZXNzYWdlc30gKSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQWN0aXZpdHlPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5Jyk7CiAgICBteSAkQWN0aXZpdHlEaWFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyk7CgogICAgIyBjcmVhdGUgcHJvY2VzcyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgIEFjdGl2aXR5T2JqZWN0ICAgICAgICAgPT4gJEFjdGl2aXR5T2JqZWN0LAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ09iamVjdCAgID0+ICRBY3Rpdml0eURpYWxvZ09iamVjdCwKICAgICAgICAgICAgVHJhbnNpdGlvbk9iamVjdCAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb24nKSwKICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbk9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb24nKSwKICAgICAgICB9CiAgICApOwogICAgbXkgJFByb2Nlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfXtSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFRpY2tldElEIHx8ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBTdGFydEFjdGl2aXR5RGlhbG9nIGFuZCBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciB0aGUgUHJvY2Vzc0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBBSkFYIHVwZGF0ZSBpbiB0aGlzIHBhcnQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2FuXCd0IGdldCBUaWNrZXQgIiVzIiEnLCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkUHJvY2Vzc0lEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRBY3Rpdml0eUlEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnKTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRHluYW1pY0ZpZWxkUHJvY2Vzc0lEfSB8fCAhJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBQcm9jZXNzRW50aXR5SUQgb3IgQWN0aXZpdHlFbnRpdHlJRCBmb3IgVGlja2V0ICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nID0gewogICAgICAgICAgICBBY3Rpdml0eSAgICAgICA9PiAkVGlja2V0eyREeW5hbWljRmllbGRBY3Rpdml0eUlEfSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICElVGlja2V0ICYmICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eSA9ICRBY3Rpdml0eU9iamVjdC0+QWN0aXZpdHlHZXQoCiAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0KICAgICk7CiAgICBpZiAoICEkQWN0aXZpdHkgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5IGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fSwKICAgICAgICApOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICApOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdyZXAgb3V0IE92ZXJ3cml0ZXMgaWYgZGVmaW5lZCBvbiB0aGUgQWN0aXZpdHkKICAgIG15IEBPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlciA9IGdyZXAgewogICAgICAgIHJlZiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99IGVxICdIQVNIJwogICAgICAgICAgICAmJiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9CiAgICAgICAgICAgICYmICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gZXEKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317T3ZlcndyaXRlfSApCiAgICB9IGtleXMgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9IH07CgogICAgIyBsZXQgdGhlIE92ZXJ3cml0ZXMgT3ZlcndyaXRlIHRoZSBBY3Rpdml0eURpYWxvZydzIEhhc2ggdmFsdWVzCiAgICBpZiAoICRPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlclswXSApIHsKICAgICAgICAleyRBY3Rpdml0eURpYWxvZ30gPSAoCiAgICAgICAgICAgICV7JEFjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyAkT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXJbMF0gfXtPdmVyd3JpdGV9IH0KICAgICAgICApOwogICAgfQoKICAgICMgQWRkIFBhZ2UgSGVhZGVyLCBOYXYgYmFyLCBGb3JtIGhlYWRlciAoUHJvY2Vzcy9BY3Rpdml0eURpYWxvZ0hlYWRlcikKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkTWFpbkJveENsYXNzOwoKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgZ2l2ZW4gbm90aWZ5IG1lc3NhZ2VzIGlmIHRoaXMgaXMgbm90IGFuIEFKQVggcmVxdWVzdAogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZ5fSApICkgewoKICAgICAgICAgICAgZm9yIG15ICROb3RpZnlEYXRhICggQHsgJFBhcmFte05vdGlmeX0gfSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCAleyROb3RpZnlEYXRhfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQWN0aXZpdHlEaWFsb2ctPntOYW1lfSApCiAgICAgICAgICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQogICAgZWxzaWYgKAogICAgICAgICggJFNlbGYtPntJc01haW5XaW5kb3d9IHx8ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBkaXNwbGF5IGNvbXBsZXRlIGhlYWRlciBhbmQgbmF2aWdhdGlvbiBiYXIgaW4gQUpBWCBkaWFsb2dzIHdoZW4gdGhlcmUgaXMgYSBzZXJ2ZXIgZXJyb3IKICAgICAgICAjICAgIHVubGVzcyB3ZSBhcmUgaW4gYSBwcm9jZXNzIGVucm9sbG1lbnQgKG9ubHkgd2hlbiBJc01haW5XaW5kb3cgaXMgYWN0aXZlKQogICAgICAgIG15ICRUeXBlID0gJFNlbGYtPntJc01haW5XaW5kb3d9ID8gJycgOiAnU21hbGwnOwogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgb3JpZ2luYWwgaGVhZGVyIHRleHRzICh0aGUgcHJvY2VzcyBsaXN0IG1heWJlIGlzIG5vdCBuZWNlc3NhcnkpCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRQcm9jZXNzJyAuICRUeXBlLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIElzUHJvY2Vzc0Vucm9sbCA9PiAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGhlIE1haW5Cb3ggY2xhc3MgdG8gYWRkIGNvcnJlY3QgYm9yZGVycyB0byB0aGUgc2NyZWVuCiAgICAgICAgJE1haW5Cb3hDbGFzcyA9ICdNYWluQm94JzsKICAgIH0KCiAgICAjIGRpc3BsYXkgcHJvY2VzcyBpbmZvcm1hdGlvbgogICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CgogICAgICAgICMgZ2V0IHByb2Nlc3MgZGF0YQogICAgICAgIG15ICRQcm9jZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBtYWluIHByb2Nlc3MgaW5mb3JtYXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0luZm9TaWRlYmFyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQcm9jZXNzICAgICAgICA9PiAkUHJvY2Vzcy0+e05hbWV9ICAgICAgICB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGl2aXR5ICAgICAgID0+ICRBY3Rpdml0eS0+e05hbWV9ICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gJEFjdGl2aXR5RGlhbG9nLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgYWN0aXZpdHkgZGlhbG9nIHNob3J0IGRlc2NyaXB0aW9uIChpZiBhbnkpCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9CiAgICAgICAgICAgICYmICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9IG5lICcnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0luZm9TaWRlYmFyQWN0aXZpdHlEaWFsb2dEZXNjJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRGVzY3JpcHRpb24gPT4gJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgbG9uZyBkZXNjcmlwdGlvbiBpbmZvcm1hdGlvbiBpZiBleGlzdHMKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfQogICAgICAgICAgICAmJiBsZW5ndGggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xvbmdEZXNjcmlwdGlvblNpZGViYXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBkZXNjcmlwdGlvbnMKICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQKICAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcKICAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjbG9zZSAmIGNhbmNlbCBsaW5rIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17UmVuZGVyTG9ja2VkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FuY2VsTGluaycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9BY3Rpdml0eURpYWxvZ0hlYWRlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRm9ybU5hbWUgICAgICAgICAgICAgICA9PiAnQWN0aXZpdHlEaWFsb2dEaWFsb2cnIC4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgID0+ICdTdG9yZUFjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0e1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgTGlua1RpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e0xpbmtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtBY3Rpdml0eUVudGl0eUlEfQogICAgICAgICAgICAgICAgfHwgJFRpY2tldHsKICAgICAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0KICAgICAgICAgICAgICAgIHx8ICRUaWNrZXR7CiAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBJc01haW5XaW5kb3cgICAgPT4gJFNlbGYtPntJc01haW5XaW5kb3d9LAogICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGwgPT4gJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9LAogICAgICAgICAgICBNYWluQm94Q2xhc3MgICAgPT4gJE1haW5Cb3hDbGFzcyB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAlUmVuZGVyZWRGaWVsZHMgPSAoKTsKCiAgICBteSAkSW5wdXREZWZpbml0aW9uUmVuZGVyZWQgPSAwOwogICAgbXkgJURGUG9zc2libGVWYWx1ZXMgICAgICAgID0gJXsgJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9IC8vIHt9IH07CiAgICBteSAlVmlzaWJpbGl0eSAgICAgICAgICAgICAgPSAleyAkUGFyYW17VmlzaWJpbGl0eX0gICAgICAgLy8ge30gfTsKCiAgICAjIGlmIHdlIGFyZSByZW5kZXJpbmcgYSBuZXcgbWFzayBhbmQgYXJlIG5vdCByZXJlbmRlcmluZyB3aXRoIGVycm9ycyBnZXQgdGlja2V0IGFuZCBkZWZhdWx0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBuZSAnU3RvcmVBY3Rpdml0eURpYWxvZycgKSB7CgogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgICAgIG15ICROZXdUaWNrZXQ7CgogICAgICAgICMgZ2V0IHN0b3JlZCBkeW5hbWljIGZpZWxkIHZhbHVlIChzcGxpdCkKICAgICAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldElEfSApIHsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFNlbGYtPntMaW5rVGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdWZmaXggICAgICA9PiAkU2VsZi0+e0lEU3VmZml4fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgd2UgYXJlIHVwZGF0aW5nIGFuIGV4aXN0aW5nIHRpY2tldAogICAgICAgIGVsc2lmICglVGlja2V0KSB7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkTmFtZSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdEeW5hbWljRmllbGRfJyAuICROYW1lIH0gPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkTmFtZSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE5ld1RpY2tldCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJldHJpZXZlIGZpZWxkIHJlc3RyaWN0aW9ucyBmb3IgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcHJlLWZpbGxpbmcgY2FjaGUgZm9yIHJlZmVyZW5jZSBmaWVsZCAtIG5lY2Vzc2FyeSBmb3IgQUNMIGNhbGN1bGF0aW9uIG9mIGxlbnMgZmllbGRzCiAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9OwogICAgICAgICAgICBteSAkSXNSZWZlcmVuY2VGaWVsZCAgID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1JlZmVyZW5jZUZpZWxkJywKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIHVubGVzcyAkSXNSZWZlcmVuY2VGaWVsZDsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5TZXRGb3JtRGF0YSgKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnUG9zc2libGVWYWx1ZXNfRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUifSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRBdXRvc2VsZWN0ICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBdXRvc2VsZWN0JykgfHwgdW5kZWY7CiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwoKICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiB7fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSB8fCAnJywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICAgICAgICAgICAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICApOwoKICAgICAgICAlREZQb3NzaWJsZVZhbHVlcyA9IG1hcCB7ICRfID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffXtQb3NzaWJsZVZhbHVlc30gfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgJVZpc2liaWxpdHkgICAgICAgPSAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0tPiUqOwogICAgfQoKICAgICMgUGFyc2UgZGVmaW5pdGlvbiBpZiBwcmVzZW50CiAgICBteSAkSW5wdXRGaWVsZERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5Mb2FkKAogICAgICAgIERhdGEgPT4gJEFjdGl2aXR5RGlhbG9nLT57SW5wdXRGaWVsZERlZmluaXRpb259LAogICAgKTsKICAgIG15ICVEZWZpbmVkRmllbGRzTGlzdDsKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRJbnB1dEZpZWxkRGVmaW5pdGlvbikgKSB7CiAgICAgICAgZm9yIG15ICRSb3cgKCAkSW5wdXRGaWVsZERlZmluaXRpb24tPkAqICkgewogICAgICAgICAgICBpZiAoICRSb3ctPntERn0gKSB7CiAgICAgICAgICAgICAgICAkRGVmaW5lZEZpZWxkc0xpc3R7ICdEeW5hbWljRmllbGRfJyAuICRSb3ctPntERn0gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUm93LT57R3JpZH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyaWRSb3cgKCAkUm93LT57R3JpZH17Um93c30tPkAqICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBncmVwIHsgJF8tPntERn0gfSAkR3JpZFJvdy0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREZWZpbmVkRmllbGRzTGlzdHsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkLT57REZ9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzID0gbWFwIHsgKCAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAkUGFyYW17R2V0UGFyYW19eyAnRHluYW1pY0ZpZWxkXycgLiAkXyB9ICkgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgIyBMb29wIHRocm91Z2ggQWN0aXZpdHlEaWFsb2dGaWVsZHMgYW5kIHJlbmRlciB0aGVpciBvdXRwdXQKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9ICkgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgZGF0YSBmb3IgRmllbGQgIiVzIiBvZiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUZpZWxkRGF0YSA9ICV7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgIyBXZSByZW5kZXIganVzdCB2aXNpYmxlIEFjdGl2aXR5RGlhbG9nRmllbGRzCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAhJEZpZWxkRGF0YXtEaXNwbGF5fTsKCiAgICAgICAgIyBIYW5kbGUgbXVsdGljb2x1bW4gZmllbGQgcmVuZGVyaW5nCiAgICAgICAgaWYgKCAkRGVmaW5lZEZpZWxkc0xpc3R7JEN1cnJlbnRGaWVsZH0gKSB7CgogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRJbnB1dERlZmluaXRpb25SZW5kZXJlZDsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgID0+ICRJbnB1dEZpZWxkRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiBcJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+IFwlREZQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICA9PiBcJVZpc2liaWxpdHksCiAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkSW5wdXREZWZpbml0aW9uUmVuZGVyZWQgPSAxOwoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIER5bmFtaWNGaWVsZHMKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwogICAgICAgICAgICBteSAkUmVzcG9uc2UgICAgICAgICA9ICRTZWxmLT5fUmVuZGVyRHluYW1pY0ZpZWxkKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCAgICAgICAgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgICAgICAgICB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZXMgICAgICAgPT4gXCVFcnJvck1lc3NhZ2VzIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgID0+ICRERlBvc3NpYmxlVmFsdWVzeyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgICAgPT4gJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gLy8gMCwKICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFN0YXRlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU3RhdGVJRCcgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgV2UgZG9uJ3QgcmVuZGVyIEZpZWxkcyB0d2ljZSwKICAgICAgICAgICAgIyBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhIENvbmZpZyB3aXRob3V0IElELCBza2lwIHRoaXMgZmllbGQKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclN0YXRlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFF1ZXVlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnUXVldWVJRCcgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclF1ZXVlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFByaW9yaXR5CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnUHJpb3JpdHlJRCcgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclByaW9yaXR5KAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIExvY2sKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdMb2NrSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyTG9jaygKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBTZXJ2aWNlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU2VydmljZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNlcnZpY2UoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU0xBCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU0xBSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyU0xBKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIE93bmVyCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnT3duZXJJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJPd25lcigKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciByZXNwb25zaWJsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1Jlc3BvbnNpYmxlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyUmVzcG9uc2libGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgQ3VzdG9tZXJJRAogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyQ3VzdG9tZXIoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CgogICAgICAgICAgICAjIFBlbmRpbmdUaW1lIGlzIGp1c3QgdXNlZnVsIGlmIHdlIGhhdmUgU3RhdGUgb3IgU3RhdGVJRAogICAgICAgICAgICBpZiAoIG5vbmUge217XihTdGF0ZUlEfFN0YXRlKSR9eG1zfSBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmdUaW1lIGNhbiBqdXN0IGJlIHVzZWQgaWYgU3RhdGUgb3IgU3RhdGVJRCBpcyBjb25maWd1cmVkIGZvciB0aGUgc2FtZSBBY3Rpdml0eURpYWxvZy4gQWN0aXZpdHlEaWFsb2c6ICVzIScsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclBlbmRpbmdUaW1lKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFRpdGxlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnVGl0bGUnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyVGl0bGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgQXJ0aWNsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiMgUm90aGVyIE9TUyAvIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcyggJFBhcmFte0dldFBhcmFtfS0+JSogKTsKCiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckFydGljbGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBJbmZvcm1BZ2VudHMgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317QXJ0aWNsZX17Q29uZmlnfXtJbmZvcm1BZ2VudHN9LAojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU3RhbmRhcmRUZW1wbGF0ZXMsCiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFR5cGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdUeXBlSUQnICkgewoKICAgICAgICAgICAgIyBXZSBkb24ndCByZW5kZXIgRmllbGRzIHR3aWNlLAogICAgICAgICAgICAjIGlmIHRoZXJlIHdhcyBhbHJlYWR5IGEgQ29uZmlnIHdpdGhvdXQgSUQsIHNraXAgdGhpcyBmaWVsZAogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyVHlwZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGb290ZXJDU1NDbGFzcyA9ICdGb290ZXInOwoKICAgIGlmICggJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSApIHsKCiAgICAgICAgIyBEdWUgdG8gdGhlIGluaXRpYWwgbG9hZGluZyBvZgogICAgICAgICMgdGhlIGZpcnN0IEFjdGl2aXR5RGlhbG9nIGFmdGVyIFByb2Nlc3Mgc2VsZWN0aW9uCiAgICAgICAgIyB3ZSBoYXZlIHRvIGJpbmQgdGhlIEFqYXhVcGRhdGUgRnVuY3Rpb24gb24KICAgICAgICAjIHRoZSBzZWxlY3RzLCBzbyB3ZSBnZXQgdGhlIGNvbXBsZXRlIEpTT25Eb2N1bWVudENvbXBsZXRlIGNvZGUKICAgICAgICAjIGFuZCBkZWxpdmVyIGl0IGluIHRoZSBGb290ZXJKUyBibG9jay4KICAgICAgICAjIFRoaXMgSmF2YXNjcmlwdCBQYXJ0IGlzIGV4ZWN1dGVkIGluCiAgICAgICAgIyBBZ2VudFRpY2tldFByb2Nlc3MudHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9vdGVySlMnLAogICAgICAgICk7CgogICAgICAgICRGb290ZXJDU1NDbGFzcyA9ICdDZW50ZXJlZCc7CiAgICB9CgogICAgIyBzZXQgc3VibWl0IGJ1dHRvbiBkYXRhCiAgICBteSAkQnV0dG9uVGV4dCAgPSAnU3VibWl0JzsKICAgIG15ICRCdXR0b25UaXRsZSA9ICdTYXZlJzsKICAgIG15ICRCdXR0b25JRCAgICA9ICdTdWJtaXQnIC4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ307CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9ICkgewogICAgICAgICRCdXR0b25UZXh0ICA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgICAgICRCdXR0b25UaXRsZSA9ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEJ1dHRvblRleHR9OwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0Zvb3RlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvb3RlckNTU0NsYXNzID0+ICRGb290ZXJDU1NDbGFzcywKICAgICAgICAgICAgQnV0dG9uVGV4dCAgICAgPT4gJEJ1dHRvblRleHQsCiAgICAgICAgICAgIEJ1dHRvblRpdGxlICAgID0+ICRCdXR0b25UaXRsZSwKICAgICAgICAgICAgQnV0dG9uSUQgICAgICAgPT4gJEJ1dHRvbklECiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRBZHZpY2VUZXh0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VibWl0QWR2aWNlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWR2aWNlVGV4dCA9PiAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRBZHZpY2VUZXh0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVsb2FkIHBhcmVudCB3aW5kb3cKICAgIGlmICggJFBhcmFte1BhcmVudFJlbG9hZH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnUGFyZW50UmVsb2FkJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgQWRkIHRoZSBGb3JtRm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0FjdGl2aXR5RGlhbG9nRm9vdGVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICApOwoKICAgICMgZGlzcGxheSByZWd1bGFyIGZvb3RlciBvbmx5IGluIG5vbi1hamF4IGNhc2UKICAgIGlmICggISRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJFNlbGYtPntJc01haW5XaW5kb3d9ID8gJycgOiAnU21hbGwnICk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfUmVuZGVyUGVuZGluZ1RpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclBlbmRpbmdUaW1lJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclBlbmRpbmdUaW1lJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgPT4gKAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BlbmRpbmcgRGF0ZScpCiAgICAgICAgICAgICAgICAuICcgKCcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdmb3IgcGVuZGluZyogc3RhdGVzJykgLiAnKScKICAgICAgICApLAogICAgICAgIEZpZWxkSUQgPT4gJ1Jlc3BvbnNpYmxlSUQnLAogICAgICAgIEZvcm1JRCAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICApOwoKICAgIG15ICRFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICkgewogICAgICAgIGlmICggJFBhcmFte0Vycm9yfXsnUGVuZGluZ3RUaW1lRGF5J30gKSB7CiAgICAgICAgICAgICREYXRhe1BlbmRpbmd0VGltZURheUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpOwogICAgICAgICAgICAkRXJyb3IgPSAkUGFyYW17RXJyb3J9eydQZW5kaW5ndFRpbWVEYXknfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17RXJyb3J9eydQZW5kaW5ndFRpbWVIb3VyJ30gKSB7CiAgICAgICAgICAgICREYXRhe1BlbmRpbmd0VGltZUhvdXJFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKTsKICAgICAgICAgICAgJEVycm9yID0gJFBhcmFte0Vycm9yfXsnUGVuZGluZ3RUaW1lRGF5J307CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWxlbmRhciA9ICcnOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdXNlZCBjYWxlbmRhciBpZiB3ZSBoYXZlIHRpY2tldCBkYXRhCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICkgewogICAgICAgICRDYWxlbmRhciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgICAgICAleyAkUGFyYW17VGlja2V0fSB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpLT57UXVpY2tEYXRlQnV0dG9uc30KICAgICAgICAvLyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkRlZmF1bHRRdWlja0RhdGVCdXR0b25zJyk7CgogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ICAgICAgICAgICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFBlbmRpbmdUaW1lUmVxdWlyZWQgPT4KICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyCiAgICAgICAgICAgICkgPyAxIDogMCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICB8fCA4NjQwMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkRXJyb3IsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgID0+ICRDYWxlbmRhciwKICAgICAgICBRdWlja0RhdGVCdXR0b25zICAgICA9PiAkUXVpY2tEYXRlQnV0dG9ucywKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpQZW5kaW5nVGltZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UGVuZGluZ1RpbWU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpQZW5kaW5nVGltZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1BlbmRpbmdUaW1lJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJEeW5hbWljRmllbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIEZpZWxkTmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyRHluYW1pY0ZpZWxkJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9eyAkUGFyYW17RmllbGROYW1lfSB9OwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICBteSAkTWVzc2FnZSA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICBIVE1MICAgID0+ICcnLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFNlcnZlckVycm9yOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17RXJyb3J9eyAkUGFyYW17RmllbGROYW1lfSB9CiAgICAgICAgICAgICYmICRQYXJhbXtFcnJvcn17ICRQYXJhbXtGaWVsZE5hbWV9IH0gbmUgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlcnZlckVycm9yID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEVycm9yTWVzc2FnZSA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yTWVzc2FnZXN9ICkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtFcnJvck1lc3NhZ2VzfXsgJFBhcmFte0ZpZWxkTmFtZX0gfQogICAgICAgICAgICAmJiAkUGFyYW17RXJyb3JNZXNzYWdlc317ICRQYXJhbXtGaWVsZE5hbWV9IH0gbmUgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICRQYXJhbXtFcnJvck1lc3NhZ2VzfXsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBhcmFte1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIsCiAgICAgICAgQUNMSGlkZGVuICAgICAgICAgICAgPT4gKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiAmJiAhJFBhcmFte1Zpc2liaWxpdHl9ICksCiAgICAgICAgU2VydmVyRXJyb3IgICAgICAgICAgPT4gJFNlcnZlckVycm9yLAogICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRFcnJvck1lc3NhZ2UsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gJFBhcmFte09iamVjdH0sCiAgICApOwoKICAgIG15ICRGaWVsZENsYXNzZXMgPSAnRmllbGQnIC4gKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnUmljaFRleHQnID8gJyBSaWNoVGV4dEZpZWxkJyA6ICcnICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTmFtZSAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICBMYWJlbCAgICAgICAgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgSGlkZGVuQ2xhc3MgID0+ICEkUGFyYW17VmlzaWJpbGl0eX0gPyAnIG9vb0FDTEhpZGRlbicgOiAnJywKICAgICAgICBGaWVsZENsYXNzZXMgPT4gJEZpZWxkQ2xhc3NlcywKICAgICk7CgogICAgIyBoYW5kbGUgbXVsdGl2YWx1ZSBmaWVsZAogICAgaWYgKCAkRHluYW1pY0ZpZWxkSFRNTC0+e011bHRpVmFsdWV9ICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93X0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVDb2x1bW5zID0+ICcxZnInLAogICAgICAgICAgICAgICAgUm93Q2xhc3NlcyAgICAgID0+ICcgTXVsdGlWYWx1ZScsCiAgICAgICAgICAgICAgICBIaWRkZW5DbGFzcyAgICAgPT4gISRQYXJhbXtWaXNpYmlsaXR5fSA/ICcgb29vQUNMSGlkZGVuJyA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIG9uZSBibG9jayBmb3IgZWFjaCBtdWx0aXZhbHVlIGl0ZW0KICAgICAgICBmb3IgbXkgJE11bHRpVmFsdWVJbmRleCAoIDAgLi4gJCN7ICREeW5hbWljRmllbGRIVE1MLT57TXVsdGlWYWx1ZX0gfSApIHsKCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID0gJER5bmFtaWNGaWVsZEhUTUwtPntNdWx0aVZhbHVlfVskTXVsdGlWYWx1ZUluZGV4XTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OkR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICBNdWx0aVZhbHVlID0+IDEsCgogICAgICAgICAgICAgICAgICAgICMgVE9ETyBhc2sgYWJvdXQgdGhpcwogICAgICAgICAgICAgICAgICAgICMgUm93UmVhZE9ubHkgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9LAogICAgICAgICAgICAgICAgICAgIENvbHVtbkNsYXNzZXMgPT4gJyBNdWx0aVZhbHVlXycgLiAkTXVsdGlWYWx1ZUluZGV4LAogICAgICAgICAgICAgICAgICAgIENvbHVtblN0eWxlICAgPT4gJ2dyaWQtY29sdW1uOiAxIC8gc3BhbiAxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbmRlciBzaG9ydCBkZXNjcmlwdGlvbiBvbmNlIGZvciBmaXJzdCBlbGVtZW50CiAgICAgICAgICAgIGlmICggISRNdWx0aVZhbHVlSW5kZXggKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdydzpEeW5hbWljRmllbGQ6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW5kZXIgbG9uZyBkZXNjcmlwdGlvbiBvbmNlIGZvciBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgaWYgKCAkTXVsdGlWYWx1ZUluZGV4ID09ICQjeyAkRHluYW1pY0ZpZWxkSFRNTC0+e011bHRpVmFsdWV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRNdWx0aVZhbHVlVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICREeW5hbWljRmllbGRIVE1MLT57TXVsdGlWYWx1ZVRlbXBsYXRlfSwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgQ29sdW1uU3R5bGUgPT4gJ2dyaWQtY29sdW1uOiAxIC8gc3BhbiAxJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHJlbmRlciBzaG9ydCBkZXNjcmlwdGlvbiBvbmNlIGZvciBmaXJzdCBlbGVtZW50CiAgICAgICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdydzpEeW5hbWljRmllbGQ6RGVzY3JpcHRpb25Mb25nVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YXtDb250ZW50fSA9ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30KICAgICAgICAgICAgICAgICAgICB8fCAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdydzpEeW5hbWljRmllbGQ6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUZW1wbGF0ZUZpbGUgPSAnUHJvY2Vzc01hbmFnZW1lbnQvJyAuICggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317TXVsdGlWYWx1ZX0gPyAnUm93RHluYW1pY0ZpZWxkJyA6ICdEeW5hbWljRmllbGQnICk7CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAkVGVtcGxhdGVGaWxlICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclRpdGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJUaXRsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJUaXRsZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRUaXRsZSA9ICRQYXJhbXtUaWNrZXR9e1RpdGxlfSAvLyAnJzsKCiAgICBpZiAoICEkVGl0bGUgJiYgJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9ICkgewogICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFRpdGxlID0gJFRpY2tldHtUaXRsZX07CiAgICB9CgogICAgJFBhcmFte0dldFBhcmFtfXtUaXRsZX0gLy89ICRUaXRsZTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVGl0bGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBWYWx1ZSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17VGl0bGV9LAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1RpdGxlJ30gKSB7CiAgICAgICAgJERhdGF7U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvVGl0bGUnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJBcnRpY2xlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQgVGlja2V0KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJBcnRpY2xlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckFydGljbGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX0gKSApIHsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHN1YmplY3QKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldE51bWJlciwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIGJvZHkgcHJlcGFyYXRpb24gZm9yIHBsYWluIHRleHQgcHJvY2Vzc2luZwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgPT4gJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9e0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLAogICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtHZXRQYXJhbX17Qm9keX0sCgogICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCcpLAoKICAgICAgICAgICAgIyBEaXNhbGxvdyBwb3RlbnRpYWxseSB1bnNhZmUgY29udGVudC4KICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtCb2R5fSA9ICRTYWZldHlDaGVja1Jlc3VsdHtTdHJpbmd9OwogICAgfQoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FydGljbGUnLAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICAgICBTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAogICAgICAgIExhYmVsU3ViamVjdCAgICAgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317TGFiZWxTdWJqZWN0fQogICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlN1YmplY3QiKSwKICAgICAgICBMYWJlbEJvZHkgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317TGFiZWxCb2R5fQogICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRleHQiKSwKICAgICAgICBBdHRhY2htZW50TGlzdCA9PiAkUGFyYW17QXR0YWNobWVudExpc3R9LAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydBcnRpY2xlU3ViamVjdCd9ICkgewogICAgICAgICREYXRhe1N1YmplY3RTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J0FydGljbGVCb2R5J30gKSB7CiAgICAgICAgJERhdGF7Qm9keVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpBcnRpY2xlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW5TdWJqZWN0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW5Cb2R5JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfXtSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkFydGljbGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICBteSAkQWN0aXZhdGVTdGFuZGFyZFRlbXBsYXRlcyA9IGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317U3RhbmRhcmRUZW1wbGF0ZXN9ID8gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317U3RhbmRhcmRUZW1wbGF0ZXN9IDogMTsKICAgIGlmICggJEFjdGl2YXRlU3RhbmRhcmRUZW1wbGF0ZXMgKSB7CgogICAgICAgICMgY2hlY2sgaWYgZXhpc3RzIGNyZWF0ZSB0ZW1wbGF0ZXMgcmVnYXJkbGVzcyB0aGUgcXVldWUKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyk7CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBUeXBlICA9PiAnUHJvY2Vzc0RpYWxvZycsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApIHsKCiAgICAgICAgICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTdGFuZGFyZFRlbXBsYXRlSUR9OwogICAgICAgICAgICBpZiAoJFN0YW5kYXJkVGVtcGxhdGVJRFBhcmFtKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTdGFuZGFyZFRlbXBsYXRlSUQnfSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZXN9IHx8IHt9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgojIEVPIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgIGlmICggJFBhcmFte0luZm9ybUFnZW50c30gKSB7CgogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17VGlja2V0fXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkluZm9ybUFnZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1RpbWVVbml0cyd9ICkgewogICAgICAgICRQYXJhbXtUaW1lVW5pdHNJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBzaG93IHRpbWUgdW5pdHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17Q29uZmlnfXtUaW1lVW5pdHN9CiAgICAgICAgKQogICAgewoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17Q29uZmlnfXtUaW1lVW5pdHN9ID09IDEgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CgogICAgICAgICMgR2V0IFRpbWVVbml0cyB2YWx1ZS4KICAgICAgICAkUGFyYW17VGltZVVuaXRzfSA9ICRQYXJhbXtHZXRQYXJhbX17VGltZVVuaXRzfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VGltZVVuaXRzfSAmJiAkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHN9ID0gJFNlbGYtPl9HZXRUaW1lVW5pdHMoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0FydGljbGUnICksCiAgICB9Owp9CgpzdWIgX0dldFRpbWVVbml0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJyc7CgogICAgIyBHZXQgYWNjb3VudGVkIHRpbWUgaWYgQWNjb3VudFRpbWUgY29uZmlnIGl0ZW0gaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICYmIGRlZmluZWQgJFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgJEFjY291bnRlZFRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEFjY291bnRlZFRpbWUgPyAkQWNjb3VudGVkVGltZSA6ICcnOwp9CgpzdWIgX1JlbmRlckN1c3RvbWVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJDdXN0b21lcicgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJDdXN0b21lcicgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gKCk7CgogICAgbXkgJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklEID0gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lclVzZXJJRH07CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWxDdXN0b21lclVzZXIgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIiksCiAgICAgICAgTGFiZWxDdXN0b21lcklEICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJDdXN0b21lcklEIiksCiAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCAgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmVyIGVycm9ycwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICREYXRhe0N1c3RvbWVyQXV0b0NvbXBsZXRlU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9e0N1c3RvbWVySUR9ICkgewogICAgICAgICREYXRhe0N1c3RvbWVySURTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKAogICAgICAgICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9ICkKICAgICAgICB8fCAkU3VibWl0dGVkQ3VzdG9tZXJVc2VySUQKICAgICAgICApCiAgICB7CiAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICB8fCAkUGFyYW17VGlja2V0fXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEN1c3RvbWVyIHVzZXIgZnJvbSBhcnRpY2xlIGlzIHByZXNlbGVjdGVkIGZvciBuZXcgc3BsaXQgdGlja2V0LiBTZWUgYnVnIzEyOTU2LgogICAgaWYgKAogICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX0gKQogICAgICAgICYmICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtGcm9tfQogICAgICAgICYmICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInCiAgICAgICAgKQogICAgewoKICAgICAgICBteSBAQXJ0aWNsZUZyb21BZGRyZXNzID0gTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtGcm9tfSApOwoKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgICAgIG15ICVMaXN0ICAgICAgICAgICAgICAgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkQXJ0aWNsZUZyb21BZGRyZXNzWzBdLT5hZGRyZXNzKCksCiAgICAgICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyID0gc29ydCBrZXlzICVMaXN0OwogICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyWzBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGZpZWxkIGFzICJGaXJzdE5hbWUgTGFzdG5hbWUiIDxNYWlsQWRkcmVzcz4KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlQ3VzdG9tZXJVc2VyRGF0YSApICkgewogICAgICAgICREYXRhe0N1c3RvbWVyVXNlcklEfSAgICAgICA9ICJcIiRDdXN0b21lclVzZXJEYXRhe1VzZXJGdWxsbmFtZX0iIC4gIlwiIDwkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9PiI7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJJRH0gICAgICAgICAgID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9IHx8ICcnOwogICAgICAgICREYXRhe1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJJRH0gICAgICAgICB8fCAnJzsKICAgIH0KCiAgICAjIFdoZW4gdGhlcmUgaXMgbm8gQ3VzdG9tZXIgaW4gdGhlIERCLCBpdCBjb3VsZCBiZSB1bmtub3duIEN1c3RvbWVyLCBzZXQgaXQgZnJvbSB0aGUgdGlja2V0LgogICAgIyBTZWUgYnVnIzEyNzk3ICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc5NyApLgogICAgZWxzZSB7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJVc2VySUR9ID0gJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9IHx8ICcnOwogICAgICAgICREYXRhe0N1c3RvbWVySUR9ICAgICA9ICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVySUR9ICAgICB8fCAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkRGF0YXtEZXNjcmlwdGlvblNob3J0fSA9ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OkN1c3RvbWVyJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW5DdXN0b21lclVzZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6Q3VzdG9tZXI6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9DdXN0b21lcicgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUmVzcG9uc2libGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICB9CgogICAgbXkgJFJlc3BvbnNpYmxlcyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKCAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIFJlc3BvbnNpYmxlQWxsICAgPT4gJFBhcmFte0dldFBhcmFtfXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIGlmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgICAgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSApIHsKCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUmVzcG9uc2libGUnICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzcG9uc2libGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtSZXNwb25zaWJsZUlEfTsKICAgIGlmICggJFJlc3BvbnNpYmxlSURQYXJhbSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlcklEID0+ICRSZXNwb25zaWJsZUlEUGFyYW0gKTsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIG5vIHVzZXIgZnJvbSBHZXRQYXJhbSBvciBkZWZhdWx0IGFuZCB0aGUgZmllbGQgaXMgbWFuZGF0b3J5IGdldCBpdCBmcm9tIHRoZSB0aWNrZXQKICAgICMgICAgKGlmIGFueSkKICAgIGlmICgKICAgICAgICAhJFNlbGVjdGVkVmFsdWUKICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMgogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17UmVzcG9uc2libGV9OwogICAgfQoKICAgICMgaWYgd2UgaGF2ZSBhIHVzZXIgYWxyZWFkeSBhbmQgdGhlIGZpZWxkIGlzIG5vdCBtYW5kYXRvcnkgYW5kIGl0IGlzIHRoZSBzYW1lIGFzIGluIHRpY2tldCwgdGhlbgogICAgIyAgICBzZXQgaXQgdG8gbm9uZSAoYXMgaXQgZG9lc24ndCBuZWVkIHRvIGJlIGNoYW5nZWQgYWZ0ZXIgYWxsKQogICAgZWxzaWYgKAogICAgICAgICRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICE9IDIKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKQogICAgICAgICYmICRTZWxlY3RlZFZhbHVlIGVxICRQYXJhbXtUaWNrZXR9e1Jlc3BvbnNpYmxlfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICcnOwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1Jlc3BvbnNpYmxlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZElEID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17UmVzcG9uc2libGVJRH07CiAgICB9CgogICAgIyBidWlsZCBSZXNwb25zaWJsZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZXMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkSUQsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICJNb2Rlcm5pemUgRm9ybVVwZGF0ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlJlc3BvbnNpYmxlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UmVzcG9uc2libGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpSZXNwb25zaWJsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1Jlc3BvbnNpYmxlJyApLAogICAgfTsKCn0KCnN1YiBfUmVuZGVyT3duZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlck93bmVyJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlck93bmVyJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e093bmVyQWxsfSA9IDE7CiAgICB9CgogICAgbXkgJE93bmVycyA9ICRTZWxmLT5fR2V0T3duZXJzKCAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiT3duZXIiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE93bmVyQWxsICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtPd25lckFsbH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIGlmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgICAgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSApIHsKCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnT3duZXInICkgewoKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPd25lcklEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e093bmVySUR9OwogICAgaWYgKCAkT3duZXJJRFBhcmFtICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VySUQgPT4gJE93bmVySURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gdXNlciBmcm9tIEdldFBhcmFtIG9yIGRlZmF1bHQgYW5kIHRoZSBmaWVsZCBpcyBtYW5kYXRvcnkgZ2V0IGl0IGZyb20gdGhlIHRpY2tldAogICAgIyAgICAoaWYgYW55KQogICAgaWYgKAogICAgICAgICEkU2VsZWN0ZWRWYWx1ZQogICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtPd25lcn07CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIGEgdXNlciBhbHJlYWR5IGFuZCB0aGUgZmllbGQgaXMgbm90IG1hbmRhdG9yeSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gdGlja2V0LCB0aGVuCiAgICAjICAgIHNldCBpdCB0byBub25lIChhcyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCBhZnRlciBhbGwpCiAgICBlbHNpZiAoCiAgICAgICAgJFNlbGVjdGVkVmFsdWUKICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gIT0gMgogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgJiYgJFNlbGVjdGVkVmFsdWUgZXEgJFBhcmFte1RpY2tldH17T3duZXJ9CiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJyc7CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnT3duZXJJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e093bmVySUR9OwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIE93bmVyIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ093bmVySUQnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCB8fCAnJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6T3duZXInLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpPd25lcjpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3Ok93bmVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvT3duZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNMQSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU0xBJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclNMQScgKSwKICAgICAgICB9OwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtRdWV1ZUlEfSAgICAgICAgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtRdWV1ZUlEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1RpY2tldElEfSAgICAgICA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1RpY2tldElEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e0N1c3RvbWVyVXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIEdldFBhcmFtCiAgICBteSAlR2V0U2VydmljZXNQYXJhbSA9ICV7ICRQYXJhbXtHZXRQYXJhbX0gfTsKCiAgICAjIHVzZSB0aWNrZXQgaW5mb3JtYXRpb24gYXMgYSBmYWxsIGJhY2sgaWYgY3VzdG9tZXIgd2FzIGFscmVhZHkgc2V0LCBvdGhlcndpc2Ugd2hlbiB0aGUKICAgICMgYWN0aXZpdHkgZGlhbG9nIGRpc3BsYXlzIHRoZSBzZXJ2aWNlIGxpc3Qgd2lsbCBiZSBpbml0aWFsbHkgZW1wdHksIHNlZSBidWcjMTAwNTkKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgKSB7CiAgICAgICAgJEdldFNlcnZpY2VzUGFyYW17Q3VzdG9tZXJVc2VySUR9IHx8PSAkUGFyYW17VGlja2V0fXtDdXN0b21lclVzZXJJRH0gfHw9ICcnOwogICAgfQoKICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgJUdldFNlcnZpY2VzUGFyYW0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtTZXJ2aWNlc30gID0gJFNlcnZpY2VzOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17U2VydmljZUlEfSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1NlcnZpY2VJRH07CiAgICB9CgogICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlNMQSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBTTEEgb2JqZWN0CiAgICBteSAkU0xBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwoKICAgIG15ICRTTEFJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTTEFJRH07CiAgICBpZiAoJFNMQUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCggU0xBSUQgPT4gJFNMQUlEUGFyYW0gKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTTEEnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTTEEgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9e1NMQX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnU0xBSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtTTEF9OwogICAgfQoKICAgICMgYnVpbGQgU0xBIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTTEFzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6U0xBJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6U0xBOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U0xBOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvU0xBJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJTZXJ2aWNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTZXJ2aWNlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclNlcnZpY2UnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRQYXJhbXtHZXRQYXJhbX17UXVldWVJRH0gICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17UXVldWVJRH07CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH0gICAgICAgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtUaWNrZXRJRH07CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtDdXN0b21lclVzZXJJRH0gPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtDdXN0b21lclVzZXJJRH07CiAgICB9CgogICAgIyBjcmVhdGUgYSBsb2NhbCBjb3B5IG9mIHRoZSBHZXRQYXJhbQogICAgbXkgJUdldFNlcnZpY2VzUGFyYW0gPSAleyAkUGFyYW17R2V0UGFyYW19IH07CgogICAgIyB1c2UgdGlja2V0IGluZm9ybWF0aW9uIGFzIGEgZmFsbCBiYWNrIGlmIGN1c3RvbWVyIHdhcyBhbHJlYWR5IHNldCwgb3RoZXJ3aXNlIHdoZW4gdGhlCiAgICAjIGFjdGl2aXR5IGRpYWxvZyBkaXNwbGF5cyB0aGUgc2VydmljZSBsaXN0IHdpbGwgYmUgaW5pdGlhbGx5IGVtcHR5LCBzZWUgYnVnIzEwMDU5CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICkgewogICAgICAgICRHZXRTZXJ2aWNlc1BhcmFte0N1c3RvbWVyVXNlcklEfSB8fD0gJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9IHx8PSAnJzsKICAgIH0KCiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICVHZXRTZXJ2aWNlc1BhcmFtLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgc2VydmljZSBvYmplY3QKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICBteSAkU2VydmljZUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1NlcnZpY2VJRH07CiAgICBpZiAoJFNlcnZpY2VJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17U2VydmljZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnU2VydmljZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17U2VydmljZX07CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgVHJlZVZpZXcgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gJFRyZWVWaWV3LAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlNlcnZpY2UnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpTZXJ2aWNlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U2VydmljZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1NlcnZpY2UnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJMb2NrIHsKCiAgICAjIGZvciBsb2NrIHN0YXRlcyB0aGVyZSdzIG5vIEFDTCBjaGVja2luZyB5ZXQgaW1wbGVtZW50ZWQgc28gbm8gY2hlY2tpbmcuLi4KCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyTG9jaycgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJMb2NrJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJExvY2tzID0gJFNlbGYtPl9HZXRMb2NrcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJMb2NrIHN0YXRlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBsb2NrIG9iamVjdAogICAgbXkgJExvY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpOwoKICAgIG15ICRMb2NrSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17TG9ja0lEfTsKICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoIExvY2tJRCA9PiAkTG9ja0lEUGFyYW0gKQogICAgICAgIGlmICgkTG9ja0lEUGFyYW0pOwoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ0xvY2snICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoCiAgICAgICAgICAgICAgICBMb2NrID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRMb2NrT2JqZWN0LT5Mb2NrTG9va3VwKAogICAgICAgICAgICBMb2NrSUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiAhJFNlbGVjdGVkVmFsdWU7CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17TG9ja307CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnTG9ja0lEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17TG9ja307CiAgICB9CgogICAgIyBidWlsZCBsb2NrIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRMb2NrcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6TG9jaycsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OkxvY2s6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpMb2NrOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvTG9jaycgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUHJpb3JpdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclByaW9yaXR5JyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclByaW9yaXR5JyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiUHJpb3JpdHkiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBwcmlvcml0eSBvYmplY3QKICAgIG15ICRQcmlvcml0eU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpOwoKICAgIG15ICRQcmlvcml0eUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1ByaW9yaXR5SUR9OwogICAgaWYgKCRQcmlvcml0eUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXR5SURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1ByaW9yaXR5JyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9e1ByaW9yaXR5fTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydQcmlvcml0eUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17UHJpb3JpdHl9OwogICAgfQoKICAgICMgYnVpbGQgbmV4dCBQcmlvcml0aWVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UHJpb3JpdHknLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpQcmlvcml0eTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlByaW9yaXR5OkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUHJpb3JpdHknICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclF1ZXVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJRdWV1ZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJRdWV1ZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRRdWV1ZXMgPSAkU2VsZi0+X0dldFF1ZXVlcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUbyBxdWV1ZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAjIGlmIHdlIGdvdCBRdWV1ZUlEIGFzIFBhcmFtIGZyb20gdGhlIEdVSQogICAgbXkgJFF1ZXVlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UXVldWVJRH07CiAgICBpZiAoJFF1ZXVlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUXVldWUnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17UXVldWV9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1F1ZXVlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtRdWV1ZX07CiAgICB9CgogICAgIyBidWlsZCBuZXh0IHF1ZXVlcyBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUXVldWVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICAgICBUcmVlVmlldyAgICAgID0+ICRUcmVlVmlldywKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlF1ZXVlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UXVldWU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpRdWV1ZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1F1ZXVlJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJTdGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU3RhdGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU3RhdGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkU3RhdGVzID0gJFNlbGYtPl9HZXRTdGF0ZXMoICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXh0IHRpY2tldCBzdGF0ZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICBteSAkU3RhdGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTdGF0ZUlEfTsKICAgIGlmICgkU3RhdGVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKCBTdGF0ZUlEID0+ICRTdGF0ZUlEUGFyYW0gKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTdGF0ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgU3RhdGUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtTdGF0ZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnU3RhdGVJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6U3RhdGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpTdGF0ZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlN0YXRlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvU3RhdGUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclR5cGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclR5cGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVHlwZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgdHlwZSBvYmplY3QKICAgIG15ICRUeXBlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKCiAgICBteSAkVHlwZUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1R5cGVJRH07CiAgICBpZiAoJFR5cGVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZUlEID0+ICRUeXBlSURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1R5cGUnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17VHlwZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnVHlwZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17VHlwZX07CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRUeXBlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSBGb3JtVXBkYXRlICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBNYXggICAgICAgICAgID0+IDIwMCwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6VHlwZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlR5cGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9UeXBlJyApLAogICAgfTsKfQoKc3ViIF9TdG9yZUFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH07CiAgICBteSAkUHJvY2Vzc1N0YXJ0cG9pbnQ7CiAgICBteSAlVGlja2V0OwogICAgbXkgJFByb2Nlc3NFbnRpdHlJRDsKICAgIG15ICRBY3Rpdml0eUVudGl0eUlEOwogICAgbXkgJUVycm9yOwogICAgbXkgJUVycm9yTWVzc2FnZXM7CgogICAgbXkgJVRpY2tldFBhcmFtOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQgbWlzc2luZyEnKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFjdGl2aXR5IGRpYWxvZyBvYmplY3QKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZyAgICAgICA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGdldCBDb25maWcgZm9yIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgY2hlY2sgZWFjaCBGaWVsZCBvZiBhbiBBY3Rpdml0eSBEaWFsb2cgYW5kIGZpbGwgdGhlIGVycm9yIGhhc2ggaWYgc29tZXRoaW5nIGdvZXMgaG9ycmlibHkgd3JvbmcKICAgIG15ICVDaGVja2VkRmllbGRzOwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgaGFuZGxlIGR5bmFtaWMgZmllbGRzIHNlcGFyYXRlbHkKICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lcklEJwogICAgICAgICAgICB8fCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXsnQ3VzdG9tZXJJRCd9IH07CgogICAgICAgICAgICAjIGlzIG5vdCBwb3NzaWJsZSB0byBhIGhhdmUgYW4gaW52aXNpYmxlIGZpZWxkIGZvciB0aGlzIHBhcnRpY3VsYXIgdmFsdWUKICAgICAgICAgICAgIyBvbiBhZ2VudCBpbnRlcmZhY2UKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rpc3BsYXl9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZG5cJ3QgdXNlIEN1c3RvbWVySUQgYXMgYW4gaW52aXNpYmxlIGZpZWxkLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ3VzdG9tZXJJRCBzaG91bGQgbm90IGJlIG1hbmRhdG9yeSBhcyBpbiBvdGhlciBzY3JlZW5zCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfSA9ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJJRH0gfHwgJyc7CgogICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHkgVGlja2V0Q3JlYXRlIG5lZWRzICdDdXN0b21lclVzZXInIGFzIHBhcmFtIGluc3RlYWQgb2YgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CgogICAgICAgICAgICAjIGZhbGwtYmFjaywgaWYgY3VzdG9tZXIgYXV0by1jb21wbGV0ZSBkb2VzIG5vdCBzaG93biBhbnkgcmVzdWx0cywgdGhlbiB0cnkgdG8gdXNlCiAgICAgICAgICAgICMgdGhlIGNvbnRlbnQgb2YgdGhlIG9yaWdpbmFsIGZpZWxkIGFzIGN1c3RvbWVyIHVzZXIgaWQKICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyVXNlcklEICkgewoKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lckF1dG9Db21wbGV0ZScgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJVc2VySUQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJVc2VySUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0N1c3RvbWVyVXNlcklEJ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0gPSAkQ3VzdG9tZXJVc2VySUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CgogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDdXJyZW50RmllbGQgZXEgJ1BlbmRpbmdUaW1lJyApIHsKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgVmFsdWVzIG90aGVyd2lzZSB0YWtlIGFuIGVtcHR5IHN0cmluZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0dldFBhcmFtfXtQZW5kaW5nVGltZX0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfXtZZWFyfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfXtNb250aH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfXtQZW5kaW5nVGltZX17RGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfXtIb3VyfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfXtNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRQYXJhbXtHZXRQYXJhbX17UGVuZGluZ1RpbWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgbm8gUGVuZGluZyBzdGF0dXMgd2UgaGF2ZSBubyB0aW1lIHRvIHNldAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDaGVja2VkRmllbGRzeydQZW5kaW5nVGltZSd9ID0gMTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBza2lwIGlmIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBJRCBvciBOYW1lCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9DaGVja0ZpZWxkKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAleyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0ICkgewoKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlIGZvciBBcnRpY2xlIChTdWJqZWN0ICYgQm9keSkKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlUGFydCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17R2V0UGFyYW19eyRBcnRpY2xlUGFydH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgZXJyb3IgZm9yIGVhY2ggcGFydCAoaWYgYW55KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAnQXJ0aWNsZScgLiAkQXJ0aWNsZVBhcnQgfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhbGwgb3RoZXIgZmllbGRzCiAgICAgICAgICAgICAgICBlbHNpZiAoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJwogICAgICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtDb25maWd9e1RpbWVVbml0c30KICAgICAgICAgICAgICAgICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17Q29uZmlnfXtUaW1lVW5pdHN9ID09IDIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1RpbWVVbml0c30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IGVycm9yIGZvciB0aGUgdGltZS11bml0cyAoaWYgYW55KQogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzJ30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNpZiAoJFJlc3VsdCkgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gJFJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgc2tpcCB2YWxpZGF0aW9uIG9mIGhpZGRlbiBmaWVsZHMKICAgIG15ICVWaXNpYmlsaXR5OwoKICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgbXkgJUR5bmFtaWNGaWVsZEFjbCA9IG1hcCB7ICRfID0+ICRfIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgIG15ICRBQ0xSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+JSosCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnRm9ybScsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMCB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMSB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgIH0KCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CgogICAgICAgICMgR2V0IHRoZSBDb25maWcgb2YgdGhlIGN1cnJlbnQgRHluYW1pY0ZpZWxkICh0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ3JlcCByZXN1bHQgYXJyYXkpCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX07CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkUGFyYW17RmllbGROYW1lfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgV2lsbCBiZSBleHRlbmRlZCBsYXRlciBvbiBmb3IgQUNMIENoZWNraW5nOgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+JSosCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQb3NzaWJsZVZhbHVlc0ZpbHRlciA9ICRQb3NzaWJsZVZhbHVlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJER5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAjIGlmIHdlIGhhdmUgYW4gaW52aXNpYmxlIGZpZWxkLCB1c2UgY29uZmlnIGRlZmF1bHQgdmFsdWUKICAgICAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfXtEaXNwbGF5fSA9PSAwICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfXtEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiBsZW5ndGggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfXtEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgZmllbGRzIHdoaWNoIGFyZSBoaWRkZW4gYnkgQUNMcwogICAgICAgIGVsc2lmICggISRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgdmFsaWRhdGUgdmlzaWJsZSBmaWVsZHMKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJE1hbmRhdG9yeSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0KICAgICAgICAgICAgICAgID8gKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9e0Rpc3BsYXl9ID09IDIgKQogICAgICAgICAgICAgICAgOiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fTsKCiAgICAgICAgICAgICMgQ2hlY2sgRHluYW1pY0ZpZWxkIFZhbHVlcwogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRNYW5kYXRvcnksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICRFcnJvck1lc3NhZ2VzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICA9ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfTsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPQogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBwcm9jZXNzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnID0+IHsKICAgICAgICAgICAgQWN0aXZpdHlPYmplY3QgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5JyksCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nT2JqZWN0ICAgPT4gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LAogICAgICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbicpLAogICAgICAgICAgICBUcmFuc2l0aW9uQWN0aW9uT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbicpLAogICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgIG15IEBOb3RpZnk7CgogICAgbXkgJE5ld1RpY2tldElEOwogICAgbXkgJE5ld093bmVySUQ7CiAgICBpZiAoICEkVGlja2V0SUQgKSB7CgogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e1Byb2Nlc3NFbnRpdHlJRH07CiAgICAgICAgaWYgKCAhJFByb2Nlc3NFbnRpdHlJRCApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdNaXNzaW5nIFByb2Nlc3NFbnRpdHlJRCwgY2hlY2sgeW91ciBBY3Rpdml0eURpYWxvZ0hlYWRlci50dCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQcm9jZXNzU3RhcnRwb2ludCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQcm9jZXNzU3RhcnRwb2ludAogICAgICAgICAgICB8fCAhSXNIYXNoUmVmV2l0aERhdGEoJFByb2Nlc3NTdGFydHBvaW50KQogICAgICAgICAgICB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHl9IHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEFjdGl2aXR5RW50aXR5SUQgPSAkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX07CgogICAgICAgIE5FRURFRExPT1A6CiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkpKSB7CgogICAgICAgICAgICBpZiAoICEkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyROZWVkZWR9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBpZiBhIHJlcXVpcmVkIGZpZWxkIGhhcyBubyB2YWx1ZSBjYWxsIF9DaGVja0ZpZWxkIGFzIGZpbGVkIGlzIGhpZGRlbgogICAgICAgICAgICAgICAgIyAoTm8gRGlzcGxheSBwYXJhbSA9IERpc3BsYXkgPT4gMCkgYW5kIG5vIERlZmF1bHRWYWx1ZSwgdG8gdXNlIGdsb2JhbCBkZWZhdWx0IGFzCiAgICAgICAgICAgICAgICAjIGZhbGwtYmFjay4gT25lIHJlYXNvbiBmb3IgdGhpcyB0byBoYXBwZW4gaXMgdGhhdCBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWUgdHJpZWQKICAgICAgICAgICAgICAgICMgdG8gc2V0IGJlZm9yZSwgd2FzIG5vdCB2YWxpZC4KICAgICAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X0NoZWNrRmllbGQoCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJFNlbGYtPntOYW1lVG9JRH17JE5lZWRlZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkU2VsZi0+e05hbWVUb0lEfXskTmVlZGVkfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JE5lZWRlZH0gfSA9ICRSZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGFkIG5vIEVycm9ycywgd2UgY2FuIGNyZWF0ZSB0aGUgVGlja2V0IGFuZCBTZXQgQWN0aXZpdHlFbnRpdHlJRCBhcyB3ZWxsIGFzCiAgICAgICAgIyBQcm9jZXNzRW50aXR5SUQKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVFcnJvciApICkgewoKICAgICAgICAgICAgJFRpY2tldFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICAgICBpZiAoICRUaWNrZXRQYXJhbXtPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICROZXdPd25lcklEID0gJFRpY2tldFBhcmFte093bmVySUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNldCBPd25lcklEIHRvIDEgb24gVGlja2V0Q3JlYXRlLiBUaGlzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciBvbiwgc28gZXZlbnRzIGNhbiBiZSB0cmlnZ2VyZWQuCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtPd25lcklEfSA9IDE7CgogICAgICAgICAgICAjIGlmIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIHRpY2tldCB0aXRsZSBzZXQgYSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmICggISRUaWNrZXRQYXJhbXtUaXRsZX0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGN1cnJlbnQgc2VydmVyIFRpbWUtc3RhbXAKICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgICAgICBteSAkQ3VycmVudFRpbWVTdGFtcCA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIG15ICRPVE9CT1RpbWVab25lICAgID0gJERhdGVUaW1lT2JqZWN0LT5PVE9CT1RpbWVab25lR2V0KCk7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gIiRQYXJhbXtQcm9jZXNzTmFtZX0gLSAkQ3VycmVudFRpbWVTdGFtcCAoJE9UT0JPVGltZVpvbmUpIjsKCiAgICAgICAgICAgICAgICAjIHVzZSBhcnRpY2xlIHN1YmplY3QgZnJvbSB0aGUgd2ViIHJlcXVlc3QgaWYgYW55CiAgICAgICAgICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gJFBhcmFte0dldFBhcmFtfXtTdWJqZWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgdGlja2V0CiAgICAgICAgICAgICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSglVGlja2V0UGFyYW0pOwoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldElEICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBjcmVhdGUgdGlja2V0IGZvciBQcm9jZXNzIHdpdGggUHJvY2Vzc0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NUaWNrZXRQcm9jZXNzU2V0KAogICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBzZXQgUHJvY2Vzc0VudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU3VjY2VzcyA9IHVuZGVmOwoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0KAogICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHl9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBzZXQgQWN0aXZpdHlFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHN0b3JlIEFjdGl2aXR5RGlhbG9nLCBpbnZhbGlkIFRpY2tldElEOiAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbWVtYmVyIG5ldyBjcmVhdGVkIFRpY2tldElECiAgICAgICAgICAgICROZXdUaWNrZXRJRCA9ICRUaWNrZXRJRDsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCAkVGlja2V0SUQgJiYgJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewoKICAgICAgICAjIHVzZSBFcnJvciBpbnN0ZWFkIG9mIEZhdGFsRXJyb3IgYXMgd2UgYXJlIGluIGEgUG9wLXVwIHdpbmRvdwogICAgICAgICMgR2V0IFRpY2tldCB0byBjaGVjayBUaWNrZXRJRCB3YXMgdmFsaWQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgVGlja2V0SUQ6ICVzIScsICRUaWNrZXRJRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IFByb2Nlc3NFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSB1bmRlZjsKCiAgICAgICAgJFByb2Nlc3NTdGFydHBvaW50ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFByb2Nlc3NTdGFydHBvaW50CiAgICAgICAgICAgIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc1N0YXJ0cG9pbnQpCiAgICAgICAgICAgIHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0gfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IEFjdGl2aXR5RW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXNlIFByb2Nlc3NFbnRpdHlJRCBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfTsKICAgIH0KCiAgICAjIElmIHdlIGhhZCBhIFRpY2tldElELCBnZXQgdGhlIFRpY2tldAogICAgZWxzZSB7CgogICAgICAgICMgR2V0IFRpY2tldCB0byBjaGVjayBUaWNrZXRJRCB3YXMgdmFsaWQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc3RvcmUgQWN0aXZpdHlEaWFsb2csIGludmFsaWQgVGlja2V0SUQ6ICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgJEFjdGl2aXR5RW50aXR5SUQgPSAkVGlja2V0ewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnKQogICAgICAgIH07CiAgICAgICAgaWYgKCAhJEFjdGl2aXR5RW50aXR5SUQgKQogICAgICAgIHsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dEaWFsb2dFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdNaXNzaW5nIEFjdGl2aXR5RW50aXR5SUQgaW4gVGlja2V0ICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGRpYWxvZyB0byBzYXZlIGlzIHN0aWxsIHRoZSBjb3JyZWN0IGFjdGl2aXR5CiAgICAgICAgbXkgJEFjdGl2aXR5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpLT5BY3Rpdml0eUdldCgKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkQWN0aXZpdHlFbnRpdHlJRCwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiBbJ0FnZW50SW50ZXJmYWNlJ10sCiAgICAgICAgKTsKICAgICAgICBteSAlQWN0aXZpdHlEaWFsb2dzID0gcmV2ZXJzZSAleyAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ30gLy8ge30gfTsKICAgICAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dzeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSApIHsKCiAgICAgICAgICAgIG15ICRUaWNrZXRIb29rICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyk7CiAgICAgICAgICAgIG15ICRUaWNrZXRIb29rRGl2aWRlciA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpOwoKICAgICAgICAgICAgJEVycm9ye1dyb25nQWN0aXZpdHl9ID0gMTsKICAgICAgICAgICAgcHVzaCBATm90aWZ5LCB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaGlzIHN0ZXAgZG9lcyBub3QgYmVsb25nIGFueW1vcmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkgaW4gcHJvY2VzcyBmb3IgdGlja2V0IFwnJXMlcyVzXCchIEFub3RoZXIgdXNlciBjaGFuZ2VkIHRoaXMgdGlja2V0IGluIHRoZSBtZWFudGltZS4gUGxlYXNlIGNsb3NlIHRoaXMgd2luZG93IGFuZCByZWxvYWQgdGhlIHRpY2tldC4nLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRIb29rLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRIb29rRGl2aWRlciwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3NFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50UHJvY2Vzc0lEJykKICAgICAgICB9OwoKICAgICAgICBpZiAoICEkUHJvY2Vzc0VudGl0eUlEICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dEaWFsb2dFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdNaXNzaW5nIFByb2Nlc3NFbnRpdHlJRCBpbiBUaWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgd2UgZ290IGVycm9ycyBnbyBiYWNrIHRvIGRpc3BsYXlpbmcgdGhlIEFjdGl2aXR5RGlhbG9nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fT3V0cHV0QWN0aXZpdHlEaWFsb2coCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQgfHwgdW5kZWYsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlcyAgICAgICAgICA9PiBcJUVycm9yTWVzc2FnZXMsCiAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICBERkVycm9ycyAgICAgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgIE5vdGlmeSAgICAgICAgICAgICAgICAgPT4gXEBOb3RpZnksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHdlIGRlYWwgd2l0aCBhIFRpY2tldCBVcGRhdGUKICAgIG15ICRVcGRhdGVUaWNrZXRJRCA9ICRQYXJhbXtHZXRQYXJhbX17VGlja2V0SUR9OwoKICAgICMgV2Ugc2F2ZSBvbmx5IG9uY2UsIG5vIG1hdHRlciBpZiBvbmUgb3IgbW9yZSBjb25maWd1cmF0aW9ucyBhcmUgc2V0IGZvciB0aGUgc2FtZSBwYXJhbQogICAgbXkgJVN0b3JlZEZpZWxkczsKCiAgICAjIFNhdmUgbG9vcCBmb3Igc3RvcmluZyBUaWNrZXQgVmFsdWVzIHRoYXQgd2VyZSBub3QgcmVxdWlyZWQgb24gdGhlIGluaXRpYWwgVGlja2V0Q3JlYXRlCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDYW5cJ3QgZ2V0IGRhdGEgZm9yIEZpZWxkICIlcyIgb2YgQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtczsKCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CgogICAgICAgICAgICAjIFRoaXMgVmFsdWUgaXMganVzdCBzZXQgaWYgU3RhdHVzIHdhcyBvbiBhIFBlbmRpbmcgc3RhdGUKICAgICAgICAgICAgIyBzbyBpdCBoYXMgdG8gYmUgcG9zc2libGUgdG8gc3RvcmUgdGhlIHRpY2tldCBpZiB0aGlzIG9uZSdzIGVtcHR5CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRUaWNrZXRQYXJhbXsnUGVuZGluZ1RpbWUnfSApICkgewogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICV7ICRUaWNrZXRQYXJhbXsnUGVuZGluZ1RpbWUnfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgUGVuZGluZ1RpbWUgZm9yIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyAmJiAoICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQgKSApIHsKCiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH0gJiYgJFBhcmFte0dldFBhcmFtfXtCb2R5fSApIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgICAgICAgICBteSAkTWltZVR5cGUgID0gJ3RleHQvcGxhaW4nOwoKICAgICAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAsIGRlbGV0ZWQgbm90IHVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19e0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0dldFBhcmFtfXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzLgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQEF0dGFjaG1lbnRzID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtHZXRQYXJhbX17Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ29tbXVuaWNhdGlvbkNoYW5uZWwgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e0FydGljbGV9e0NvbmZpZ317Q29tbXVuaWNhdGlvbkNoYW5uZWx9CiAgICAgICAgICAgICAgICAgICAgLy8gJ0ludGVybmFsJzsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgICAgICAgICAgICAgIENoYW5uZWxOYW1lID0+ICRDb21tdW5pY2F0aW9uQ2hhbm5lbCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDaGFuZ2UgaGlzdG9yeSB0eXBlIGFuZCBjb21tZW50IGFjY29yZGluZ2x5IHRvIHRoZSBwcm9jZXNzIGFydGljbGUuCiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeVR5cGUgICAgPSAnQWRkTm90ZSc7CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeUNvbW1lbnQgPSAnJSVOb3RlJzsKICAgICAgICAgICAgICAgIGlmICggJENvbW11bmljYXRpb25DaGFubmVsIGVxICdQaG9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlICAgID0gJ1Bob25lQ2FsbEFnZW50JzsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUNvbW1lbnQgPSAnJSUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRGcm9tID0gIlwiJFNlbGYtPntVc2VyRnVsbG5hbWV9XCIgPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e0FydGljbGV9e0NvbmZpZ317SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9IC8vIDAsCiAgICAgICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICA9PiAkSGlzdG9yeVR5cGUsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICA9PiAkSGlzdG9yeUNvbW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317QXJ0aWNsZX17Q29uZmlnfXtJbmZvcm1BZ2VudHN9CiAgICAgICAgICAgICAgICAgICAgPyAkUGFyYW17R2V0UGFyYW19e0luZm9ybVVzZXJJRH0KICAgICAgICAgICAgICAgICAgICA6IFtdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17R2V0UGFyYW19e1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJFBhcmFte0dldFBhcmFtfXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGF2ZSB0byBVcGRhdGUgYSB0aWNrZXQsIHVwZGF0ZSB0aGUgdHJhbnNtaXR0ZWQgdmFsdWVzCiAgICAgICAgZWxzaWYgKCRVcGRhdGVUaWNrZXRJRCkgewoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1RpdGxlJyApIHsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpdGxlLCBub3RoaW5nIGlzIG5lZWRlZCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJFRpY2tldFBhcmFteydUaXRsZSd9CiAgICAgICAgICAgICAgICAgICAgfHwgKCBkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfSAmJiAkVGlja2V0UGFyYW17J1RpdGxlJ30gZXEgJycgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugc2V0IHRoZSB0aWNrZXQgdGl0bGUKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRQYXJhbXsnVGl0bGUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnCiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rpc3BsYXl9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV3JvbmcgQWN0aXZpdHlEaWFsb2cgRmllbGQgY29uZmlnOiAlcyBjYW5cJ3QgYmUgRGlzcGxheSA9PiAxIC8gU2hvdyBmaWVsZCAoUGxlYXNlIGNoYW5nZSBpdHMgY29uZmlndXJhdGlvbiB0byBiZSBEaXNwbGF5ID0+IDAgLyBEbyBub3Qgc2hvdyBmaWVsZCBvciBEaXNwbGF5ID0+IDIgLyBTaG93IGZpZWxkIGFzIG1hbmRhdG9yeSkhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNraXAgVGlja2V0Q3VzdG9tZXJTZXQoKSBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gdGhlIGN1c3RvbWVyCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtDdXN0b21lcklEfSBlcSAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0KICAgICAgICAgICAgICAgICAgICAmJiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSBlcSAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGFueSBhZGRpdGlvbmFsIHN0b3JlcwogICAgICAgICAgICAgICAgICAgICMgb24gQ3VzdG9tZXIsIEN1c3RvbWVyTm8sIEN1c3RvbWVySUQgb3IgQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgICAgICAgICAjIHNvIG1ha2Ugc3VyZSBib3RoIGZpZWxkcyBhcmUgc2V0IHRvICJTdG9yZWQiIDspCiAgICAgICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEN1c3RvbWVyU2V0KAogICAgICAgICAgICAgICAgICAgIE5vID0+ICRUaWNrZXRQYXJhbXtDdXN0b21lcklEfSwKCiAgICAgICAgICAgICAgICAgICAgIyBoZXJlIHRvbzogdW5mb3J0dW5hdGVseSBUaWNrZXRDcmVhdGUgdGFrZXMgUGFyYW0gJ0N1c3RvbWVyVXNlcicKICAgICAgICAgICAgICAgICAgICAjIGluc3RlYWQgb2YgQ3VzdG9tZXJVc2VySUQsIHNvIG91ciBUaWNrZXRQYXJhbSBoYXNoCiAgICAgICAgICAgICAgICAgICAgIyBoYXMgdGhlIEN1c3RvbWVyVXNlciBLZXkgaW5zdGVhZCBvZiAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICAgICAgICAgVXNlciAgICAgPT4gJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGFueSBhZGRpdGlvbmFsIHN0b3JlcwogICAgICAgICAgICAgICAgIyBvbiBDdXN0b21lciwgQ3VzdG9tZXJObywgQ3VzdG9tZXJJRCBvciBDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICAgICAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgICAgICBteSAkVGlja2V0RmllbGRTZXRTdWIgPSAkQ3VycmVudEZpZWxkOwogICAgICAgICAgICAgICAgJFRpY2tldEZpZWxkU2V0U3ViID1+IHN7SUQkfXt9eG1zOwogICAgICAgICAgICAgICAgJFRpY2tldEZpZWxkU2V0U3ViID0gJ1RpY2tldCcgLiAkVGlja2V0RmllbGRTZXRTdWIgLiAnU2V0JzsKCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXRPYmplY3QtPmNhbigkVGlja2V0RmllbGRTZXRTdWIpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkVXBkYXRlRmllbGROYW1lOwoKICAgICAgICAgICAgICAgICAgICAjIHNhZGx5IHdlIG5lZWQgYW4gZXhjZXB0aW9uIGZvciBPd25lcihJRCkgYW5kIFJlc3BvbnNpYmxlKElEKSwgYmVjYXVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAjIFRpY2tldCpTZXQgc3VicyBuZWVkIE5ld1VzZXJJRCBhcyBwYXJhbQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFyIGdyZXAgeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAkXyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHF3KCBPd25lcklEIFJlc3BvbnNpYmxlSUQgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lID0gJ05ld1VzZXJJRCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lID0gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHRvIHN0b3JlIGlmIHRoZSBmaWVsZCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkVXBkYXRlOwoKICAgICAgICAgICAgICAgICAgICAjIG9ubHkgU2VydmljZSBhbmQgU0xBIGZpZWxkcyBhY2NlcHRzIGVtcHR5IHZhbHVlcyBpZiB0aGUgaGFzaCBrZXkgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmVkIHNldCBpdCB0byBlbXB0eSBzbyB0aGUgVGlja2V0KlNldCBmdW5jdGlvbiBjYWxsIHdpbGwgZ2V0IHRoZSBlbXB0eQogICAgICAgICAgICAgICAgICAgICMgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICggJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJyB8fCAkVXBkYXRlRmllbGROYW1lIGVxICdTTEFJRCcgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBTZXJ2aWNlIGFuIFNMQSBmaWVsZHMgaWYgdGhleSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSAoZXZlbiBlbXB0eSkKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NlcnZpY2VJRCcgfHwgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU0xBSUQnICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBhbnkgb3RoZXIgZmllbGQgdGhhdCBpdHMgdmFsdWUgaXMgZGVmaW5lZCBhbmQgbm90IGVtcHR5CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lIG5lICdTZXJ2aWNlSUQnCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRVcGRhdGVGaWVsZE5hbWUgbmUgJ1NMQUlEJwogICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gbmUgJycKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkVXBkYXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gMTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgaWYgKCRGaWVsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPiRUaWNrZXRGaWVsZFNldFN1YigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVcGRhdGVGaWVsZE5hbWUgPT4gJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIG5ldyBzZXJ2aWNlIGFuZCBubyBuZXcgU0xBIGlzIHRvIGJlIHNldCwgY2hlY2sgaWYgY3VycmVudAogICAgICAgICAgICAgICAgICAgICAgICAjIGFzc2lnbmVkIFNMQSBpcyBzdGlsbCB2YWxpZAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lIGVxICdTZXJ2aWNlSUQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVmaW5lZCAkVGlja2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aWNrZXQgZGV0YWlscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGlja2V0IGFscmVhZHkgaGF2ZSBhbiBTTEEgYXNzaWduZWQgZ2V0IHRoZSBsaXN0IFNMQXMgZm9yIHRoZSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJFRpY2tldHtTTEFJRH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlU0xBTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBjdXJyZW50IFNMQSBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgU0xBIGZvciBuZXcgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIFNMQSBmcm9tIHRpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRTTEFMaXN0eyAkVGlja2V0e1NMQUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCAlcyBmb3IgVGlja2V0IHdpdGggSUQgIiVzIiBpbiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lICgga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfTsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKCiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJER5bmFtaWNGaWVsZE5hbWUsIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIGRvbid0IHNldCB2YWx1ZSBvZiBkeW5hbWljIGZpZWxkIGlmIGl0IGlzIGhpZGRlbiB2aWEgQUNMIChhbmQgbm90IHZpYSBhY3Rpdml0eSBkaWFsb2cgZGVmaW5pdGlvbikKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH17RGlzcGxheX0gIT0gMAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXRQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCBEeW5hbWljRmllbGQgdmFsdWUgZm9yICVzIG9mIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGhpZGRlbiBmaWVsZHMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICBLZXkgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpbmsgdGlja2V0IGlkIGlmIGdpdmVuCiAgICBteSAkTGlua1RpY2tldElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xpbmtUaWNrZXRJRCcgKSB8fCAnJzsKCiAgICAjIGdldCBzY3JlZW4gY29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGxpbmsgdGlja2V0cwogICAgaWYgKAogICAgICAgICRMaW5rVGlja2V0SUQKICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0KICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX17TGlua1R5cGV9CiAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9e0RpcmVjdGlvbn0KICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkTGlua1RpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTb3VyY2VLZXkgPSAkTGlua1RpY2tldElEOwogICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgIGlmICggJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICRTb3VyY2VLZXkgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkTGlua1RpY2tldElEOwogICAgICAgIH0KCiAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0FkZCgKICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRDb25maWctPntTcGxpdExpbmtUeXBlfXtMaW5rVHlwZX0gfHwgJ05vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCROZXdPd25lcklEKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3T3duZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgVHJhbnNpdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IHRpY2tldCBldmVudCBtb2R1bGUgKFRpY2tldFByb2Nlc3NUcmFuc2l0aW9ucy5wbSkuCgogICAgIyBpZiB3ZSB3ZXJlIHVwZGF0aW5nIGEgdGlja2V0LCBjbG9zZSB0aGUgcG9wLXVwIGFuZCByZXR1cm4gdG8gem9vbQogICAgIyBlbHNlIChuZXcgdGlja2V0KSBqdXN0IGdvIHRvIHpvb20gdG8gc2hvdyB0aGUgbmV3IHRpY2tldAogICAgaWYgKCRVcGRhdGVUaWNrZXRJRCkgewoKICAgICAgICAjIGxvYWQgbmV3IFVSTCBpbiBwYXJlbnQgd2luZG93IGFuZCBjbG9zZSBwb3AtdXAKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRVcGRhdGVUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICk7Cn0KCnN1YiBfRGlzcGxheVByb2Nlc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBJZiB3ZSBoYXZlIGEgUHJvY2Vzc0VudGl0eUlECiAgICAkUGFyYW17RXJyb3JzfXtQcm9jZXNzRW50aXR5SURJbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InCiAgICAgICAgaWYgKCAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSAmJiAhJFBhcmFte1Byb2Nlc3NMaXN0fXsgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gfSApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte1Byb2Nlc3NMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc317UHJvY2Vzc0VudGl0eUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtQcm9jZXNzTGlzdH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQcm9jZXNzRW50aXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBBdXRvQ29tcGxldGUgPT4gJ29mZicsCiAgICApOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfXtSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17UHJlU2VsZWN0UHJvY2Vzc30gJiYgJFBhcmFte1Byb2Nlc3NJRH0gKSB7CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnUHJvY2Vzc0lEJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1Byb2Nlc3NJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9jZXNzTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG9uIGluaXRpYWwgc2NyZWVuIGZyb20gbmF2YmFyIHRoZXJlIGlzIG5vIElzTWFpbldpbmRvdyBidXQgYWxzbyBubyBJc1Byb2Nlc3NFbnJvbGwsCiAgICAjIHRoZW4gaXQgbXVzdCBiZSBhIE1haW5XaW5kb3cKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgICRTZWxmLT57SXNNYWluV2luZG93fSA9IDE7CiAgICB9CgogICAgbXkgJFR5cGUgPSAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCc7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgKTsKICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRQcm9jZXNzJyAuICRUeXBlLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgSXNQcm9jZXNzRW5yb2xsID0+ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHdvcmthcm91bmQgd2hlbiBhY3Rpdml0eSBkaWFsb2cgaXMgbG9hZGVkIGJ5IEFKQVggYXMgZmlyc3QgYWN0aXZpdHkgZGlhbG9nLCBpZiB0aGVyZSBpcwogICAgIyBhIGRhdGUgZmllbGQgbGlrZSBQZW5kaW5nIFRpbWUgb3IgRHluYW1pYyBGaWVsZHMgRGF0ZS9UaW1lIG9yIERhdGUsIHRoZXJlIGlzIG5vIHdheSB0byBzZXQKICAgICMgdGhpcyBvcHRpb25zIGluIHRoZSBmb290ZXIgYWdhaW4KICAgICRMYXlvdXRPYmplY3QtPntIYXNEYXRlcGlja2VyfSA9IDE7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJFR5cGUgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyA9Y3V0CiMKIyBfQ2hlY2tGaWVsZCgpCiMKIyBjaGVja3MgYWxsIHRoZSBwb3NzaWJsZSB0aWNrZXQgZmllbGRzIGFuZCByZXR1cm5zIHRoZSBJRCAoaWYgcG9zc2libGUpIHZhbHVlIG9mIHRoZSBmaWVsZCwgaWYgdmFsaWQKIyBhbmQgY2hlY2tzIGFyZSBzdWNjZXNzZnVsCiMKIyBpZiBEaXNwbGF5IHBhcmFtIGlzIHNldCB0byAwIG9yIG5vdCBnaXZlbiwgaXQgdXNlcyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZmllbGRzCiMgb3IgZ2xvYmFsIGRlZmF1bHQgdmFsdWUgYXMgZmFsbGJhY2sgb25seSBmb3IgY2VydGFpbiBmaWVsZHMKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDEgb3IgMiBpdCB1c2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0NoZWNrRmllbGQoCiMgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAojICAgICAgICAgRGlzcGxheSAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIDAgb3IgMSBvciAyCiMgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJzMgbm9ybWFsJywgICAgICAgICAgIyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIChpdCB1c2VzIGdsb2JhbAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsIGJhY2sgZm9yIG1hbmRhdG9yeSBmaWVsZHMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIChRdWV1ZSwgU2F0ZSwgTG9jayBhbmQgUHJpb3JpdHkpCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgUHJpb3JpdHlJRCBpcyBzZXQgdG8gMSBpbiB0aGUgd2ViIHJlcXVlc3QKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9DaGVja0ZpZWxkKAojICAgICAgICAgRmllbGQgICAgICAgID0+ICdQcmlvcml0eUlEJywKIyAgICAgICAgIERpc3BsYXkgICAgICA9PiAwLAojICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICczIG5vcm1hbCcsCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlIGlzICczIG5vcm1hbCcgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBmaWVsZCBpcyBoaWRkZW4KIwojID1jdXQKCnN1YiBfQ2hlY2tGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgSUQgYW5kIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgYSB0aWNrZXQKICAgIG15ICRGaWVsZFdpdGhvdXRJRCA9ICRQYXJhbXtGaWVsZH07CiAgICAkRmllbGRXaXRob3V0SUQgPX4gc3tJRCR9e314bXM7CiAgICBteSAkVGlja2V0UmVxdWlyZWRGaWVsZCA9IHNjYWxhciBncmVwIHsgJF8gZXEgJEZpZWxkV2l0aG91dElEIH0gcXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSk7CgogICAgbXkgJFZhbHVlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGlmIG5vIERpc3BsYXkgKG9yIERpc3BsYXkgPT0gMCkgaXMgY29tbWl0dGVkCiAgICBpZiAoICEkUGFyYW17RGlzcGxheX0gKSB7CgogICAgICAgICMgQ2hlY2sgaWYgYSBEZWZhdWx0VmFsdWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICRQYXJhbXtEZWZhdWx0VmFsdWV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB3ZSBnb3QgYSByZXF1aXJlZCB0aWNrZXQgZmllbGQsIGNoZWNrIGlmIHdlIGdvdCBhIHZhbGlkIERlZmF1bHRWYWx1ZSBpbiB0aGUgU3lzQ29uZmlnCiAgICAgICAgaWYgKCAhJFZhbHVlICYmICRUaWNrZXRSZXF1aXJlZEZpZWxkICkgewogICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlByb2Nlc3M6OkRlZmF1bHQkRmllbGRXaXRob3V0SUQiKTsKCiAgICAgICAgICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdEZWZhdWx0IENvbmZpZyBmb3IgUHJvY2Vzczo6RGVmYXVsdCVzIG1pc3NpbmchJywKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RlZmF1bHQgQ29uZmlnIGZvciBQcm9jZXNzOjpEZWZhdWx0JXMgaW52YWxpZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAxICkgewoKICAgICAgICAjIERpc3BsYXkgPT0gMSBpcyBsb2dpY2FsaXR5IG5vdCBwb3NzaWJsZSBmb3IgYSB0aWNrZXQgcmVxdWlyZWQgZmllbGQKICAgICAgICBpZiAoJFRpY2tldFJlcXVpcmVkRmllbGQpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdXcm9uZyBBY3Rpdml0eURpYWxvZyBGaWVsZCBjb25maWc6ICVzIGNhblwndCBiZSBEaXNwbGF5ID0+IDEgLyBTaG93IGZpZWxkIChQbGVhc2UgY2hhbmdlIGl0cyBjb25maWd1cmF0aW9uIHRvIGJlIERpc3BsYXkgPT4gMCAvIERvIG5vdCBzaG93IGZpZWxkIG9yIERpc3BsYXkgPT4gMiAvIFNob3cgZmllbGQgYXMgbWFuZGF0b3J5KSEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGaWVsZH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICBpZiAoICRQYXJhbXtGaWVsZH0gZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgJFZhbHVlID0gMTsKCiAgICAgICAgICAgIG15ICggJEJvZHksICRTdWJqZWN0LCAkQXR0YWNobWVudEV4aXN0cywgJFRpbWVVbml0cyApID0gKAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKSwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBdHRhY2htZW50RXhpc3RzJyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpbWVVbml0cycgKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBJZiBhdHRhY2htZW50IGV4aXN0cyBhbmQgYm9keSBhbmQgc3ViamVjdCBub3QsIGl0IGlzIGVycm9yIChzZWUgYnVnIzEzMDgxKS4KICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudEV4aXN0cyAmJiAoICEkQm9keSAmJiAhJFN1YmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgdGltZSB1bml0cyBleGlzdHMgYW5kIGJvZHkgYW5kIHN1YmplY3Qgbm90LCBpdCBpcyBlcnJvciAoc2VlIGJ1ZyMxMzI2NikuCiAgICAgICAgICAgIGlmICggJFRpbWVVbml0cyAmJiAoICEkQm9keSAmJiAhJFN1YmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJFBhcmFte0ZpZWxkfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtGaWVsZH0gKSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAyICkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBwYXJhbSBpcyB2YWxpZAogICAgICAgIGlmICggJFBhcmFte0ZpZWxkfSBlcSAnQXJ0aWNsZScgKSB7CgogICAgICAgICAgICBteSAoICRCb2R5LCAkU3ViamVjdCApID0gKAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgaWYgKCAkQm9keSAmJiAkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fTG9va3VwVmFsdWUoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkUGFyYW17RmllbGR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0ZpZWxkfSApIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFZhbHVlOwp9CgojID1jdXQKIwojIF9Mb29rdXBWYWx1ZSgpCiMKIyByZXR1cm5zIHRoZSBJRCAoaWYgcG9zc2libGUpIG9mIG5lYXJseSBhbGwgdGlja2V0IGZpZWxkcyBhbmQvb3IgY2hlY2tzIGlmIGl0cyB2YWxpZC4KIyBDYW4gaGFuZGxlIElEcyBvciBTdHJpbmdzLgojIEN1cnJlbnRseSB3b3JraW5nIHdpdGg6IFN0YXRlLCBRdWV1ZSwgTG9jaywgUHJpb3JpdHkgKHBvc3NpYmxlIG1vcmUpLgojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0xvb2t1cFZhbHVlKAojICAgICAgICAgUHJpb3JpdHlJRCA9PiAxLAojICAgICApOwojICAgICAkUHJpb3JpdHlJRCA9IDE7CiMKIyAgICAgbXkgJFN0YXRlSUQgPSAkQWdlbnRUaWNrZXRQcm9jZXNzT2JqZWN0LT5fTG9va3VwVmFsdWUoCiMgICAgICAgICBTdGF0ZSA9PiAnb3BlbicsCiMgICAgICk7CiMgICAgICRTdGF0ZUlEID0gMzsKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9Mb29rdXBWYWx1ZSgKIyAgICAgICAgIFByaW9yaXR5ID0+ICd1bmtub3ducHJpb3JpdHkxMjM0JywKIyAgICAgKTsKIyAgICAgJFByaW9yaXR5SUQgPSB1bmRlZjsKIwojID1jdXQKCnN1YiBfTG9va3VwVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RmllbGR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gdmFsdWUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KICAgIHJldHVybiBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAjIHJlbW92ZSB0aGUgSUQgZm9yIGZ1bmN0aW9uIG5hbWUgcHVycG9zZQogICAgbXkgJEZpZWxkV2l0aG91dElEID0gJFBhcmFte0ZpZWxkfTsKICAgICRGaWVsZFdpdGhvdXRJRCA9fiBze0lEJH17fXhtczsKCiAgICBteSAkTG9va3VwRmllbGROYW1lOwogICAgbXkgJE9iamVjdE5hbWU7CiAgICBteSAkRnVuY3Rpb25OYW1lOwoKICAgICMgb3duZXIoSUQpIGFuZCByZXNwb25zaWJsZShJRCkgbG9va3VwIG5lZWRzIFVzZXJJRCBhcyBwYXJhbWV0ZXIKICAgIGlmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVySUQgUmVzcG9uc2libGVJRCApICkgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAnVXNlcklEJzsKICAgICAgICAkT2JqZWN0TmFtZSAgICAgID0gJ1VzZXInOwogICAgICAgICRGdW5jdGlvbk5hbWUgICAgPSAnVXNlckxvb2t1cCc7CiAgICB9CgogICAgIyBvd25lciBhbmQgcmVzcG9uc2libGUgbG9va3VwIG5lZWRzIFVzZXJMb2dpbiBhcyBwYXJhbWV0ZXIKICAgIGVsc2lmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVyIFJlc3BvbnNpYmxlICkgKSB7CiAgICAgICAgJExvb2t1cEZpZWxkTmFtZSA9ICdVc2VyTG9naW4nOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAnVXNlcic7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICdVc2VyTG9va3VwJzsKICAgIH0KCiAgICAjIHNlcnZpY2UgYW5kIFNMQSBsb29rdXAgbmVlZHMgTmFtZSBhcyBwYXJhbWV0ZXIgKFdoaWxlIFNlcnZpY2VJRCBhbiBTTEFJRCB1c2VzIHN0YW5kYXJkKQogICAgZWxzaWYgKCBzY2FsYXIgZ3JlcCB7ICRQYXJhbXtGaWVsZH0gZXEgJF8gfSBxdyggU2VydmljZSBTTEEgKSApIHsKICAgICAgICAkTG9va3VwRmllbGROYW1lID0gJ05hbWUnOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgb3RoZXIgZmllbGRzIGNhbiB1c2Ugc3RhbmRhcmQgcGFyYW1ldGVyIG5hbWVzIGFzIFByaW9yaXR5IG9yIFByaW9yaXR5SUQKICAgIGVsc2UgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAkUGFyYW17RmllbGR9OwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgZ2V0IGFwcHJvcHJpYXRlIG9iamVjdCBvZiBmaWVsZAogICAgbXkgJEZpZWxkT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSwgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSApOwogICAgfQoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGNoZWNrIGlmIHRoZSBiYWNrZW5kIG1vZHVsZSBoYXMgdGhlIG5lZWRlZCAqTG9va3VwIHN1YgogICAgaWYgKCAkRmllbGRPYmplY3QgJiYgJEZpZWxkT2JqZWN0LT5jYW4oJEZ1bmN0aW9uTmFtZSkgKSB7CgogICAgICAgICMgY2FsbCB0aGUgKkxvb2t1cCBzdWIgYW5kIGdldCB0aGUgdmFsdWUKICAgICAgICAkVmFsdWUgPSAkRmllbGRPYmplY3QtPiRGdW5jdGlvbk5hbWUoCiAgICAgICAgICAgICRMb29rdXBGaWVsZE5hbWUgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgd2UgZGlkbid0IGhhdmUgYW4gb2JqZWN0IGFuZCB0aGUgdmFsdWUgaGFzIG5vIHJlZiBhIHN0cmluZyBlLmcuIFRpdGxlIGFuZCBzbyBvbgogICAgIyByZXR1cm4gdHJ1ZQogICAgZWxzaWYgKCAkUGFyYW17RmllbGR9IGVxICRGaWVsZFdpdGhvdXRJRCAmJiAhcmVmICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciB3aGlsZSBjaGVja2luZyB3aXRoICIgLiAkRmllbGRXaXRob3V0SUQgLiAiT2JqZWN0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgKCAhJFZhbHVlICk7CgogICAgIyByZXR1cm4gdGhlIGdpdmVuIElEIHZhbHVlIGlmIHRoZSAqTG9va3VwIHJlc3VsdCB3YXMgYSBzdHJpbmcKICAgIGlmICggJFBhcmFte0ZpZWxkfSBuZSAkRmllbGRXaXRob3V0SUQgKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CgogICAgIyByZXR1cm4gdGhlICpMb29rdXAgc3RyaW5nIHJldHVybiB2YWx1ZQogICAgcmV0dXJuICRWYWx1ZTsKfQoKc3ViIF9HZXRSZXNwb25zaWJsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW06OlBlcm1pc3Npb24nKTsKICAgIG15ICRQZXJtaXNzaW9uR3JvdXBUeXBlID0gKCBncmVwIHsgJF8gZXEgJ3Jlc3BvbnNpYmxlJyB9IEB7JENvbmZpZ1Blcm1pc3Npb25zfSApID8gJ3Jlc3BvbnNpYmxlJyA6ICdydyc7CgogICAgIyBpZiB3ZSBhcmUgdXBkYXRpbmcgYSB0aWNrZXQgc2hvdyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHJlc3BvbnNpYmxlcwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgICA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdFF1ZXVlIik7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1Jlc3BvbnNpYmxlQWxsfSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgICAgICBmb3IgbXkgJEtleUdyb3VwTWVtYmVyICggc29ydCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJEtleUdyb3VwTWVtYmVyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYWxsIHN5c3RlbSB1c2VycwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzdWJzY3JpYmVkIHVzZXJzIHdobyBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGluIHRoZSBxdWV1ZSBncm91cAogICAgICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRPd25lcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW06OlBlcm1pc3Npb24nKTsKICAgIG15ICRQZXJtaXNzaW9uR3JvdXBUeXBlID0gKCBncmVwIHsgJF8gZXEgJ293bmVyJyB9IEB7JENvbmZpZ1Blcm1pc3Npb25zfSApID8gJ293bmVyJyA6ICdydyc7CgogICAgIyBpZiB3ZSBhcmUgdXBkYXRpbmcgYSB0aWNrZXQgc2hvdyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIG93bmVycwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgICA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdFF1ZXVlIik7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte093bmVyQWxsfSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgICAgICBmb3IgbXkgJEtleUdyb3VwTWVtYmVyICggc29ydCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJEtleUdyb3VwTWVtYmVyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYWxsIHN5c3RlbSB1c2VycwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzdWJzY3JpYmVkIHVzZXJzIHdobyBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGluIHRoZSBxdWV1ZSBncm91cAogICAgICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkR0lEICAgICAgICA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPd25lcicsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc317ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CgogICAgIyBjaGVjayBpZiBubyBDdXN0b21lclVzZXJJRCBpcyBzZWxlY3RlZAogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAwIGxlYXZlIEN1c3RvbWVyVXNlcklEIGVtcHR5LCBpdCB3aWxsIG5vdCBnZXQgYW55IHNlcnZpY2VzCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDEgc2V0IEN1c3RvbWVyVXNlcklEIHRvIGdldCBkZWZhdWx0IHNlcnZpY2VzCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0TG9ja3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTG9ja3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpLT5Mb2NrTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gXCVMb2NrczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVByaW9yaXRpZXM7CgogICAgIyBJbml0aWFsbHkgd2UgaGF2ZSBqdXN0IHRoZSBkZWZhdWx0IFF1ZXVlIFBhcmFtZXRlcgogICAgIyBzbyBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBJRCBpbiB0aGF0IGNhc2UKICAgIG15ICRRdWV1ZUlEOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtRdWV1ZX0gKSB7CiAgICAgICAgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRQYXJhbXtRdWV1ZX0gKTsKICAgIH0KICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRRdWV1ZUlEIHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRRdWV1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHdoaWNoIHR5cGUgb2YgcGVybWlzc2lvbiBpcyBuZWVkZWQ6IGlmIHRoZSBwcm9jZXNzIHRpY2tldAogICAgIyBhbHJlYWR5IGV4aXN0cyAoPSBUaWNrZXRJRCBpcyBwcmVzZW50KSwgd2UgbmVlZCB0aGUgJ21vdmVfaW50bycKICAgICMgcGVybWlzc2lvbiBvdGhlcndpc2UgdGhlICdjcmVhdGUnIHBlcm1pc3Npb24KICAgIG15ICRQZXJtaXNzaW9uVHlwZSA9ICdjcmVhdGUnOwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRQZXJtaXNzaW9uVHlwZSA9ICdtb3ZlX2ludG8nOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1F1ZXVlczsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdRdWV1ZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFNlbGVjdGlvblR5cGUgUXVldWUgb3IgU3lzdGVtQWRkcmVzcz8KICAgICAgICBteSAlUXVldWVzOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlUXVldWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFBlcm1pc3Npb25UeXBlLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVRdWV1ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFBlcm1pc3Npb25UeXBlLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIFFVRVVFSUQ6CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICVRdWV1ZXMgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJFN0cmluZyA9fiBze1xzK1x6fXt9IGlmICEkUXVldWVEYXRhe0NvbW1lbnR9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRRdWV1ZXN7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdRdWV1ZXN7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlTmV3UXVldWVzOwp9CgpzdWIgX0dldFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAlUGFyYW0sCgogICAgICAgICMgU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgcHJvY2VzcyB0aWNrZXQKICAgICAgICBRdWV1ZUlEICA9PiAkUGFyYW17UXVldWVJRH0gIHx8IDEsCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSB8fCAnJywKCiAgICAgICAgIyByZW1vdmUgdHlwZSwgc2luY2UgaWYgVGlja2V0OjpUeXBlIGlzIGFjdGl2ZSBpbiBzeXNjb25maWcsIHRoZSBUeXBlIHBhcmFtZXRlciB3aWxsCiAgICAgICAgIyBiZSBzZW50IGFuZCB0aGUgVGlja2V0U3RhdGVMaXN0IHdpbGwgc2VuZCB0aGUgcGFyYW1ldGVyIGFzIFN0YXRlIFR5cGUKICAgICAgICBUeXBlID0+IHVuZGVmLAoKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBcJVN0YXRlczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKIyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwpzdWIgX0dldFN0YW5kYXJkVGVtcGxhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRlbXBsYXRlczsKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgIGlmICggISRRdWV1ZUlEICkgewogICAgICAgIG15ICREZWZhdWx0UXVldWUgICA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdFF1ZXVlIik7CiAgICAgICAgbXkgJERlZmF1bHRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJERlZmF1bHRRdWV1ZSApOwogICAgICAgIGlmICgkRGVmYXVsdFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkRGVmYXVsdFF1ZXVlSUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgISRRdWV1ZUlEICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIGlmICggISRRdWV1ZUlEICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIFwlVGVtcGxhdGVzIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze1Byb2Nlc3NEaWFsb2d9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tQcm9jZXNzRGlhbG9nfTsKfQoKIyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCnN1YiBfU2hvd0RpYWxvZ0Vycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+RXJyb3IoJVBhcmFtKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldElucHV0RGVmaW5pdGlvbkR5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJUR5bmFtaWNGaWVsZDsKCiAgICAjIFRoaXMgc3Vicm91dGluZSB0YWtlcyBhIERGRW50cnkgYW5kIHRoZSBEeW5hbWljRmllbGRPYmplY3QgYXMgYXJndW1lbnRzCiAgICAjIEl0IHJldHJpZXZlcyB0aGUgZHluYW1pYyBmaWVsZCBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gREZFbnRyeQogICAgIyBJZiB0aGUgZGVmaW5pdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBpdCByZXRyaWV2ZXMgaXQgZnJvbSB0aGUgRHluYW1pY0ZpZWxkT2JqZWN0CiAgICAjIFJldHVybnMgdGhlIGR5bmFtaWMgZmllbGQgZGVmaW5pdGlvbgogICAgbXkgJEdldER5bmFtaWNGaWVsZCA9IHN1YiB7CgogICAgICAgIG15ICgkREZFbnRyeSkgPSBAXzsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRERkVudHJ5LT57RGVmaW5pdGlvbn0gLy8gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICRERkVudHJ5LT57REZ9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkRHluYW1pY0ZpZWxkOwogICAgfTsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJbmNsdWRlSXRlbSAoIEB7ICRQYXJhbXtJbnB1dEZpZWxkRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgaWYgKCAkSW5jbHVkZUl0ZW0tPntHcmlkfSApIHsKCiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHsgJEluY2x1ZGVJdGVtLT57R3JpZH17Um93c30gfSApIHsKCiAgICAgICAgICAgICAgICBERkVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRERkVudHJ5ICggJFJvdy0+QCogKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkR2V0RHluYW1pY0ZpZWxkLT4oJERGRW50cnkpOwogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPntNYW5kYXRvcnl9ICAgICAgPSAkREZFbnRyeS0+e01hbmRhdG9yeX07CiAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPntSZWFkb25seX0gICAgICAgPSAkREZFbnRyeS0+e1JlYWRvbmx5fTsKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZHsgJERGRW50cnktPntERn0gfSA9ICREeW5hbWljRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkREZFbnRyeS0+e0RGfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgREZFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSW5jbHVkZUl0ZW0tPntERn0gKSB7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJEdldER5bmFtaWNGaWVsZC0+KCRJbmNsdWRlSXRlbSk7CiAgICAgICAgICAgIGlmICgkRHluYW1pY0ZpZWxkKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSAgICAgICAgICA9ICRJbmNsdWRlSXRlbS0+e01hbmRhdG9yeX07CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57UmVhZG9ubHl9ICAgICAgICAgICA9ICRJbmNsdWRlSXRlbS0+e1JlYWRvbmx5fTsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGR7ICRJbmNsdWRlSXRlbS0+e0RGfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJEluY2x1ZGVJdGVtLT57REZ9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmV4dCBJVEVNOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVEeW5hbWljRmllbGQ7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AdminProcessManagementActivityDialog.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZG1pblByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlEaWFsb2cudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gxPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDbG9zZVBvcHVwIikgJV0KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUNsb3NlUG9wdXAiIGNsYXNzPSJDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNsb3NlUG9wdXAiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJHb0JhY2siKSAlXQogICAgICAgIDxwPgogICAgICAgICAgICA8YSBjbGFzcz0iR29CYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRGF0YS5BY3Rpb24gfCB1cmkgJV07U3ViYWN0aW9uPVslIERhdGEuU3ViYWN0aW9uIHwgdXJpICVdO0lEPVslIERhdGEuSUQgfCB1cmkgJV07RW50aXR5SUQ9WyUgRGF0YS5FbnRpdHlJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJHbyBCYWNrIikgfCBodG1sICVdPC9hPgogICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkdvQmFjayIpICVdCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8Zm9ybSBpZD0nQWN0aXZpdHlEaWFsb2dGb3JtJyBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQWN0aXZpdHlEaWFsb2dbJSBEYXRhLkFjdGlvbiB8IGh0bWwgJV1BY3Rpb24iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkVudGl0eUlEIiB2YWx1ZT0iWyUgRGF0YS5FbnRpdHlJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZpZWxkcyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRmllbGREZXRhaWxzIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQb3B1cFJlZGlyZWN0IiB2YWx1ZT0iIiBpZD0iUG9wdXBSZWRpcmVjdCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUG9wdXBSZWRpcmVjdEFjdGlvbiIgdmFsdWU9IiIgaWQ9IlBvcHVwUmVkaXJlY3RBY3Rpb24iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBvcHVwUmVkaXJlY3RTdWJhY3Rpb24iIHZhbHVlPSIiIGlkPSJQb3B1cFJlZGlyZWN0U3ViYWN0aW9uIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQb3B1cFJlZGlyZWN0SUQiIHZhbHVlPSIiIGlkPSJQb3B1cFJlZGlyZWN0SUQiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBvcHVwUmVkaXJlY3RFbnRpdHlJRCIgdmFsdWU9IiIgaWQ9IlBvcHVwUmVkaXJlY3RFbnRpdHlJRCIvPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdFdhcm5pbmciKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIFdpZGdldE5vdGljZSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugbm90ZSB0aGF0IGNoYW5naW5nIHRoaXMgYWN0aXZpdHkgZGlhbG9nIHdpbGwgYWZmZWN0IHRoZSBmb2xsb3dpbmcgYWN0aXZpdGllcyIpIHwgaHRtbCAlXTogWyUgRGF0YS5BY3Rpdml0eUxpc3QgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRXYXJuaW5nIikgJV0KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRXhwYW5kZWQgV2lkZ2V0Tm90aWNlIj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUGxlYXNlIG5vdGUgdGhhdCBjdXN0b21lciB1c2VycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHNlZSBvciB1c2UgdGhlIGZvbGxvd2luZyBmaWVsZHM6IE93bmVyLCBSZXNwb25zaWJsZSwgTG9jaywgUGVuZGluZ1RpbWUgYW5kIEN1c3RvbWVySUQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhlIFF1ZXVlIGZpZWxkIGNhbiBvbmx5IGJlIHVzZWQgYnkgY3VzdG9tZXJzIHdoZW4gY3JlYXRpbmcgYSBuZXcgdGlja2V0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpdml0eSBEaWFsb2ciKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkFjdGl2aXR5IGRpYWxvZyBOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuTmFtZVNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSW50ZXJmYWNlIj5bJSBUcmFuc2xhdGUoIkF2YWlsYWJsZSBpbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW50ZXJmYWNlU2VsZWN0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJEZXNjcmlwdGlvblNob3J0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIChzaG9ydCkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGVzY3JpcHRpb25TaG9ydCIgaWQ9IkRlc2NyaXB0aW9uU2hvcnQiIHZhbHVlPSJbJSBEYXRhLkRlc2NyaXB0aW9uU2hvcnQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5EZXNjcmlwdGlvblNob3J0U2VydmVyRXJyb3IgfCBodG1sICVdIiBtYXhsZW5ndGg9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzY3JpcHRpb25TaG9ydEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzY3JpcHRpb25TaG9ydFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXNjcmlwdGlvbkxvbmciPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24gKGxvbmcpIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkRlc2NyaXB0aW9uTG9uZyIgaWQ9IkRlc2NyaXB0aW9uTG9uZyIgY2xhc3M9Ilc1MHBjIiByb3dzPSIxMCIgY29scz0iMjAiPlslIERhdGEuRGVzY3JpcHRpb25Mb25nIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQZXJtaXNzaW9uIj5bJSBUcmFuc2xhdGUoIlBlcm1pc3Npb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlBlcm1pc3Npb25TZWxlY3Rpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGVybWlzc2lvblNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc2VsZWN0ZWQgcGVybWlzc2lvbiBkb2VzIG5vdCBleGlzdC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXF1aXJlZExvY2siPlslIFRyYW5zbGF0ZSgiUmVxdWlyZWQgTG9jayIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWlyZWRMb2NrU2VsZWN0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlcXVpcmVkTG9ja1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc2VsZWN0ZWQgcmVxdWlyZWQgbG9jayBkb2VzIG5vdCBleGlzdC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJtaXRBZHZpY2VUZXh0Ij5bJSBUcmFuc2xhdGUoIlN1Ym1pdCBBZHZpY2UgVGV4dCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJtaXRBZHZpY2VUZXh0IiBpZD0iU3VibWl0QWR2aWNlVGV4dCIgdmFsdWU9IlslIERhdGEuU3VibWl0QWR2aWNlVGV4dCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3VibWl0QnV0dG9uVGV4dCI+WyUgVHJhbnNsYXRlKCJTdWJtaXQgQnV0dG9uIFRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3VibWl0QnV0dG9uVGV4dCIgaWQ9IlN1Ym1pdEJ1dHRvblRleHQiIHZhbHVlPSJbJSBEYXRhLlN1Ym1pdEJ1dHRvblRleHQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IklucHV0RmllbGREZWZpbml0aW9uIj5bJSBUcmFuc2xhdGUoIklucHV0IEZpZWxkIERlZmluaXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb2RlTWlycm9yQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ01Ub29sYmFyQ29udGFpbmVyIiBjbGFzcz0iQ01Ub29sYmFyQ29udGFpbmVyIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDTVRvb2xiYXJJY29ucyIgY2xhc3M9IkNNVG9vbGJhckljb25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1dG8gSW5kZW50IENvZGUiKSB8IGh0bWwgJV0iIGNsYXNzPSJDTUluZGVudCIgb25jbGljaz0iQ29yZS5VSS5Db2RlTWlycm9yRWRpdG9yLkluZGVudENvZGUoKTsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29tbWVudC9VbmNvbW1lbnQgQ29kZSIpIHwgaHRtbCAlXSIgY2xhc3M9IkNNQ29tbWVudCIgb25jbGljaz0iQ29yZS5VSS5Db2RlTWlycm9yRWRpdG9yLlRvb2dsZUNvbW1lbnQoKTsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VhcmNoIikgfCBodG1sICVdIiBjbGFzcz0iQ01TZWFyY2giIG9uY2xpY2s9IkNvcmUuVUkuQ29kZU1pcnJvckVkaXRvci5TZWFyY2goKTsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VhcmNoICYgUmVwbGFjZSIpIHwgaHRtbCAlXSIgY2xhc3M9IkNNU2VhcmNoUmVwbGFjZSIgb25jbGljaz0iQ29yZS5VSS5Db2RlTWlycm9yRWRpdG9yLlNlYXJjaFJlcGxhY2UoKTsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IEFsbCIpIHwgaHRtbCAlXSIgY2xhc3M9IkNNU2VsZWN0QWxsIiBvbmNsaWNrPSJDb3JlLlVJLkNvZGVNaXJyb3JFZGl0b3IuU2VsZWN0QWxsKCk7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZ1bGwgU2NyZWVuIikgfCBodG1sICVdIiBjbGFzcz0iQ01NYXhpbWl6ZSIgb25jbGljaz0iQ29yZS5VSS5Db2RlTWlycm9yRWRpdG9yLlRvb2dsZUZ1bGxTY3JlZW4oJ01heGltaXplJyk7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJJbnB1dEZpZWxkRGVmaW5pdGlvbiIgaWQ9IklucHV0RmllbGREZWZpbml0aW9uIiBjbGFzcz0iQ29kZU1pcnJvckVkaXRvciBXNTBwYyIgcm93cz0iMTAiIGNvbHM9IjIwIj5bJSBEYXRhLklucHV0RmllbGREZWZpbml0aW9uIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoZSBlZGl0aW5nIGZpZWxkIGFsbG93cyB5b3UgdG8gdXNlIGRpZmZlcmVudCBmdW5jdGlvbnMgbGlrZSBhdXRvbWF0aWMgZm9ybWF0dGluZywgd2luZG93IHJlc2l6ZSBhcyB3ZWxsIGFzIHRhZy0gYW5kIGJyYWNrZXQtY29tcGxldGlvbi4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGlyZWN0U3VibWl0Ij5bJSBUcmFuc2xhdGUoIkRpcmVjdCBzdWJtaXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IkRpcmVjdFN1Ym1pdCIgaWQ9IkRpcmVjdFN1Ym1pdCIgdmFsdWU9IjEiIFslIERhdGEuRGlyZWN0U3VibWl0IHwgaHRtbCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJXYXJuaW5nIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJUaGlzIHByb3BlcnR5IHdvbid0IHRha2UgZWZmZWN0IGJlY2F1c2UgdGhlcmUgYXJlIGZpZWxkcyBjb25maWd1cmVkIGFzIHZpc2libGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRXhwYW5kZWQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZpZWxkcyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBMYXlvdXRHcmlkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjEgU3BhY2luZ0JvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIllvdSBjYW4gYXNzaWduIEZpZWxkcyB0byB0aGlzIEFjdGl2aXR5IERpYWxvZyBieSBkcmFnZ2luZyB0aGUgZWxlbWVudHMgd2l0aCB0aGUgbW91c2UgZnJvbSB0aGUgbGVmdCBsaXN0IHRvIHRoZSByaWdodCBsaXN0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT3JkZXJpbmcgdGhlIGVsZW1lbnRzIHdpdGhpbiB0aGUgbGlzdCBpcyBhbHNvIHBvc3NpYmxlIGJ5IGRyYWcgJ24nIGRyb3AuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTaXplMW9mMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkZpbHRlckF2YWlsYWJsZUZpZWxkcyIgY2xhc3M9Ilc3NXBjIiBuYW1lPSJGaWx0ZXJBdmFpbGFibGVGaWVsZHMiIHZhbHVlPSIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBhdmFpbGFibGUgZmllbGRzIikgfCBodG1sICVdIiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJGaWx0ZXIgYXZhaWxhYmxlIGZpZWxkcyIpIHwgaHRtbCAlXS4uLiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFibGVsaWtlIFc5MHBjIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBdmFpbGFibGUgRmllbGRzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFsbG9jYXRpb25MaXN0IFRhYmxlbGlrZSBXOTBwYyIgaWQ9IkF2YWlsYWJsZUZpZWxkcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF2YWlsYWJsZUZpZWxkUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgdGl0bGU9IlslIERhdGEuRmllbGRuYW1lVHJhbnNsYXRlZCB8IGh0bWwgJV0iIGRhdGEtbmFtZS10cmFuc2xhdGVkPSJbJSBEYXRhLkZpZWxkbmFtZVRyYW5zbGF0ZWQgfCBodG1sICVdIiBkYXRhLWlkPSJbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgZGF0YS1jb25maWc9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGRuYW1lVHJhbnNsYXRlZCB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkZ1bmN0aW9ucyBTaG93T25Bc3NpZ25lZExpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgZGF0YS1pZD0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIGRhdGEtZW50aXR5PSJbJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgY2xhc3M9IkZpZWxkRGV0YWlsc092ZXJsYXkgSWNvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWVkaXQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdmFpbGFibGVGaWVsZFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJsZWxpa2UgVzkwcGMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBc3NpZ25lZCBGaWVsZHMiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWxsb2NhdGlvbkxpc3QgVGFibGVsaWtlIFc5MHBjIiBpZD0iQXNzaWduZWRGaWVsZHMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3NpZ25lZEZpZWxkUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1uYW1lLXRyYW5zbGF0ZWQ9IlslIFRyYW5zbGF0ZShEYXRhLkZpZWxkKSB8IGh0bWwgJV0iIGRhdGEtaWQ9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiBkYXRhLWVudGl0eT0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIGRhdGEtY29uZmlnPSJbJSBEYXRhLkZpZWxkQ29uZmlnIHwgaHRtbCAlXSIgdGl0bGU9Ik5hbWU6IFslIFRyYW5zbGF0ZShEYXRhLkZpZWxkKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5GaWVsZCkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJGdW5jdGlvbnMgU2hvd09uQXNzaWduZWRMaXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGRhdGEtaWQ9IlslIERhdGEuRmllbGQgfCBodG1sICVdIiBkYXRhLWVudGl0eT0iWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIGNsYXNzPSJGaWVsZERldGFpbHNPdmVybGF5IEljb24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1lZGl0Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXNzaWduZWRGaWVsZFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIEludmlzaWJsZSBzdWJtaXQgYnV0dG9uIHRvIGFsbG93IGZvcm0gc3VibWl0IG9uIHByZXNzaW5nIGVudGVyL3JldHVybiB3aXRob3V0IGphdmFzY3JpcHQgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJEaWFsb2dzIiBjbGFzcz0iSGlkZGVuIj4KICAgIDxkaXYgaWQ9IkZpZWxkRGV0YWlscyI+CiAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDUwMHB4OyI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NTaG9ydCI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiAoc2hvcnQpIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRlc2NTaG9ydCIgaWQ9IkRlc2NTaG9ydCIgdmFsdWU9IiIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjcwIi8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXNjTG9uZyI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiAobG9uZykiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iRGVzY0xvbmciIGlkPSJEZXNjTG9uZyIgY2xhc3M9Ilc1MHBjIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVmYXVsdFZhbHVlIj5bJSBUcmFuc2xhdGUoIkRlZmF1bHQgdmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGVmYXVsdFZhbHVlIiBpZD0iRGVmYXVsdFZhbHVlIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tdW5pY2F0aW9uQ2hhbm5lbCI+WyUgVHJhbnNsYXRlKCJDb21tdW5pY2F0aW9uIENoYW5uZWwiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iQ29tbXVuaWNhdGlvbkNoYW5uZWxDb250YWluZXIiIGNsYXNzPSdIaWRkZW4nPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ29tbXVuaWNhdGlvbkNoYW5uZWxTZWxlY3Rpb24gJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IklzVmlzaWJsZUZvckN1c3RvbWVyIj5bJSBUcmFuc2xhdGUoIklzIHZpc2libGUgZm9yIGN1c3RvbWVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IklzVmlzaWJsZUZvckN1c3RvbWVyQ29udGFpbmVyIiBjbGFzcz0nSGlkZGVuJz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IklzVmlzaWJsZUZvckN1c3RvbWVyIiBpZD0iSXNWaXNpYmxlRm9yQ3VzdG9tZXIiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzQ29udGFpbmVyIikgJV0KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlRpbWVVbml0c0NvbnRhaW5lciIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UaW1lVW5pdHNTZWxlY3Rpb24gJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzQ29udGFpbmVyIikgJV0KCiMgUm90aGVyIE9TUyAvIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZXNDb250YWluZXIiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhbmRhcmRUZW1wbGF0ZXMiPlslIFRyYW5zbGF0ZSgiU3RhbmRhcmQgVGVtcGxhdGVzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlN0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyIiBjbGFzcz0nSGlkZGVuJz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlN0YW5kYXJkVGVtcGxhdGVzIiBpZD0iU3RhbmRhcmRUZW1wbGF0ZXMiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZXNDb250YWluZXIiKSAlXQoKIyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEaXNwbGF5Ij5bJSBUcmFuc2xhdGUoIkRpc3BsYXkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkRpc3BsYXlTZWxlY3Rpb24gJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2Pgo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/ProcessManagement/Article.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Qcm9jZXNzTWFuYWdlbWVudC9BcnRpY2xlLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgicnc6QXJ0aWNsZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJydzpBcnRpY2xlOkluZm9ybUFnZW50IikgJV0KPGxhYmVsIGZvcj0iSW5mb3JtVXNlcklEIj5bJSBUcmFuc2xhdGUoIkluZm9ybSBBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KPC9kaXY+CjxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoInJ3OkFydGljbGU6SW5mb3JtQWdlbnQiKSAlXQoKPGxhYmVsIGNsYXNzPSJbJSBEYXRhLk1hbmRhdG9yeUNsYXNzIHwgaHRtbCAlXSIgZm9yPSJTdWJqZWN0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGFiZWxTcGFuU3ViamVjdCIpICVdCiAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGFiZWxTcGFuU3ViamVjdCIpICVdCiAgICBbJSBEYXRhLkxhYmVsU3ViamVjdCB8IGh0bWwgJV06CjwvbGFiZWw+CjxkaXYgY2xhc3M9IkZpZWxkIj4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iU3ViamVjdCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBbJSBEYXRhLlZhbGlkYXRlUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuU3ViamVjdFNlcnZlckVycm9yIHwgaHRtbCAlXSBWYWxpZGF0ZV9EZXBlbmRpbmdSZXF1aXJlZEFORCBWYWxpZGF0ZV9EZXBlbmRpbmdfUmljaFRleHQgVmFsaWRhdGVfRGVwZW5kaW5nX0F0dGFjaG1lbnRFeGlzdHMgVmFsaWRhdGVfRGVwZW5kaW5nX1RpbWVVbml0cyIvPgogICAgPGRpdiBpZD0iU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgIDxkaXYgaWQ9IlN1YmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJydzpBcnRpY2xlOkRlc2NyaXB0aW9uU2hvcnQiKSAlXQo8ZGl2IGNsYXNzPSJGaWVsZCBGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvblNob3J0KSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoInJ3OkFydGljbGU6RGVzY3JpcHRpb25TaG9ydCIpICVdCgojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KCiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwo8bGFiZWwgY2xhc3M9IlslIERhdGEuTWFuZGF0b3J5Q2xhc3MgfCBodG1sICVdIiBmb3I9IlJpY2hUZXh0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGFiZWxTcGFuQm9keSIpICVdCiAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGFiZWxTcGFuQm9keSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoInJ3OkFydGljbGU6RGVzY3JpcHRpb25Mb25nIikgJV0KICAgIDxzcGFuIGNsYXNzPSJGaWVsZEhlbHBDb250YWluZXIiPgogICAgICAgIDxpIGNsYXNzPSJmYSBmYS1xdWVzdGlvbi1jaXJjbGUgRmllbGRIZWxwVHJpZ2dlciI+PC9pPgogICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uTG9uZykgfCBodG1sICVdPC9zcGFuPgogICAgPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgicnc6QXJ0aWNsZTpEZXNjcmlwdGlvbkxvbmciKSAlXQogICAgWyUgRGF0YS5MYWJlbEJvZHkgfCBodG1sICVdOgo8L2xhYmVsPgo8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLlZhbGlkYXRlUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuQm9keVNlcnZlckVycm9yIHwgaHRtbCAlXSBWYWxpZGF0ZV9EZXBlbmRpbmdSZXF1aXJlZEFORCBWYWxpZGF0ZV9EZXBlbmRpbmdfU3ViamVjdCBWYWxpZGF0ZV9EZXBlbmRpbmdfQXR0YWNobWVudEV4aXN0cyBWYWxpZGF0ZV9EZXBlbmRpbmdfVGltZVVuaXRzIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJEbkRVcGxvYWRCb3giPgpbJSBJTkNMVURFICJGb3JtRWxlbWVudHMvQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQo8bGFiZWwgZm9yPSJUaW1lVW5pdHMiPlslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHMiKSAlXQo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1RpbWVVbml0cyBbJSBEYXRhLlRpbWVVbml0c1JlcXVpcmVkIHwgaHRtbCAlXSBbJSBEYXRhLlRpbWVVbml0c0ludmFsaWQgfCBodG1sICVdIiBuYW1lPSJUaW1lVW5pdHMiIGlkPSJUaW1lVW5pdHMiIHZhbHVlPSJbJSBEYXRhLlRpbWVVbml0cyB8IGh0bWwgJV0iIC8+CiAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdClslIFJlbmRlckJsb2NrRW5kKCJydzpBcnRpY2xlIikgJV0K</File>
        <File Location="Kernel/Config/Files/XML/ProcessTicketTemplates.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDaGFuZ2VzIj4KICAgIDxTZXR0aW5nIE5hbWU9IlN0YW5kYXJkVGVtcGxhdGU6OlR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2YgdHlwZXMgZm9yIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBbnN3ZXIiIFRyYW5zbGF0YWJsZT0iMSI+QW5zd2VyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGUiIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGb3J3YXJkIiBUcmFuc2xhdGFibGU9IjEiPkZvcndhcmQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlsIiBUcmFuc2xhdGFibGU9IjEiPkVtYWlsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZUNhbGwiIFRyYW5zbGF0YWJsZT0iMSI+UGhvbmUgY2FsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZSIgVHJhbnNsYXRhYmxlPSIxIj5Ob3RlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9jZXNzRGlhbG9nIiBUcmFuc2xhdGFibGU9IjEiPlByb2Nlc3MgZGlhbG9nPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/Language/de_ProcessTicketTemplates.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX1Byb2Nlc3NUaWNrZXRUZW1wbGF0ZXM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pblByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlEaWFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YW5kYXJkIFRlbXBsYXRlcyd9ID0gJ1N0YW5kYXJkdm9ybGFnZW4nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9jZXNzIGRpYWxvZyd9ID0gJ1Byb3plc3MtRGlhbG9nJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnQW4gdW5jb25uZWN0ZWQgdHJhbnNpdGlvbiBpcyBhbHJlYWR5IHBsYWNlZCBvbiB0aGUgY2FudmFzLiBQbGVhc2UgY29ubmVjdCB0aGlzIHRyYW5zaXRpb24gZmlyc3QgYmVmb3JlIHBsYWNpbmcgYW5vdGhlciB0cmFuc2l0aW9uLicsCiAgICAnQXMgc29vbiBhcyB5b3UgdXNlIHRoaXMgYnV0dG9uIG9yIGxpbmssIHlvdSB3aWxsIGxlYXZlIHRoaXMgc2NyZWVuIGFuZCBpdHMgY3VycmVudCBzdGF0ZSB3aWxsIGJlIHNhdmVkIGF1dG9tYXRpY2FsbHkuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycsCiAgICAnQ2FuY2VsJywKICAgICdDdXN0b21lciBpbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBhcnRpY2xlcyBub3QgdmlzaWJsZSBmb3IgY3VzdG9tZXJzLicsCiAgICAnRGVsZXRlJywKICAgICdEZWxldGUgRW50aXR5JywKICAgICdFZGl0IEZpZWxkIERldGFpbHMnLAogICAgJ0Vycm9yIGR1cmluZyBBSkFYIGNvbW11bmljYXRpb24nLAogICAgJ0hpZGUgRW50aXR5SURzJywKICAgICdTYXZlJywKICAgICdTaG93IEVudGl0eUlEcycsCiAgICAnU29ycnksIHRoZSBvbmx5IGV4aXN0aW5nIGNvbmRpdGlvbiBjYW5cJ3QgYmUgcmVtb3ZlZC4nLAogICAgJ1NvcnJ5LCB0aGUgb25seSBleGlzdGluZyBmaWVsZCBjYW5cJ3QgYmUgcmVtb3ZlZC4nLAogICAgJ1NvcnJ5LCB0aGUgb25seSBleGlzdGluZyBwYXJhbWV0ZXIgY2FuXCd0IGJlIHJlbW92ZWQuJywKICAgICdUaGlzIEFjdGl2aXR5IGlzIGFscmVhZHkgdXNlZCBpbiB0aGUgUHJvY2Vzcy4gWW91IGNhbm5vdCBhZGQgaXQgdHdpY2UhJywKICAgICdUaGlzIFRyYW5zaXRpb24gaXMgYWxyZWFkeSB1c2VkIGZvciB0aGlzIEFjdGl2aXR5LiBZb3UgY2Fubm90IHVzZSBpdCB0d2ljZSEnLAogICAgJ1RoaXMgVHJhbnNpdGlvbkFjdGlvbiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBQYXRoLiBZb3UgY2Fubm90IHVzZSBpdCB0d2ljZSEnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.Admin.ProcessManagement.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gNmVmZGM3YmYyYTMzMjUyNzdjZDc5YTYwZjBmMjQwN2Y4YWQ1OWU4NyAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKLyplc2xpbnQtZGlzYWJsZSBvdG9iby9uby13aW5kb3cqLwoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5BZG1pbiA9IENvcmUuQWdlbnQuQWRtaW4gfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50CiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluCiAqIEBhdXRob3IKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIFByb2Nlc3NNYW5hZ2VtZW50IG1vZHVsZS4KICovCkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbW9kdWxlIGZ1bmN0aW9uYWxpdHkuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIFN1YmFjdGlvbiA9IENvcmUuQ29uZmlnLkdldCgnU3ViYWN0aW9uJyk7CgogICAgICAgIC8vIEluaXRpYWxpemUgUG9wdXAKICAgICAgICBJbml0UHJvY2Vzc1BvcHVwcygpOwoKICAgICAgICAvLyBJbml0aWFsaXplIFBvcHVwIHJlc3BvbnNlIChSZWRpcmVjdCBhbmQgY2xvc2UgUG9wdXApCiAgICAgICAgSW5pdFByb2Nlc3NQb3B1cHNSZXNwb25zZSgpOwoKICAgICAgICAvLyBJbml0aWFsaXplIHRhYmxlIGZpbHRlcgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXInKSwgJCgnI1Byb2Nlc3NlcycpLCAwKTsKCiAgICAgICAgLy8gaW5pdCBjaGVja2JveCB0byBpbmNsdWRlIGludmFsaWQgZWxlbWVudHMKICAgICAgICAkKCdpbnB1dCNJbmNsdWRlSW52YWxpZCcpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgiQmFzZWxpbmsiKSArICdBY3Rpb249JyArIENvcmUuQ29uZmlnLkdldCgiQWN0aW9uIikgKyAnO0luY2x1ZGVJbnZhbGlkPScgKyAoICQodGhpcykuaXMoJzpjaGVja2VkJykgPyAxIDogMCApOwogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFVSTDsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVwZW5kaW5nIG9uIFN1YmFjdGlvbiBpbml0aWFsaXplIHNwZWNpZmljIGZ1bmN0aW9ucwogICAgICAgIGlmIChTdWJhY3Rpb24gPT09ICdBY3Rpdml0eU5ldycgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnQWN0aXZpdHlOZXdBY3Rpb24nIHx8CiAgICAgICAgICAgIFN1YmFjdGlvbiA9PT0gJ0FjdGl2aXR5RWRpdCcgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnQWN0aXZpdHlFZGl0QWN0aW9uJykgewogICAgICAgICAgICBUYXJnZXROUy5Jbml0QWN0aXZpdHlFZGl0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKFN1YmFjdGlvbiA9PT0gJ0FjdGl2aXR5RGlhbG9nTmV3JyB8fAogICAgICAgICAgICBTdWJhY3Rpb24gPT09ICdBY3Rpdml0eURpYWxvZ05ld0FjdGlvbicgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnQWN0aXZpdHlEaWFsb2dFZGl0JyB8fAogICAgICAgICAgICBTdWJhY3Rpb24gPT09ICdBY3Rpdml0eURpYWxvZ0VkaXRBY3Rpb24nKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkluaXRBY3Rpdml0eURpYWxvZ0VkaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbk5ldycgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbk5ld0FjdGlvbicgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbkVkaXQnIHx8CiAgICAgICAgICAgIFN1YmFjdGlvbiA9PT0gJ1RyYW5zaXRpb25FZGl0QWN0aW9uJykgewogICAgICAgICAgICBUYXJnZXROUy5Jbml0VHJhbnNpdGlvbkVkaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbkFjdGlvbk5ldycgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbkFjdGlvbk5ld0FjdGlvbicgfHwKICAgICAgICAgICAgU3ViYWN0aW9uID09PSAnVHJhbnNpdGlvbkFjdGlvbkVkaXQnIHx8CiAgICAgICAgICAgIFN1YmFjdGlvbiA9PT0gJ1RyYW5zaXRpb25BY3Rpb25FZGl0QWN0aW9uJykgewogICAgICAgICAgICBUYXJnZXROUy5Jbml0VHJhbnNpdGlvbkFjdGlvbkVkaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3ViYWN0aW9uID09PSAnUHJvY2Vzc0VkaXQnIHx8CiAgICAgICAgICAgIFN1YmFjdGlvbiA9PT0gJ1Byb2Nlc3NFZGl0QWN0aW9uJykgewogICAgICAgICAgICBUYXJnZXROUy5Jbml0UHJvY2Vzc0VkaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoU3ViYWN0aW9uID09PSAnUHJvY2Vzc1ByaW50JykgewogICAgICAgICAgICAkKCcuUHJvY2Vzc1ByaW50Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBEZXBlbmRpbmcgb24gQWN0aW9uIGluaXRpYWxpemUgc3BlY2lmaWMgZnVuY3Rpb25zCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZG1pblByb2Nlc3NNYW5hZ2VtZW50UGF0aCcgJiYgU3ViYWN0aW9uICE9PSAnQ2xvc2VQb3B1cCcpIHsKICAgICAgICAgICBUYXJnZXROUy5Jbml0UGF0aEVkaXQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEluaXRQcm9jZXNzUG9wdXBzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgbmVlZGVkIHBvcHVwIGhhbmRsZXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEluaXRQcm9jZXNzUG9wdXBzKCkgewogICAgICAgICQoJ2EuQXNQb3B1cCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIE1hdGNoZXMsCiAgICAgICAgICAgICAgICBQb3B1cFR5cGUgPSAnUHJvY2Vzcyc7CgogICAgICAgICAgICBNYXRjaGVzID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLm1hdGNoKC9Qb3B1cFR5cGVfKFx3KykvKTsKICAgICAgICAgICAgaWYgKE1hdGNoZXMpIHsKICAgICAgICAgICAgICAgIFBvcHVwVHlwZSA9IE1hdGNoZXNbMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChQb3B1cFR5cGUgIT09ICdQcm9jZXNzT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93T3ZlcmxheSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgUG9wdXBUeXBlKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCdhLkFzUG9wdXBfUmVkaXJlY3QnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRm9ybSA9ICQodGhpcykuY2xvc2VzdCgnZm9ybScpOwoKICAgICAgICAgICAgJCgnI1BvcHVwUmVkaXJlY3QnKS52YWwoMSk7CiAgICAgICAgICAgICQoJyNQb3B1cFJlZGlyZWN0QWN0aW9uJykudmFsKCQodGhpcykuZGF0YSgnYWN0aW9uJykpOwogICAgICAgICAgICAkKCcjUG9wdXBSZWRpcmVjdFN1YmFjdGlvbicpLnZhbCgkKHRoaXMpLmRhdGEoJ3N1YmFjdGlvbicpKTsKICAgICAgICAgICAgJCgnI1BvcHVwUmVkaXJlY3RJRCcpLnZhbCgkKHRoaXMpLmRhdGEoJ2lkJykpOwogICAgICAgICAgICAkKCcjUG9wdXBSZWRpcmVjdEVudGl0eUlEJykudmFsKCQodGhpcykuZGF0YSgnZW50aXR5JykpOwogICAgICAgICAgICAvLyBPbmx5IHVzZWQgZm9yIHBhdGggcG9wdXAKICAgICAgICAgICAgJCgnI1BvcHVwUmVkaXJlY3RTdGFydEFjdGl2aXR5SUQnKS52YWwoJCh0aGlzKS5kYXRhKCdzdGFydGFjdGl2aXR5aWQnKSk7CgogICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnRWRpdF9Db25maXJtJykpIHsKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuY29uZmlybShDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXMgc29vbiBhcyB5b3UgdXNlIHRoaXMgYnV0dG9uIG9yIGxpbmssIHlvdSB3aWxsIGxlYXZlIHRoaXMgc2NyZWVuIGFuZCBpdHMgY3VycmVudCBzdGF0ZSB3aWxsIGJlIHNhdmVkIGF1dG9tYXRpY2FsbHkuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbmJlZm9yZXVubG9hZCBldmVudCBvbmx5IGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gcGVuZGluZyBvbiBmb3JtIHN1Ym1pdAogICAgICAgICAgICAgICAgICAgIGlmICghKCRGb3JtLmhhc0NsYXNzKCJWYWxpZGF0ZSIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykub2ZmKCJiZWZvcmV1bmxvYWQuUE1Qb3B1cCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbmJlZm9yZXVubG9hZCBldmVudCBvbmx5IGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gcGVuZGluZyBvbiBmb3JtIHN1Ym1pdAogICAgICAgICAgICAgICAgaWYgKCEoJEZvcm0uaGFzQ2xhc3MoIlZhbGlkYXRlIikpKSB7CiAgICAgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnYS5Hb0JhY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSBvbmJlZm9yZXVubG9hZCBldmVudCAod2hpY2ggaXMgb25seSBuZWVkZWQgaWYgeW91IGNsb3NlIHRoZSBwb3B1cCB2aWEgdGhlIHdpbmRvdyAiWCIpCiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSW5pdFByb2Nlc3NQb3B1cHNSZXNwb25zZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHJlZGlyZWN0IGFuZCBjbG9zZSBwb3B1cHMgcmVzcG9uc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEluaXRQcm9jZXNzUG9wdXBzUmVzcG9uc2UoKSB7CiAgICAgICAgdmFyIFJlZGlyZWN0ID0gQ29yZS5Db25maWcuR2V0KCdSZWRpcmVjdCcpLAogICAgICAgICAgICBDbG9zZVBvcHVwID0gQ29yZS5Db25maWcuR2V0KCdDbG9zZVBvcHVwJyksCiAgICAgICAgICAgIERhdGE7CgogICAgICAgIGlmICh0eXBlb2YgUmVkaXJlY3QgIT09ICd1bmRlZmluZWQnKSB7CgogICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgQWN0aW9uOiBSZWRpcmVjdC5BY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFJlZGlyZWN0LlN1YmFjdGlvbiwKICAgICAgICAgICAgICAgIElEOiBSZWRpcmVjdC5JRCwKICAgICAgICAgICAgICAgIEVudGl0eUlEOiBSZWRpcmVjdC5FbnRpdHlJRCwKICAgICAgICAgICAgICAgIEZpZWxkOiBSZWRpcmVjdC5GaWVsZCwKICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlJRDogUmVkaXJlY3QuU3RhcnRBY3Rpdml0eUlECiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzZW5kIHJlc3VsdHMgdG8gbWFpbiB3aW5kb3cKICAgICAgICAgICAgd2luZG93Lm9wZW5lci5Db3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LlVwZGF0ZUNvbmZpZyhSZWRpcmVjdC5Db25maWdKU09OKTsKCiAgICAgICAgICAgIC8vIHJlbG9hZCBwb3B1cAogICAgICAgICAgICBDb3JlLkFwcC5JbnRlcm5hbFJlZGlyZWN0KERhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgQ2xvc2VQb3B1cCAhPT0gJ3VuZGVmaW5lZCcpIHsKCiAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIuQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5VcGRhdGVTY3JlZW5zUGF0aCh3aW5kb3csIGZ1bmN0aW9uIChXaW5kb3dPYmplY3QpIHsKICAgICAgICAgICAgICAgIC8vc2VuZCByZXN1bHRzIHRvIG1haW4gd2luZG93CiAgICAgICAgICAgICAgICBXaW5kb3dPYmplY3Qub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuVXBkYXRlQ29uZmlnKENsb3NlUG9wdXAuQ29uZmlnSlNPTik7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIGFjY29yZGlvbgogICAgICAgICAgICAgICAgV2luZG93T2JqZWN0Lm9wZW5lci5Db3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LlVwZGF0ZUFjY29yZGlvbigpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzeW5jIG1lc3NhZ2UKICAgICAgICAgICAgICAgIFdpbmRvd09iamVjdC5vcGVuZXIuQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5VcGRhdGVTeW5jTWVzc2FnZSgpOwoKICAgICAgICAgICAgICAgIC8vIHJlZHJhdyBjYW52YXMKICAgICAgICAgICAgICAgIFdpbmRvd09iamVjdC5vcGVuZXIuQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5DYW52YXMuUmVkcmF3KCk7CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG92ZXJsYXkKICAgICAgICAgICAgICAgIFdpbmRvd09iamVjdC5vcGVuZXIuQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5IaWRlT3ZlcmxheSgpOwoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvbmJlZm9yZXVubG9hZCBldmVudCAod2hpY2ggaXMgb25seSBuZWVkZWQgaWYgeW91IGNsb3NlIHRoZSBwb3B1cCB2aWEgdGhlIHdpbmRvdyAiWCIpCiAgICAgICAgICAgICAgICAkKFdpbmRvd09iamVjdCkub2ZmKCJiZWZvcmV1bmxvYWQuUE1Qb3B1cCIpOwoKICAgICAgICAgICAgICAgIC8vIGNsb3NlIHBvcHVwCiAgICAgICAgICAgICAgICBXaW5kb3dPYmplY3QuY2xvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dEZWxldGVQcm9jZXNzQ29uZmlybWF0aW9uRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gZGVsZXRlIHByb2Nlc3Nlcy4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RlbGV0ZVByb2Nlc3NDb25maXJtYXRpb25EaWFsb2coJEVsZW1lbnQpIHsKICAgICAgICB2YXIgRGlhbG9nRWxlbWVudCA9ICRFbGVtZW50LmRhdGEoJ2RpYWxvZy1lbGVtZW50JyksCiAgICAgICAgICAgIERpYWxvZ1RpdGxlID0gJEVsZW1lbnQuZGF0YSgnZGlhbG9nLXRpdGxlJyksCiAgICAgICAgICAgIFByb2Nlc3NJRCA9ICRFbGVtZW50LmRhdGEoJ2lkJyk7CgogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKAogICAgICAgICAgICAkKCcjRGlhbG9ncyAjJyArIERpYWxvZ0VsZW1lbnQpLAogICAgICAgICAgICBEaWFsb2dUaXRsZSwKICAgICAgICAgICAgJzI0MHB4JywKICAgICAgICAgICAgJ0NlbnRlcicsCiAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwnKSwKICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZycpKTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWxldGUnKSwKICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdQcm9jZXNzRGVsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiBQcm9jZXNzSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBkaWFsb2cgdG8gYW4gYWpheCBsb2FkZXIKICAgICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5Db250ZW50Rm9vdGVyJykuZW1wdHkoKS5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLklubmVyQ29udGVudCcpLmVtcHR5KCkuYXBwZW5kKCc8ZGl2IGNsYXNzPSJTcGFjaW5nIENlbnRlciI+PHNwYW4gY2xhc3M9IkFKQVhMb2FkZXIiPjwvc3Bhbj48L2Rpdj4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgYWpheCBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UgfHwgIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFJlc3BvbnNlLk1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BcHAuSW50ZXJuYWxSZWRpcmVjdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IERhdGEuQWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgIH0sICdqc29uJyk7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBTaG93RGVsZXRlRW50aXR5Q29uZmlybWF0aW9uRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbnRpdHlUeXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW50aXR5TmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVudGl0eUlECiAgICAgKiBAcGFyYW0ge1N0cmluZ30gSXRlbUlECiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIGRlbGV0ZSBlbnRpdGllcy4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RlbGV0ZUVudGl0eUNvbmZpcm1hdGlvbkRpYWxvZygkRWxlbWVudCwgRW50aXR5VHlwZSwgRW50aXR5TmFtZSwgRW50aXR5SUQsIEl0ZW1JRCkgewogICAgICAgIHZhciBEaWFsb2dJRCA9ICdEZWxldGUnICsgRW50aXR5VHlwZSArICdDb25maXJtYXRpb25EaWFsb2cnLAogICAgICAgICAgICAkRGlhbG9nRWxlbWVudCA9ICQoJyNEaWFsb2dzICMnICsgRGlhbG9nSUQpOwoKICAgICAgICAvLyBVcGRhdGUgRW50aXR5TmFtZSBpbiBEaWFsb2cKICAgICAgICAkRGlhbG9nRWxlbWVudC5maW5kKCdzcGFuLkVudGl0eU5hbWUnKS50ZXh0KEVudGl0eU5hbWUpOwoKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygKICAgICAgICAgICAgJCgnI0RpYWxvZ3MgIycgKyBEaWFsb2dJRCksCiAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWxldGUgRW50aXR5JyksCiAgICAgICAgICAgICcyNDBweCcsCiAgICAgICAgICAgICdDZW50ZXInLAogICAgICAgICAgICB0cnVlLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ2FuY2VsJyksCiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2cnKSk7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVsZXRlJyksCiAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FkbWluUHJvY2Vzc01hbmFnZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnRW50aXR5RGVsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eVR5cGU6IEVudGl0eVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlJRDogRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQ6IEl0ZW1JRAogICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGRpYWxvZyB0byBhbiBhamF4IGxvYWRlcgogICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2cnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLkNvbnRlbnRGb290ZXInKS5lbXB0eSgpLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuSW5uZXJDb250ZW50JykuZW1wdHkoKS5hcHBlbmQoJzxkaXYgY2xhc3M9IlNwYWNpbmcgQ2VudGVyIj48c3BhbiBjbGFzcz0iQUpBWExvYWRlciI+PC9zcGFuPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBhamF4IGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLCBEYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZSB8fCAhUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZWxlbWVudCBmcm9tIGFjY29yZGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5jbG9zZXN0KCdsaScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nJykpOwogICAgICAgICAgICAgICAgICAgICAgIH0sICdqc29uJyk7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBJbml0RGVsZXRlRW50aXR5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGhhbmRsZXIgdG8gZGVsZXRlIGVudGl0aWVzLgogICAgICovCiAgICBmdW5jdGlvbiBJbml0RGVsZXRlRW50aXR5KCkgewogICAgICAgICQoJ2EuRGVsZXRlRW50aXR5Jykub24oJ2NsaWNrLkRlbGV0ZUVudGl0eScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIEVudGl0eUlEID0gJCh0aGlzKS5jbG9zZXN0KCdsaScpLmRhdGEoJ2VudGl0eScpLAogICAgICAgICAgICAgICAgRW50aXR5TmFtZSA9ICQodGhpcykuY2xvc2VzdCgnbGknKS5jbG9uZSgpLmNoaWxkcmVuKCkucmVtb3ZlKCkuZW5kKCkudGV4dCgpLAogICAgICAgICAgICAgICAgSXRlbUlEID0gJCh0aGlzKS5jbG9zZXN0KCdsaScpLmRhdGEoJ2lkJyksCiAgICAgICAgICAgICAgICBFbnRpdHlUeXBlOwoKICAgICAgICAgICAgaWYgKCFFbnRpdHlJRC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ0RlbGV0ZUFjdGl2aXR5JykpIHsKICAgICAgICAgICAgICAgIEVudGl0eVR5cGUgPSAnQWN0aXZpdHknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ0RlbGV0ZUFjdGl2aXR5RGlhbG9nJykpIHsKICAgICAgICAgICAgICAgIEVudGl0eVR5cGUgPSAnQWN0aXZpdHlEaWFsb2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ0RlbGV0ZVRyYW5zaXRpb24nKSkgewogICAgICAgICAgICAgICAgRW50aXR5VHlwZSA9ICdUcmFuc2l0aW9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdEZWxldGVUcmFuc2l0aW9uQWN0aW9uJykpIHsKICAgICAgICAgICAgICAgIEVudGl0eVR5cGUgPSAnVHJhbnNpdGlvbkFjdGlvbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNob3dEZWxldGVFbnRpdHlDb25maXJtYXRpb25EaWFsb2coJCh0aGlzKSwgRW50aXR5VHlwZSwgRW50aXR5TmFtZSwgRW50aXR5SUQsIEl0ZW1JRCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQcm9jZXNzRGF0YQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBtZW1iZXIge09iamVjdH0KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgIFN0cnVjdHVyZSB0byBzYXZlIGFsbCBwcm9jZXNzIGRhdGEuCiAgICAgKi8KICAgIFRhcmdldE5TLlByb2Nlc3NEYXRhID0ge307CgogICAgLyoqCiAgICAgKiBAbmFtZSBQcm9jZXNzTGF5b3V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgU3RydWN0dXJlIHRvIHNhdmUgYWxsIGxheW91dCBkYXRhIGZvciB0aGUgcHJvY2Vzcy4KICAgICAqLwogICAgVGFyZ2V0TlMuUHJvY2Vzc0xheW91dCA9IHt9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdEFjY29yZGlvbkRuRAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIGFsbCBldmVudCBoYW5kbGVyIHRvIGRyYWcgYW5kIGRyb3AgZWxlbWVudHMgZnJvbSB0aGUgYWNjb3JkaW9uIHRvIHRoZSBjYW52YXMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRBY2NvcmRpb25EbkQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAbmFtZSBHZXRNb3VzZVBvc2l0aW9uCiAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LkluaXRBY2NvcmRpb25ETkQKICAgICAgICogQGZ1bmN0aW9uCiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1vdXNlIHBvc2l0aW9uLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gRXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0LgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogICAgICBDYWxjdWxhdGVzIG1vdXNlIHBvc2l0aW9uLgogICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBHZXRNb3VzZVBvc2l0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgIHZhciBQb3NYID0gMCwKICAgICAgICAgICAgICAgIFBvc1kgPSAwOwogICAgICAgICAgICBpZiAoIUV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoRXZlbnQucGFnZVggfHwgRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgIFBvc1ggPSBFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5wYWdlWTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFdmVudC5jbGllbnRYIHx8IEV2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgIFBvc1ggPSBFdmVudC5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICBQb3NZID0gRXZlbnQuY2xpZW50WSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHtsZWZ0OiBQb3NYLCB0b3A6IFBvc1l9OwogICAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAbmFtZSBHZXRQb3NpdGlvbk9uQ2FudmFzCiAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LkluaXRBY2NvcmRpb25ETkQKICAgICAgICogQGZ1bmN0aW9uCiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFBvc2l0aW9uIG9mIG1vdXNlIG9uIGNhbnZhcy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IEV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdC4KICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqICAgICAgQ2FsY3VsYXRlcyBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBjYW52YXMgb2JqZWN0LgogICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBHZXRQb3NpdGlvbk9uQ2FudmFzKEV2ZW50KSB7CiAgICAgICAgICAgIHZhciAkQ2FudmFzID0gJCgnI0NhbnZhcycpLAogICAgICAgICAgICAgICAgQ2FudmFzUG9zaXRpb24sCiAgICAgICAgICAgICAgICBNb3VzZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgUG9zWCwgUG9zWTsKCiAgICAgICAgICAgIENhbnZhc1Bvc2l0aW9uID0gJENhbnZhcy5vZmZzZXQoKTsKICAgICAgICAgICAgTW91c2VQb3NpdGlvbiA9IEdldE1vdXNlUG9zaXRpb24oRXZlbnQpOwoKICAgICAgICAgICAgUG9zWCA9IE1vdXNlUG9zaXRpb24ubGVmdCAtIENhbnZhc1Bvc2l0aW9uLmxlZnQ7CiAgICAgICAgICAgIFBvc1kgPSBNb3VzZVBvc2l0aW9uLnRvcCAtIENhbnZhc1Bvc2l0aW9uLnRvcDsKCiAgICAgICAgICAgIHJldHVybiB7bGVmdDogUG9zWCwgdG9wOiBQb3NZfTsKICAgICAgICB9CgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICogQG5hbWUgQWRkQWN0aXZpdHlUb0NhbnZhcwogICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5Jbml0QWNjb3JkaW9uRE5ECiAgICAgICAqIEBmdW5jdGlvbgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gRXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0LgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gVUkgLSBqUXVlcnkgVUkgb2JqZWN0LgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogICAgICBBZGRzIGFjdGl2aXR5IHRvIHRoZSBjYW52YXMgYWZ0ZXIgZHJvcCBldmVudC4KICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQWRkQWN0aXZpdHlUb0NhbnZhcyhFdmVudCwgVUkpIHsKICAgICAgICAgICAgdmFyIFBvc2l0aW9uID0gR2V0UG9zaXRpb25PbkNhbnZhcyhFdmVudCksCiAgICAgICAgICAgICAgICBFbnRpdHlJRCA9ICQoVUkuZHJhZ2dhYmxlKS5kYXRhKCdlbnRpdHknKSwKICAgICAgICAgICAgICAgIEFjdGl2aXR5SUQgPSAkKFVJLmRyYWdnYWJsZSkuZGF0YSgnaWQnKSwKICAgICAgICAgICAgICAgIEVudGl0eSA9IFRhcmdldE5TLlByb2Nlc3NEYXRhLkFjdGl2aXR5W0VudGl0eUlEXSwKICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9ICQoJyNQcm9jZXNzRW50aXR5SUQnKS52YWwoKSwKICAgICAgICAgICAgICAgIFBhdGgsIFBhdGhMZW5ndGggPSAwLCBQYXRoS2V5OwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBFbnRpdHkgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBBY3Rpdml0eSBpcyBhbHJlYWR5IHBsYWNlZAogICAgICAgICAgICAgICAgLy8gSWYgc28sIGl0IGNhbid0IGJlIHBsYWNlZCBhZ2FpbgogICAgICAgICAgICAgICAgUGF0aCA9IFRhcmdldE5TLlByb2Nlc3NEYXRhLlByb2Nlc3NbUHJvY2Vzc0VudGl0eUlEXS5QYXRoOwoKICAgICAgICAgICAgICAgIGlmICghUGF0aFtFbnRpdHlJRF0pIHsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgUGF0aFtFbnRpdHlJRF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgTGF5b3V0CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0xheW91dFtFbnRpdHlJRF0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc2l0aW9uLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogUG9zaXRpb24udG9wCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IEVudGl0eQogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5DcmVhdGVBY3Rpdml0eShFbnRpdHlJRCwgRW50aXR5Lk5hbWUsIEFjdGl2aXR5SUQsIFBvc2l0aW9uLmxlZnQsIFBvc2l0aW9uLnRvcCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGdldCBQYXRoIGxlbmd0aAogICAgICAgICAgICAgICAgICAgIGZvciAoUGF0aEtleSBpbiBQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQYXRoLmhhc093blByb3BlcnR5KFBhdGhLZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoTGVuZ3RoKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG90aGVyIGFjdGl2aXR5IGlzIG9uIHRoZSBjYW52YXMsIG1ha2UgdGhpcyBhY3Rpdml0eSB0byB0aGUgc3RhcnRhY3Rpdml0eQogICAgICAgICAgICAgICAgICAgIGlmIChQYXRoTGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5TZXRTdGFydEFjdGl2aXR5KEVudGl0eUlEKTsKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuUHJvY2Vzc1tQcm9jZXNzRW50aXR5SURdLlN0YXJ0QWN0aXZpdHkgPSBFbnRpdHlJRDsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5DYW52YXMuTWFrZURyYWdnYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgQWN0aXZpdHkgaXMgYWxyZWFkeSB1c2VkIGluIHRoZSBQcm9jZXNzLiBZb3UgY2Fubm90IGFkZCBpdCB0d2ljZSEnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnRXJyb3I6IEVudGl0eSBub3QgZGVmaW5lZCEnLCAnUHJvY2Vzc0Vycm9yJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICogQG5hbWUgQ2hlY2tJZk1vdXNlUG9zaXRpb25Jc092ZXJBY3Rpdml0eQogICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5Jbml0QWNjb3JkaW9uRE5ECiAgICAgICAqIEBmdW5jdGlvbgogICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfEJvb2xlYW59IFJldHVybnMgSUQgb2YgYWN0aXZpdHkgb3IgZmFsc2UsIGlmIG1vdXNlIGlzIG5vdCBvdmVyIGFuIGFjdGl2aXR5LgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gUG9zaXRpb24gLSBBIG1vdXNlIHBvc2l0aW9uIG9iamVjdC4KICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqICAgICAgQ2hlY2tzIGlmIG1vdXNlIHBvc2l0aW9uIGlzIG92ZXIgYW4gYWN0aXZpdHkgKGUuZy4gdG8gZHJvcCBhY3Rpdml0eSBkaWFsb2dzIHRvIGFuIGFjdGl2aXR5KS4KICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQ2hlY2tJZk1vdXNlUG9zaXRpb25Jc092ZXJBY3Rpdml0eShQb3NpdGlvbikgewogICAgICAgICAgICB2YXIgUHJvY2Vzc0VudGl0eUlEID0gJCgnI1Byb2Nlc3NFbnRpdHlJRCcpLnZhbCgpLAogICAgICAgICAgICAgICAgUGF0aCA9IFRhcmdldE5TLlByb2Nlc3NEYXRhLlByb2Nlc3NbUHJvY2Vzc0VudGl0eUlEXS5QYXRoLAogICAgICAgICAgICAgICAgQWN0aXZpdHlNYXRjaCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCBhc3NpZ25lZCBhY3Rpdml0aWVzIGFuZCBjaGVjayB0aGUgcG9zaXRpb24KICAgICAgICAgICAgJC5lYWNoKFBhdGgsIGZ1bmN0aW9uIChLZXkpIHsKICAgICAgICAgICAgICAgIHZhciBBY3Rpdml0eVBvc2l0aW9uID0gVGFyZ2V0TlMuUHJvY2Vzc0xheW91dFtLZXldOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbi5sZWZ0ID4gcGFyc2VJbnQoQWN0aXZpdHlQb3NpdGlvbi5sZWZ0LCAxMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24ubGVmdCA8IHBhcnNlSW50KEFjdGl2aXR5UG9zaXRpb24ubGVmdCwgMTApICsgMTEwICYmCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uLnRvcCA+IHBhcnNlSW50KEFjdGl2aXR5UG9zaXRpb24udG9wLCAxMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24udG9wIDwgcGFyc2VJbnQoQWN0aXZpdHlQb3NpdGlvbi50b3AsIDEwKSArIDgwCiAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYXRjaCA9IEtleTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYXRjaDsKICAgICAgICB9CgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICogQG5hbWUgQWRkQWN0aXZpdHlEaWFsb2dUb0NhbnZhcwogICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5Jbml0QWNjb3JkaW9uRE5ECiAgICAgICAqIEBmdW5jdGlvbgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gRXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0LgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gVUkgLSBqUXVlcnkgVUkgb2JqZWN0LgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogICAgICBBZGRzIGFjdGl2aXR5IGRpYWxvZyB0byB0aGUgY2FudmFzIGFmdGVyIGRyb3AgZXZlbnQuCiAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIEFkZEFjdGl2aXR5RGlhbG9nVG9DYW52YXMoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgIHZhciBQb3NpdGlvbiA9IEdldFBvc2l0aW9uT25DYW52YXMoRXZlbnQpLAogICAgICAgICAgICAgICAgRW50aXR5SUQgPSAkKFVJLmRyYWdnYWJsZSkuZGF0YSgnZW50aXR5JyksCiAgICAgICAgICAgICAgICBFbnRpdHkgPSBUYXJnZXROUy5Qcm9jZXNzRGF0YS5BY3Rpdml0eURpYWxvZ1tFbnRpdHlJRF0sCiAgICAgICAgICAgICAgICBBY3Rpdml0eSwgQUpBWERhdGE7CgogICAgICAgICAgICBpZiAodHlwZW9mIEVudGl0eSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG1vdXNlIHBvc2l0aW9uIGlzIHdpdGhpbiBhbiBhY3Rpdml0eQogICAgICAgICAgICAgICAgLy8gSWYgeWVzLCBhZGQgdGhlIERpYWxvZyB0byB0aGUgQWN0aXZpdHkKICAgICAgICAgICAgICAgIC8vIGlmIG5vdCwganVzdCBjYW5jZWwKICAgICAgICAgICAgICAgIEFjdGl2aXR5ID0gQ2hlY2tJZk1vdXNlUG9zaXRpb25Jc092ZXJBY3Rpdml0eShQb3NpdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgTGFiZWwsIHNob3cgTG9hZGVyCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQ2FudmFzLlNob3dBY3Rpdml0eUxvYWRlcihBY3Rpdml0eSk7CgogICAgICAgICAgICAgICAgICAgIC8vIENhbGwgQUpBWCBmdW5jdGlvbiB0byBhZGQgQWN0aXZpdHlEaWFsb2cgdG8gQWN0aXZpdHkKICAgICAgICAgICAgICAgICAgICBBSkFYRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnQWRkQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlJRDogQWN0aXZpdHksCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nOiBFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgQUpBWERhdGEsIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlIHx8ICFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFJlc3BvbnNlLk1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Vycm9yIGR1cmluZyBBSkFYIGNvbW11bmljYXRpb24nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQ2FudmFzLlNob3dBY3Rpdml0eUFkZEFjdGl2aXR5RGlhbG9nRXJyb3IoQWN0aXZpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5DYW52YXMuU2hvd0FjdGl2aXR5QWRkQWN0aXZpdHlEaWFsb2dTdWNjZXNzKEFjdGl2aXR5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBDb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuQWN0aXZpdHlbQWN0aXZpdHldID0gUmVzcG9uc2UuQWN0aXZpdHlDb25maWcuQWN0aXZpdHlbQWN0aXZpdHldOwoKICAgICAgICAgICAgICAgICAgICB9LCAnanNvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ0Vycm9yOiBFbnRpdHkgbm90IGRlZmluZWQhJywgJ1Byb2Nlc3NFcnJvcicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBuYW1lIER1bW15QWN0aXZpdHlDb25uZWN0ZWQKICAgICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuSW5pdEFjY29yZGlvbkRORAogICAgICAgKiBAZnVuY3Rpb24KICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYSBkdW1teSBlbmRwb2ludCB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFByb2Nlc3NFbnRpdHlJRCAtIFRoZSBwcm9jZXNzIElELgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogICAgICBDaGVjayBpZiBhbnkgdHJhbnNpdGlvbiBoYXMgYSBkdW1teSBlbmRwb2ludC4KICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gRHVtbXlBY3Rpdml0eUNvbm5lY3RlZChQcm9jZXNzRW50aXR5SUQpIHsKICAgICAgICAgICAgdmFyIER1bW15Rm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgJC5lYWNoKFRhcmdldE5TLlByb2Nlc3NEYXRhLlByb2Nlc3NbUHJvY2Vzc0VudGl0eUlEXS5QYXRoLCBmdW5jdGlvbiAoQWN0aXZpdHksIEFjdGl2aXR5RGF0YSkgewogICAgICAgICAgICAgICAgJC5lYWNoKEFjdGl2aXR5RGF0YSwgZnVuY3Rpb24gKFRyYW5zaXRpb24sIFRyYW5zaXRpb25EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUcmFuc2l0aW9uRGF0YS5BY3Rpdml0eUVudGl0eUlEID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICBEdW1teUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBEdW1teUZvdW5kOwogICAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAbmFtZSBBZGRUcmFuc2l0aW9uVG9DYW52YXMKICAgICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuSW5pdEFjY29yZGlvbkRORAogICAgICAgKiBAZnVuY3Rpb24KICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIGEgYW5vdGhlciB1bmNvbm5lY3RlZCB0cmFuc2l0aW9uIGlzIG9uIHRoZSBjYW52YXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IEV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdC4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IFVJIC0galF1ZXJ5IFVJIG9iamVjdC4KICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqICAgICAgQWRkcyB0cmFuc2l0aW9uIHRvIHRoZSBjYW52YXMgYWZ0ZXIgZHJvcCBldmVudC4KICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQWRkVHJhbnNpdGlvblRvQ2FudmFzKEV2ZW50LCBVSSkgewogICAgICAgICAgICB2YXIgUG9zaXRpb24gPSBHZXRQb3NpdGlvbk9uQ2FudmFzKEV2ZW50KSwKICAgICAgICAgICAgICAgIEVudGl0eUlEID0gJChVSS5kcmFnZ2FibGUpLmRhdGEoJ2VudGl0eScpLAogICAgICAgICAgICAgICAgRW50aXR5ID0gVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuVHJhbnNpdGlvbltFbnRpdHlJRF0sCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPSAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpdml0eSwKICAgICAgICAgICAgICAgIFBhdGggPSBUYXJnZXROUy5Qcm9jZXNzRGF0YS5Qcm9jZXNzW1Byb2Nlc3NFbnRpdHlJRF0uUGF0aDsKCiAgICAgICAgICAgIC8vIGlmIGEgZHVtbXkgYWN0aXZpdHkgZXhpc3RzLCBhbm90aGVyIHRyYW5zaXRpb24gd2FzIHBsYWNlZCB0byB0aGUgY2FudmFzIGJ1dCBub3QgeWV0CiAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byBhbiBlbmQgcG9pbnQuIE9uZSBjYW5ub3QgcGxhY2UgdHdvIHVuY29ubmVjdGVkIHRyYW5zaXRpb25zIG9uIHRoZSBjYW52YXMuCiAgICAgICAgICAgIGlmICgkKCcjRHVtbXknKS5sZW5ndGggJiYgRHVtbXlBY3Rpdml0eUNvbm5lY3RlZChQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FuIHVuY29ubmVjdGVkIHRyYW5zaXRpb24gaXMgYWxyZWFkeSBwbGFjZWQgb24gdGhlIGNhbnZhcy4gUGxlYXNlIGNvbm5lY3QgdGhpcyB0cmFuc2l0aW9uIGZpcnN0IGJlZm9yZSBwbGFjaW5nIGFub3RoZXIgdHJhbnNpdGlvbi4nKSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mIEVudGl0eSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG1vdXNlIHBvc2l0aW9uIGlzIHdpdGhpbiBhbiBhY3Rpdml0eQogICAgICAgICAgICAgICAgLy8gSWYgeWVzLCBhZGQgdGhlIERpYWxvZyB0byB0aGUgQWN0aXZpdHkKICAgICAgICAgICAgICAgIC8vIGlmIG5vdCwganVzdCBjYW5jZWwKICAgICAgICAgICAgICAgIEFjdGl2aXR5ID0gQ2hlY2tJZk1vdXNlUG9zaXRpb25Jc092ZXJBY3Rpdml0eShQb3NpdGlvbik7CgogICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB0cmFuc2l0aW9uIGlzIGFscmVhZHkgYmluZCB0byB0aGlzIGFjdGl2aXR5CiAgICAgICAgICAgICAgICAvLyB5b3UgY2Fubm90IGJpbmQgaXQgYSBzZWNvbmQgdGltZQogICAgICAgICAgICAgICAgaWYgKFBhdGhbQWN0aXZpdHldICYmIHR5cGVvZiBQYXRoW0FjdGl2aXR5XVtFbnRpdHlJRF0gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgVHJhbnNpdGlvbiBpcyBhbHJlYWR5IHVzZWQgZm9yIHRoaXMgQWN0aXZpdHkuIFlvdSBjYW5ub3QgdXNlIGl0IHR3aWNlIScpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGR1bW15IGFjdGl2aXR5IHRvIHVzZSBmb3IgaW5pdGlhbCB0cmFuc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQ2FudmFzLkNyZWF0ZUFjdGl2aXR5RHVtbXkoQWN0aXZpdHkpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdHJhbnNpdGlvbiBiZXR3ZWVuIHRoaXMgQWN0aXZpdHkgYW5kIER1bW15RWxlbWVudAogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5DcmVhdGVUcmFuc2l0aW9uKEFjdGl2aXR5LCAnRHVtbXknLCBFbnRpdHlJRCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBUcmFuc2l0aW9uIHRvIFBhdGgKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFBhdGhbQWN0aXZpdHldID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICBQYXRoW0FjdGl2aXR5XSA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBQYXRoW0FjdGl2aXR5XVtFbnRpdHlJRF0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQ6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnRXJyb3I6IEVudGl0eSBub3QgZGVmaW5lZCEnLCAnUHJvY2Vzc0Vycm9yJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICogQG5hbWUgQWRkVHJhbnNpdGlvbkFjdGlvblRvQ2FudmFzCiAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LkluaXRBY2NvcmRpb25ETkQKICAgICAgICogQGZ1bmN0aW9uCiAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlLCBpZiB0cmFuc2l0aW9uIGlzIG5vdCBkZWZpbmVkLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gRXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0LgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gVUkgLSBqUXVlcnkgVUkgb2JqZWN0LgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogICAgICBBZGRzIHRyYW5zaXRpb24gYWN0aW9uIHRvIHRoZSBjYW52YXMgYWZ0ZXIgZHJvcCBldmVudC4KICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQWRkVHJhbnNpdGlvbkFjdGlvblRvQ2FudmFzKEV2ZW50LCBVSSkgewogICAgICAgICAgICB2YXIgRW50aXR5SUQgPSAkKFVJLmRyYWdnYWJsZSkuZGF0YSgnZW50aXR5JyksCiAgICAgICAgICAgICAgICBFbnRpdHkgPSBUYXJnZXROUy5Qcm9jZXNzRGF0YS5UcmFuc2l0aW9uQWN0aW9uW0VudGl0eUlEXSwKICAgICAgICAgICAgICAgIFRyYW5zaXRpb24sCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPSAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBQYXRoID0gVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuUHJvY2Vzc1tQcm9jZXNzRW50aXR5SURdLlBhdGg7CgogICAgICAgICAgICBpZiAodHlwZW9mIEVudGl0eSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIFRyYW5zaXRpb24gPSBUYXJnZXROUy5DYW52YXMuRHJhZ1RyYW5zaXRpb25BY3Rpb25UcmFuc2l0aW9uOwoKICAgICAgICAgICAgICAgIGlmICghVHJhbnNpdGlvbi5UcmFuc2l0aW9uSUQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhY3Rpb24gaXMgYWxyZWFkeSBib3VuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIC8vIHlvdSBjYW5ub3QgYmluZCBpdCBhIHNlY29uZCB0aW1lCiAgICAgICAgICAgICAgICBpZiAoUGF0aFtUcmFuc2l0aW9uLlN0YXJ0QWN0aXZpdHldICYmCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFBhdGhbVHJhbnNpdGlvbi5TdGFydEFjdGl2aXR5XVtUcmFuc2l0aW9uLlRyYW5zaXRpb25JRF0gIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFBhdGhbVHJhbnNpdGlvbi5TdGFydEFjdGl2aXR5XVtUcmFuc2l0aW9uLlRyYW5zaXRpb25JRF0uVHJhbnNpdGlvbkFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgICAgICAoJC5pbkFycmF5KEVudGl0eUlELCBQYXRoW1RyYW5zaXRpb24uU3RhcnRBY3Rpdml0eV1bVHJhbnNpdGlvbi5UcmFuc2l0aW9uSURdLlRyYW5zaXRpb25BY3Rpb24pID49IDApCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGhpcyBUcmFuc2l0aW9uQWN0aW9uIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIFBhdGguIFlvdSBjYW5ub3QgdXNlIGl0IHR3aWNlIScpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKFRyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAvLyBBZGQgQWN0aW9uIHRvIFBhdGgKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFBhdGhbVHJhbnNpdGlvbi5TdGFydEFjdGl2aXR5XVtUcmFuc2l0aW9uLlRyYW5zaXRpb25JRF0uVHJhbnNpdGlvbkFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFtUcmFuc2l0aW9uLlN0YXJ0QWN0aXZpdHldW1RyYW5zaXRpb24uVHJhbnNpdGlvbklEXS5UcmFuc2l0aW9uQWN0aW9uID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFBhdGhbVHJhbnNpdGlvbi5TdGFydEFjdGl2aXR5XVtUcmFuc2l0aW9uLlRyYW5zaXRpb25JRF0uVHJhbnNpdGlvbkFjdGlvbi5wdXNoKEVudGl0eUlEKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBzdWNjZXNzIGljb24gaW4gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgICAgJChUcmFuc2l0aW9uLkNvbm5lY3Rpb24uY2FudmFzKS5hcHBlbmQoJzxkaXYgY2xhc3M9Ikljb24gU3VjY2VzcyI+PC9kaXY+JykuZmluZCgnLkljb24nKS5mYWRlSW4oKS5kZWxheSgxMDAwKS5mYWRlT3V0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnRXJyb3I6IEVudGl0eSBub3QgZGVmaW5lZCEnLCAnUHJvY2Vzc0Vycm9yJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICQoJyNBY3Rpdml0aWVzIGxpLk9uZVJvdywgI0FjdGl2aXR5RGlhbG9ncyBsaS5PbmVSb3csICNUcmFuc2l0aW9ucyBsaS5PbmVSb3csICNUcmFuc2l0aW9uQWN0aW9ucyBsaS5PbmVSb3cnKS5kcmFnZ2FibGUoewogICAgICAgICAgICByZXZlcnQ6ICdpbnZhbGlkJywKICAgICAgICAgICAgaGVscGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJENsb25lID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAgICAgJENsb25lLmFkZENsYXNzKCdFbnRpdHlEcmFnJykuZmluZCgnc3BhbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICRDbG9uZVswXTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChFdmVudCwgVUkpIHsKICAgICAgICAgICAgICAgIHZhciAkU291cmNlID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICBTb3VyY2VJRCA9ICRTb3VyY2UuY2xvc2VzdCgndWwnKS5hdHRyKCdpZCcpOwoKICAgICAgICAgICAgICAgIGlmIChTb3VyY2VJRCA9PT0gJ0FjdGl2aXR5RGlhbG9ncycgfHwgU291cmNlSUQgPT09ICdUcmFuc2l0aW9ucycpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGV2ZW50IGZsYWcKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5DYW52YXMuRHJhZ0FjdGl2aXR5SXRlbSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICQoJyNDYW52YXMgLkFjdGl2aXR5JykuYWRkQ2xhc3MoJ0hpZ2hsaWdodGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChTb3VyY2VJRCA9PT0gJ1RyYW5zaXRpb25BY3Rpb25zJykgewogICAgICAgICAgICAgICAgICAgIC8vIFNldCBldmVudCBmbGFnCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQ2FudmFzLkRyYWdUcmFuc2l0aW9uQWN0aW9uID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IGFsbCBhdmFpbGFibGUgVHJhbnNpdGlvbnMKICAgICAgICAgICAgICAgICAgICAkKCcuVHJhbnNpdGlvbkxhYmVsJykuYWRkQ2xhc3MoJ0hpZ2hsaWdodGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVSS5oZWxwZXIuY3NzKCd6LWluZGV4JywgMTAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciAkU291cmNlID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICBTb3VyY2VJRCA9ICRTb3VyY2UuY2xvc2VzdCgndWwnKS5hdHRyKCdpZCcpOwoKICAgICAgICAgICAgICAgIGlmIChTb3VyY2VJRCA9PT0gJ0FjdGl2aXR5RGlhbG9ncycgfHwgU291cmNlSUQgPT09ICdUcmFuc2l0aW9ucycpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgZXZlbnQgZmxhZwogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5EcmFnQWN0aXZpdHlJdGVtID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICQoJyNDYW52YXMgLkFjdGl2aXR5JykucmVtb3ZlQ2xhc3MoJ0hpZ2hsaWdodGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChTb3VyY2VJRCA9PT0gJ1RyYW5zaXRpb25BY3Rpb25zJykgewogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGV2ZW50IGZsYWcKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5DYW52YXMuRHJhZ1RyYW5zaXRpb25BY3Rpb24gPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gVW5oaWdobGlnaHQgYWxsIGF2YWlsYWJsZSBUcmFuc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICQoJy5UcmFuc2l0aW9uTGFiZWwnKS5yZW1vdmVDbGFzcygnSGlnaGxpZ2h0ZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAkKCcjQ2FudmFzJykuZHJvcHBhYmxlKHsKICAgICAgICAgICAgYWNjZXB0OiAnI0FjdGl2aXRpZXMgbGkuT25lUm93LCAjQWN0aXZpdHlEaWFsb2dzIGxpLk9uZVJvdywgI1RyYW5zaXRpb25zIGxpLk9uZVJvdywgI1RyYW5zaXRpb25BY3Rpb25zIGxpLk9uZVJvdycsCiAgICAgICAgICAgIGRyb3A6IGZ1bmN0aW9uIChFdmVudCwgVUkpIHsKICAgICAgICAgICAgICAgIHZhciAkU291cmNlID0gJChVSS5kcmFnZ2FibGUpLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUlEID0gJFNvdXJjZS5jbG9zZXN0KCd1bCcpLmF0dHIoJ2lkJyk7CgogICAgICAgICAgICAgICAgaWYgKFNvdXJjZUlEID09PSAnQWN0aXZpdGllcycpIHsKICAgICAgICAgICAgICAgICAgICBBZGRBY3Rpdml0eVRvQ2FudmFzKEV2ZW50LCBVSSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChTb3VyY2VJRCA9PT0gJ0FjdGl2aXR5RGlhbG9ncycpIHsKICAgICAgICAgICAgICAgICAgICBBZGRBY3Rpdml0eURpYWxvZ1RvQ2FudmFzKEV2ZW50LCBVSSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChTb3VyY2VJRCA9PT0gJ1RyYW5zaXRpb25zJykgewogICAgICAgICAgICAgICAgICAgIEFkZFRyYW5zaXRpb25Ub0NhbnZhcyhFdmVudCwgVUkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoU291cmNlSUQgPT09ICdUcmFuc2l0aW9uQWN0aW9ucycpIHsKICAgICAgICAgICAgICAgICAgICBBZGRUcmFuc2l0aW9uQWN0aW9uVG9DYW52YXMoRXZlbnQsIFVJKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIENvcmUuRXhjZXB0aW9uLlRocm93KCdFcnJvcjogTm8gbWF0Y2hpbmcgZHJvcHBhYmxlIGZvdW5kJywgJ1Byb2Nlc3NFcnJvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgVXBkYXRlQWNjb3JkaW9uCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVXBkYXRlIGFjY29yZGlvbiBkYXRhIGZyb20gc2VydmVyLgogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVBY2NvcmRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZ2V0IG5ldyBBY2NvcmRpb24gSFRNTCB2aWEgQUpBWCBhbmQgcmVwbGFjZSB0aGUgYWNjb3JkaW9uIHdpdGggdGhpcyBIVE1MCiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY2NvcmRpb24gZnVuY3Rpb25zIChhY2NvcmRpb24sIGZpbHRlcnMsIERuRCkKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FkbWluUHJvY2Vzc01hbmFnZW1lbnQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlQWNjb3JkaW9uJwogICAgICAgICAgICB9LAogICAgICAgICAgICBBY3RpdmVFbGVtZW50SW5kZXggPSBwYXJzZUludCgkKCd1bCNQcm9jZXNzRWxlbWVudHMgPiBsaS5BY3RpdmUnKS5pbmRleCgpLCAxMCksCiAgICAgICAgICAgIEFjdGl2ZUVsZW1lbnRWYWx1ZSA9ICQoJ3VsI1Byb2Nlc3NFbGVtZW50cyA+IGxpOmVxKCcgKyBBY3RpdmVFbGVtZW50SW5kZXggKyAnKSAuUHJvY2Vzc0VsZW1lbnRGaWx0ZXInKS52YWwoKTsKCiAgICAgICAgLy8gQ2FsbCB0aGUgYWpheCBmdW5jdGlvbgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICQoJ3VsI1Byb2Nlc3NFbGVtZW50cycpLnJlcGxhY2VXaXRoKFJlc3BvbnNlKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgQWNjb3JkaW9uIGluIHRoZSBzaWRlYmFyCiAgICAgICAgICAgIENvcmUuVUkuQWNjb3JkaW9uLkluaXQoJCgndWwjUHJvY2Vzc0VsZW1lbnRzJyksICdsaS5BY2NvcmRpb25FbGVtZW50IGgyIGEnLCAnZGl2LkNvbnRlbnQnKTsKCiAgICAgICAgICAgIC8vIE9wZW4gYWNjb3JkaW9uIGVsZW1lbnQgYWdhaW4sIHdoaWNoIHdhcyBhY3RpdmUgYmVmb3JlIHRoZSB1cGRhdGUuCiAgICAgICAgICAgIENvcmUuVUkuQWNjb3JkaW9uLk9wZW5FbGVtZW50KCQoJ3VsI1Byb2Nlc3NFbGVtZW50cyA+IGxpOmVxKCcgKyBBY3RpdmVFbGVtZW50SW5kZXggKyAnKScpKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZmlsdGVycwogICAgICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjQWN0aXZpdHlGaWx0ZXInKSwgJCgnI0FjdGl2aXRpZXMnKSk7CiAgICAgICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNBY3Rpdml0eURpYWxvZ0ZpbHRlcicpLCAkKCcjQWN0aXZpdHlEaWFsb2dzJykpOwogICAgICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjVHJhbnNpdGlvbkZpbHRlcicpLCAkKCcjVHJhbnNpdGlvbnMnKSk7CiAgICAgICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNUcmFuc2l0aW9uQWN0aW9uRmlsdGVyJyksICQoJyNUcmFuc2l0aW9uQWN0aW9ucycpKTsKCiAgICAgICAgICAgIC8vIFNldCBwcmV2aW91cyB2YWx1ZSBhbmQgZmlsdGVyLgogICAgICAgICAgICAkKCd1bCNQcm9jZXNzRWxlbWVudHMgPiBsaTplcSgnICsgQWN0aXZlRWxlbWVudEluZGV4ICsgJykgLlByb2Nlc3NFbGVtZW50RmlsdGVyJykudHJpZ2dlcigna2V5ZG93bicpLnZhbChBY3RpdmVFbGVtZW50VmFsdWUpOwoKICAgICAgICAgICAgLy8gSW5pdCBEbkQgb24gQWNjb3JkaW9uCiAgICAgICAgICAgIFRhcmdldE5TLkluaXRBY2NvcmRpb25EbkQoKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGRpZmZlcmVudCBjcmVhdGUgYW5kIGVkaXQgbGlua3MvYnV0dG9ucwogICAgICAgICAgICBJbml0UHJvY2Vzc1BvcHVwcygpOwoKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGlmZmVyZW50IERlbGV0ZSBMaW5rcwogICAgICAgICAgICBJbml0RGVsZXRlRW50aXR5KCk7CiAgICAgICAgfSwgJ2h0bWwnKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBVcGRhdGVTeW5jTWVzc2FnZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENoZWNrIGlmIHRoZXJlIGlzIGEgJ2RpcnR5JyBzeW5jIHN0YXRlIGFuZCBzaG93IGEgbWVzc2FnZSBiZWxvdyB0aGUgaGVhZGVyLgogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVTeW5jTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhICdkaXJ0eScgc3luYyBzdGF0ZSBhbmQgc2hvdyBhIG1lc3NhZ2UgYmVsb3cgdGhlIGhlYWRlcgogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWRtaW5Qcm9jZXNzTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdVcGRhdGVTeW5jTWVzc2FnZScKICAgICAgICAgICAgfTsKCiAgICAgICAgLy8gQ2FsbCB0aGUgYWpheCBmdW5jdGlvbgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CgogICAgICAgICAgICBpZiAoIVJlc3BvbnNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkKCcuTWVzc2FnZUJveC5Ob3RpY2UnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKFJlc3BvbnNlKS5pbnNlcnRCZWZvcmUoJ2Rpdi5NYWluQm94Jyk7CgogICAgICAgIH0sICdodG1sJyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgVXBkYXRlU2NyZWVuc1BhdGgKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBXaW5kb3dPYmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IENhbGxiYWNrCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVXBkYXRlcyBzY3JlZW4gcGF0aC4KICAgICAqLwogICAgVGFyZ2V0TlMuVXBkYXRlU2NyZWVuc1BhdGggPSBmdW5jdGlvbiAoV2luZG93T2JqZWN0LCBDYWxsYmFjaykgewoKICAgICAgICAvLyBDb2xsZWN0IGRhdGEgZm9yIHVwZGF0ZSBvZiB0aGUgc2NyZWVuc3BhdGgKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FkbWluUHJvY2Vzc01hbmFnZW1lbnQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlU2NyZWVuc1BhdGgnLAogICAgICAgICAgICAgICAgUHJvY2Vzc0lEOiAkKCdpbnB1dFtuYW1lPUlEXScpLnZhbCgpLAogICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEOiAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgLy8gQ2FsbCB0aGUgYWpheCBmdW5jdGlvbgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgIGlmICghUmVzcG9uc2UgfHwgIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5NZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuTWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRXJyb3IgZHVyaW5nIEFKQVggY29tbXVuaWNhdGlvbicpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ2FsbGJhY2sgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2soV2luZG93T2JqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sICdqc29uJyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSGFuZGxlUG9wdXBDbG9zZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENsb3NlIG92ZXJsYXkgYW5kIHJlLWluaXRpYWxpemUgY2FudmFzIGFuZCBhY2NvcmRpb24uCiAgICAgKi8KICAgIFRhcmdldE5TLkhhbmRsZVBvcHVwQ2xvc2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gdXBkYXRlIGFjY29yZGlvbgogICAgICAgIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuVXBkYXRlQWNjb3JkaW9uKCk7CiAgICAgICAgLy8gcmVkcmF3IGNhbnZhcwogICAgICAgIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuQ2FudmFzLlJlZHJhdygpOwogICAgICAgIC8vIHJlbW92ZSBvdmVybGF5CiAgICAgICAgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5IaWRlT3ZlcmxheSgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRQcm9jZXNzRWRpdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgcHJvY2VzcyBlZGl0IHNjcmVlbi4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFByb2Nlc3NFZGl0ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgQ29uZmlnUHJvY2VzcyA9IENvcmUuQ29uZmlnLkdldCgnQ29uZmlnUHJvY2VzcycpOwoKICAgICAgICAvLyBHZXQgUHJvY2VzcyBEYXRhCiAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0RhdGEgPSB7CiAgICAgICAgICAgIFByb2Nlc3M6IENvbmZpZ1Byb2Nlc3MuUHJvY2VzcywKICAgICAgICAgICAgQWN0aXZpdHk6IENvbmZpZ1Byb2Nlc3MuQWN0aXZpdHksCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nOiBDb25maWdQcm9jZXNzLkFjdGl2aXR5RGlhbG9nLAogICAgICAgICAgICBUcmFuc2l0aW9uOiBDb25maWdQcm9jZXNzLlRyYW5zaXRpb24sCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb246IENvbmZpZ1Byb2Nlc3MuVHJhbnNpdGlvbkFjdGlvbgogICAgICAgIH07CgogICAgICAgIFRhcmdldE5TLlByb2Nlc3NMYXlvdXQgPSBDb25maWdQcm9jZXNzLlByb2Nlc3NMYXlvdXQ7CgogICAgICAgIC8vIEluaXRpYWxpemUgQWNjb3JkaW9uIGluIHRoZSBzaWRlYmFyCiAgICAgICAgQ29yZS5VSS5BY2NvcmRpb24uSW5pdCgkKCd1bCNQcm9jZXNzRWxlbWVudHMnKSwgJ2xpLkFjY29yZGlvbkVsZW1lbnQgaDIgYScsICdkaXYuQ29udGVudCcpOwoKICAgICAgICAvLyBJbml0aWFsaXplIGZpbHRlcnMKICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjQWN0aXZpdHlGaWx0ZXInKSwgJCgnI0FjdGl2aXRpZXMnKSk7CiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0FjdGl2aXR5RGlhbG9nRmlsdGVyJyksICQoJyNBY3Rpdml0eURpYWxvZ3MnKSk7CiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI1RyYW5zaXRpb25GaWx0ZXInKSwgJCgnI1RyYW5zaXRpb25zJykpOwogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNUcmFuc2l0aW9uQWN0aW9uRmlsdGVyJyksICQoJyNUcmFuc2l0aW9uQWN0aW9ucycpKTsKCiAgICAgICAgLy8gSW5pdCBEbkQgb24gQWNjb3JkaW9uCiAgICAgICAgVGFyZ2V0TlMuSW5pdEFjY29yZGlvbkRuRCgpOwoKICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkaWZmZXJlbnQgRGVsZXRlIExpbmtzCiAgICAgICAgSW5pdERlbGV0ZUVudGl0eSgpOwoKICAgICAgICAvLyBJbml0aWFsaXplIERlbGV0ZVByb2Nlc3MKICAgICAgICAkKCcjUHJvY2Vzc0RlbGV0ZScpLm9uKCdjbGljay5Qcm9jZXNzRGVsZXRlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIFNob3dEZWxldGVQcm9jZXNzQ29uZmlybWF0aW9uRGlhbG9nKCQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCdhJykpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IHN1Ym1pdCBmdW5jdGlvbgogICAgICAgICQoJyNTdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBQcm9jZXNzRW50aXR5SUQgPSAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5OwoKICAgICAgICAgICAgLy8gZ2V0IHByb2Nlc3MgbGF5b3V0IGFuZCBzdG9yZSBpdCBpbnRvIGEgaGlkZGVuIGZpZWxkIGFzIEpTT04gc3RyaW5nCiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9UHJvY2Vzc0xheW91dF0nKS52YWwoQ29yZS5KU09OLlN0cmluZ2lmeShUYXJnZXROUy5Qcm9jZXNzTGF5b3V0KSk7CgogICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgIm9wZW4iIHRyYW5zaXRpb25zLCBlLmcuIHRyYW5zaXRpb25zIHRoYXQgaGF2ZSBvbmx5IGEgc3RhcnRwb2ludCBidXQgbm8gZGVmaW5lZCBlbmRwb2ludAogICAgICAgICAgICAvLyB0aGVzZSBvcGVuIHRyYW5zaXRpb25zIG11c3QgYmUgZGVsZXRlZCBiZWZvcmUgc2F2aW5nCiAgICAgICAgICAgICQuZWFjaChUYXJnZXROUy5Qcm9jZXNzRGF0YS5Qcm9jZXNzW1Byb2Nlc3NFbnRpdHlJRF0uUGF0aCwgZnVuY3Rpb24gKEFjdGl2aXR5LCBBY3Rpdml0eURhdGEpIHsKICAgICAgICAgICAgICAgICQuZWFjaChBY3Rpdml0eURhdGEsIGZ1bmN0aW9uIChUcmFuc2l0aW9uLCBUcmFuc2l0aW9uRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVHJhbnNpdGlvbkRhdGEuQWN0aXZpdHlFbnRpdHlJRCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEFjdGl2aXR5RGF0YVtUcmFuc2l0aW9uXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBnZXQgcHJvY2VzcyBwYXRoIGFuZCBzdG9yZSBpdCBpbnRvIGEgaGlkZGVuIGZpZWxkIGFzIEpTT04gc3RyaW5nCiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9UGF0aF0nKS52YWwoQ29yZS5KU09OLlN0cmluZ2lmeShUYXJnZXROUy5Qcm9jZXNzRGF0YS5Qcm9jZXNzW1Byb2Nlc3NFbnRpdHlJRF0uUGF0aCkpOwoKICAgICAgICAgICAgLy8gZ2V0IHN0YXJ0IGFjdGl2aXR5IGFuZCBkaWFsb2dzIGFuZCBzdG9yZSBpdCBpbnRvIGhpZGRlbiBmaWVsZHMgYXMgSlNPTiBzdHJpbmcKICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSA9IFRhcmdldE5TLlByb2Nlc3NEYXRhLlByb2Nlc3NbUHJvY2Vzc0VudGl0eUlEXS5TdGFydEFjdGl2aXR5OwogICAgICAgICAgICBpZiAoU3RhcnRBY3Rpdml0eSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9U3RhcnRBY3Rpdml0eV0nKS52YWwoU3RhcnRBY3Rpdml0eSk7CiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVN0YXJ0QWN0aXZpdHlEaWFsb2ddJykudmFsKFRhcmdldE5TLlByb2Nlc3NEYXRhLkFjdGl2aXR5W1N0YXJ0QWN0aXZpdHldLkFjdGl2aXR5RGlhbG9nWyIxIl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoJyNQcm9jZXNzRm9ybScpLnN1Ym1pdCgpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXQgQ2FudmFzIFJlc2l6aW5nIEZ1bmN0aW9ucwogICAgICAgICQoJyNFeHRlbmRDYW52YXNIZWlnaHQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5FeHRlbmQoewogICAgICAgICAgICAgICAgV2lkdGg6IDAsCiAgICAgICAgICAgICAgICBIZWlnaHQ6IDE1MAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjRXh0ZW5kQ2FudmFzV2lkdGgnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkNhbnZhcy5FeHRlbmQoewogICAgICAgICAgICAgICAgV2lkdGg6IDE1MCwKICAgICAgICAgICAgICAgIEhlaWdodDogMAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjU2hvd0VudGl0eUlEcycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnVmlzaWJsZScpKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdWaXNpYmxlJykudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2hvdyBFbnRpdHlJRHMnKSk7CiAgICAgICAgICAgICAgICAkKCdlbS5FbnRpdHlJRCcpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnVmlzaWJsZScpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0hpZGUgRW50aXR5SURzJykpOwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuQ2FudmFzLlNob3dFbnRpdHlJRHMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXQgRGlhZ3JhbSBDYW52YXMKICAgICAgICBUYXJnZXROUy5DYW52YXMuSW5pdCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRBY3Rpdml0eUVkaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplIGFjdGl2aXR5IGVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0QWN0aXZpdHlFZGl0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIEluaXRMaXN0RmlsdGVyKEV2ZW50LCBVSSkgewogICAgICAgICAvLyBvbmx5IGRvIHNvbWV0aGluZywgaWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgcmlnaHQgbGlzdAogICAgICAgICAgICBpZiAoVUkuc2VuZGVyLmF0dHIoJ2lkJykgPT09ICdBc3NpZ25lZEFjdGl2aXR5RGlhbG9ncycpIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJBdmFpbGFibGVBY3Rpdml0eURpYWxvZ3MnKSwgJCgnI0F2YWlsYWJsZUFjdGl2aXR5RGlhbG9ncycpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBBbGxvY2F0aW9uIExpc3QKICAgICAgICBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LkluaXQoIiNBdmFpbGFibGVBY3Rpdml0eURpYWxvZ3MsICNBc3NpZ25lZEFjdGl2aXR5RGlhbG9ncyIsICIuQWxsb2NhdGlvbkxpc3QiLCBJbml0TGlzdEZpbHRlcik7CgogICAgICAgIC8vIEluaXRpYWxpemUgbGlzdCBmaWx0ZXIKICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjRmlsdGVyQXZhaWxhYmxlQWN0aXZpdHlEaWFsb2dzJyksICQoJyNBdmFpbGFibGVBY3Rpdml0eURpYWxvZ3MnKSk7CgogICAgICAgICQoJyNTdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0FjdGl2aXR5Rm9ybScpLnN1Ym1pdCgpOwogICAgICAgIH0pOwoKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI0FjdGl2aXR5Rm9ybScpLCBmdW5jdGlvbiAoRm9ybSkgewoKICAgICAgICAgICAgLy8gZ2V0IGFzc2lnbmVkIGFjdGl2aXR5IGRpYWxvZ3MKICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1BY3Rpdml0eURpYWxvZ3NdJykudmFsKENvcmUuSlNPTi5TdHJpbmdpZnkoQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5HZXRSZXN1bHQoJyNBc3NpZ25lZEFjdGl2aXR5RGlhbG9ncycsICdpZCcpKSk7CgogICAgICAgICAgICAvLyBub3QgbmVlZGVkIGZvciBub3JtYWwgc3VibWl0CiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CgogICAgICAgICAgICBGb3JtLnN1Ym1pdCgpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IGhhbmRsaW5nIG9mIGNsb3NpbmcgcG9wdXAgd2l0aCB0aGUgT1MgZnVuY3Rpb25hbGl0eSAoIlgiKQogICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIikub24oImJlZm9yZXVubG9hZC5QTVBvcHVwIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3aW5kb3cub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuSGFuZGxlUG9wdXBDbG9zZSgpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcuQ2xvc2VQb3B1cCcpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0QWN0aXZpdHlEaWFsb2dFZGl0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSBhY3Rpdml0eSBkaWFsb2cgZWRpdCBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRBY3Rpdml0eURpYWxvZ0VkaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIE1hbmRhdG9yeUZpZWxkcyA9IFsnUXVldWUnLCAnU3RhdGUnLCAnTG9jaycsICdQcmlvcml0eScsICdUeXBlJywgJ0N1c3RvbWVySUQnXSwKICAgICAgICAgICAgRmllbGRzV2l0aG91dERlZmF1bHRWYWx1ZSA9IFsnQ3VzdG9tZXJJRCcsICdBcnRpY2xlJ107CgogICAgICAgIGZ1bmN0aW9uIFVwZGF0ZUZpZWxkcyhFdmVudCwgVUkpIHsKICAgICAgICAgICAgdmFyIEZpZWxkbmFtZSwKICAgICAgICAgICAgICAgIERlZmF1bHRGaWVsZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgQXNzaWduZWRGaWVsZHMgbGlzdCwgcmVtb3ZlIEZpZWxkRGV0YWlscyBkYXRhCiAgICAgICAgICAgIGlmIChVSS5zZW5kZXIuYXR0cignaWQnKSA9PT0gJ0Fzc2lnbmVkRmllbGRzJykgewogICAgICAgICAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0ZpbHRlckF2YWlsYWJsZUZpZWxkcycpLCAkKCcjQXZhaWxhYmxlRmllbGRzJykpOwogICAgICAgICAgICAgICAgJChVSS5pdGVtKQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmVEYXRhKCdjb25maWcnKQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWNvbmZpZycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZm9yY2UgdGhlIHVzZXIgdG8gZW50ZXIgZGF0YSBpbiB0aGUgbW9kYWwgZGlhbG9nCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgRmllbGRuYW1lID0gJC50cmltKCQoVUkuaXRlbSkuZGF0YSgnaWQnKSk7CgogICAgICAgICAgICAgICAgLy8gaWYgRmllbGQgaXMgTWFuZGF0b3J5IHNldCBEaXNwbGF5IHRvICJTaG93IEFzIE1hbmRhdG9yeSIgYXMgZGVmYXVsdAogICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheShGaWVsZG5hbWUsIE1hbmRhdG9yeUZpZWxkcykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIERlZmF1bHRGaWVsZENvbmZpZy5EaXNwbGF5ID0gIjIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEZpZWxkQ29uZmlnLkRpc3BsYXkgPSAiMSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChVSS5pdGVtKQogICAgICAgICAgICAgICAgICAgIC5kYXRhKCdjb25maWcnLCBDb3JlLkpTT04uU3RyaW5naWZ5KERlZmF1bHRGaWVsZENvbmZpZykpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5GaWVsZERldGFpbHNPdmVybGF5JykudHJpZ2dlcignY2xpY2snKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBEaXJlY3RTdWJtaXRDaGVjaygpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRGlyZWN0U3VibWl0Q2hlY2soKSB7CiAgICAgICAgICAgIHZhciBTaG93bkZpZWxkcyA9IFtdOwogICAgICAgICAgICAkKCcjQXNzaWduZWRGaWVsZHMnKS5jaGlsZHJlbignbGknKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBDb25maWcgPSBDb3JlLkpTT04uUGFyc2UoJCh0aGlzKS5kYXRhKCdjb25maWcnKSk7CiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRpc3BsYXkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFNob3duRmllbGRzLnB1c2goJCh0aGlzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCAkKCcjRGlyZWN0U3VibWl0JykuaXMoJzpjaGVja2VkJykgJiYgU2hvd25GaWVsZHMubGVuZ3RoICkgewogICAgICAgICAgICAgICAgJCgnI0RpcmVjdFN1Ym1pdCB+IHAuV2FybmluZycpLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQoJyNEaXJlY3RTdWJtaXQgfiBwLldhcm5pbmcnKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgQWxsb2NhdGlvbiBMaXN0CiAgICAgICAgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5Jbml0KCIjQXZhaWxhYmxlRmllbGRzLCAjQXNzaWduZWRGaWVsZHMiLCAiLkFsbG9jYXRpb25MaXN0IiwgVXBkYXRlRmllbGRzKTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBsaXN0IGZpbHRlcgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJBdmFpbGFibGVGaWVsZHMnKSwgJCgnI0F2YWlsYWJsZUZpZWxkcycpKTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkaXJlY3Qgc3VibWl0IHRvb2x0aXAKICAgICAgICAkKCcjRGlyZWN0U3VibWl0Jykub2ZmKCdjaGFuZ2UnKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIERpcmVjdFN1Ym1pdENoZWNrKCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEV4ZWN1dGUgY2hlY2sgdG8gZ2V0IGNvcnJlY3Qgc3RhcnRpbmcgdmFsdWUKICAgICAgICBEaXJlY3RTdWJtaXRDaGVjaygpOwoKICAgICAgICAkKCcjU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNBY3Rpdml0eURpYWxvZ0Zvcm0nKS5zdWJtaXQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI0FjdGl2aXR5RGlhbG9nRm9ybScpLCBmdW5jdGlvbiAoRm9ybSkgewogICAgICAgICAgICB2YXIgRmllbGRDb25maWcgPSBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LkdldFJlc3VsdCgnI0Fzc2lnbmVkRmllbGRzJywgJ2lkJyksCiAgICAgICAgICAgICAgICBGaWVsZERldGFpbHMgPSB7fTsKCiAgICAgICAgICAgIC8vIGdldCBGaWVsZERldGFpbHMgYW5kIGFkZCB0aGVtIHRvIGNvbmZpZwogICAgICAgICAgICAkKCcjQXNzaWduZWRGaWVsZHMnKS5maW5kKCdsaScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIERldGFpbHMsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnVmFsdWUgPSAkKHRoaXMpLmRhdGEoJ2NvbmZpZycpLAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0gJCh0aGlzKS5kYXRhKCdpZCcpOwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ29uZmlnVmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgRGV0YWlscyA9IENvcmUuSlNPTi5QYXJzZShDb25maWdWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEZXRhaWxzID0gQ29uZmlnVmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgRmllbGREZXRhaWxzW0ZpZWxkXSA9IERldGFpbHM7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZ2V0IGFzc2lnbmVkIGFjdGl2aXR5IGRpYWxvZ3MKICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1GaWVsZHNdJykudmFsKENvcmUuSlNPTi5TdHJpbmdpZnkoRmllbGRDb25maWcpKTsKICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1GaWVsZERldGFpbHNdJykudmFsKENvcmUuSlNPTi5TdHJpbmdpZnkoRmllbGREZXRhaWxzKSk7CgogICAgICAgICAgICAvLyBub3QgbmVlZGVkIGZvciBub3JtYWwgc3VibWl0CiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CgogICAgICAgICAgICBGb3JtLnN1Ym1pdCgpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IEZpZWxkcyBtb2RhbCBvdmVybGF5CiAgICAgICAgJCgnLkZpZWxkRGV0YWlsc092ZXJsYXknKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRmllbGRDb25maWcgPSAkKHRoaXMpLmNsb3Nlc3QoJ2xpJykuZGF0YSgnY29uZmlnJyksCiAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgPSAkLnRyaW0oJCh0aGlzKS5jbG9zZXN0KCdsaScpLmRhdGEoJ2lkJykpLAogICAgICAgICAgICAgICAgRmllbGROYW1lVHJhbnNsYXRlZCA9ICQoJy5BbGxvY2F0aW9uTGlzdCcpLmZpbmQoJ2xpW2RhdGEtaWQ9IicgKyBGaWVsZG5hbWUgKyAnIl0nKS5kYXRhKCduYW1lLXRyYW5zbGF0ZWQnKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgRmllbGRDb25maWcgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBGaWVsZENvbmZpZyA9IENvcmUuSlNPTi5QYXJzZShGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE9wZW4gZGlhbG9nCiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKAogICAgICAgICAgICAgICAgJCgnI0RpYWxvZ3MgI0ZpZWxkRGV0YWlscycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0VkaXQgRmllbGQgRGV0YWlscycpICsgJzogJyArIEZpZWxkTmFtZVRyYW5zbGF0ZWQsCiAgICAgICAgICAgICAgICAnMjAwcHgnLAogICAgICAgICAgICAgICAgJ0NlbnRlcicsCiAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGaWVsZENvbmZpZ0VsZW1lbnQgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkRlc2NyaXB0aW9uU2hvcnQgPSAkKCcjRGVzY1Nob3J0JykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkRlc2NyaXB0aW9uTG9uZyA9ICQoJyNEZXNjTG9uZycpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkQ29uZmlnRWxlbWVudC5EZWZhdWx0VmFsdWUgPSAkKCcjRGVmYXVsdFZhbHVlJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkRpc3BsYXkgPSAkKCcjRGlzcGxheScpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmllbGRuYW1lID09PSAnQXJ0aWNsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBGaWVsZENvbmZpZ0VsZW1lbnQuQ29uZmlnID09PSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZENvbmZpZ0VsZW1lbnQuQ29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkNvbmZpZy5Db21tdW5pY2F0aW9uQ2hhbm5lbCA9ICQoJyNDb21tdW5pY2F0aW9uQ2hhbm5lbCcpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkNvbmZpZy5Jc1Zpc2libGVGb3JDdXN0b21lciA9ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNJc1Zpc2libGVGb3JDdXN0b21lcicpLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZENvbmZpZ0VsZW1lbnQuQ29uZmlnLklzVmlzaWJsZUZvckN1c3RvbWVyID0gJzEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IGVycm9yIGlmIG5vdCBjdXN0b21lciB2aXNpYmxlIGFydGljbGUgaXMgc2V0IGZvciBhbiBpbnRlcmZhY2UgZGlmZmVyZW50IHRoYW4gQWdlbnRJbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNJbnRlcmZhY2UnKS52YWwoKSAhPT0gJ0FnZW50SW50ZXJmYWNlJyAmJiAhJCgnI0lzVmlzaWJsZUZvckN1c3RvbWVyJykucHJvcCgnY2hlY2tlZCcpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3VzdG9tZXIgaW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgYXJ0aWNsZXMgbm90IHZpc2libGUgZm9yIGN1c3RvbWVycy4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdGltZSB1bml0cyB2YWx1ZSB0byB0aGUgZmllbGRjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRDb25maWdFbGVtZW50LkNvbmZpZy5UaW1lVW5pdHMgPSAkKCcjVGltZVVuaXRzJykudmFsKCk7Ci8vIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHN0YW5kYXJkIHRlbXBsYXRlIHZhbHVlIHRvIHRoZSBmaWVsZGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZENvbmZpZ0VsZW1lbnQuQ29uZmlnLlN0YW5kYXJkVGVtcGxhdGVzID0gJzAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI1N0YW5kYXJkVGVtcGxhdGVzJykucHJvcCgnY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkQ29uZmlnRWxlbWVudC5Db25maWcuU3RhbmRhcmRUZW1wbGF0ZXMgPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLy8gRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuY2xvc2VzdCgnbGknKS5kYXRhKCdjb25maWcnLCBDb3JlLkpTT04uU3RyaW5naWZ5KEZpZWxkQ29uZmlnRWxlbWVudCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RTdWJtaXRDaGVjaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NhbmNlbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAvLyBzb21lIGZpZWxkcyBtdXN0IGJlIG1hbmRhdG9yeSwgaWYgdGhleSBhcmUgcHJlc2VudC4KICAgICAgICAgICAgLy8gcmVtb3ZlIG9wdGlvbiBmcm9tIGRyb3Bkb3duIGZvciB0aGVzZSBmaWVsZHMKICAgICAgICAgICAgLy8gc2V0ICJTaG93IEFzIE1hbmRhdG9yeSIgYXMgZGVmYXVsdAogICAgICAgICAgICBpZiAoJC5pbkFycmF5KEZpZWxkbmFtZSwgTWFuZGF0b3J5RmllbGRzKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAkKCcjRGlzcGxheScpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ29wdGlvblt2YWx1ZT0xXScpLnJlbW92ZSgpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLnZhbCgnMicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzZXQgIlNob3cgRmllbGQiIGFzIGRlZmF1bHQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkKCcjRGlzcGxheScpLnZhbCgnMScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZHMgd2l0aG91dCBkZWZhdWx0IHZhbHVlIGNhbiBub3QgYmUgaGlkZGVuCiAgICAgICAgICAgIGlmICgkLmluQXJyYXkoRmllbGRuYW1lLCBGaWVsZHNXaXRob3V0RGVmYXVsdFZhbHVlKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAkKCcjRGlzcGxheScpLmZpbmQoJ29wdGlvblt2YWx1ZT0wXScpLnJlbW92ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGZpZWxkIGNvbmZpZyBhbHJlYWR5IHRoZSBkZWZhdWx0IHNldHRpbmdzIGZyb20gYWJvdmUgYXJlIG5vdyBvdmVyd3JpdHRlbgogICAgICAgICAgICBpZiAodHlwZW9mIEZpZWxkQ29uZmlnICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgJCgnI0Rlc2NTaG9ydCcpLnZhbChGaWVsZENvbmZpZy5EZXNjcmlwdGlvblNob3J0KTsKICAgICAgICAgICAgICAgICQoJyNEZXNjTG9uZycpLnZhbChGaWVsZENvbmZpZy5EZXNjcmlwdGlvbkxvbmcpOwogICAgICAgICAgICAgICAgJCgnI0RlZmF1bHRWYWx1ZScpLnZhbChGaWVsZENvbmZpZy5EZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgRmllbGRDb25maWcuRGlzcGxheSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjRGlzcGxheScpLnZhbChGaWVsZENvbmZpZy5EaXNwbGF5KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoRmllbGRuYW1lID09PSAnQXJ0aWNsZScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEZpZWxkQ29uZmlnLkNvbmZpZyA9PT0gJ3VuZGVmaW5lZCcpewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZENvbmZpZy5Db25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkQ29uZmlnLkNvbmZpZy5Db21tdW5pY2F0aW9uQ2hhbm5lbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ29tbXVuaWNhdGlvbkNoYW5uZWwnKS52YWwoRmllbGRDb25maWcuQ29uZmlnLkNvbW11bmljYXRpb25DaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkQ29uZmlnLkNvbmZpZy5Jc1Zpc2libGVGb3JDdXN0b21lciA9PT0gJzEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNJc1Zpc2libGVGb3JDdXN0b21lcicpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkQ29uZmlnLkNvbmZpZy5UaW1lVW5pdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1RpbWVVbml0cycpLnZhbChGaWVsZENvbmZpZy5Db25maWcuVGltZVVuaXRzKTsKICAgICAgICAgICAgICAgICAgICB9Ci8vIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgRmllbGRDb25maWcuQ29uZmlnLlN0YW5kYXJkVGVtcGxhdGVzID09PSAndW5kZWZpbmVkJykgfHwgRmllbGRDb25maWcuQ29uZmlnLlN0YW5kYXJkVGVtcGxhdGVzID09PSAnMScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVzJykucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KLy8gRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZWRyYXcgZGlzcGxheSBmaWVsZAogICAgICAgICAgICAkKCcjRGlzcGxheScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICAvLyBzb21lIGZpZWxkcyBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuCiAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGlucHV0IGZpZWxkCiAgICAgICAgICAgIGlmICgkLmluQXJyYXkoRmllbGRuYW1lLCBGaWVsZHNXaXRob3V0RGVmYXVsdFZhbHVlKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAkKCcjRGVmYXVsdFZhbHVlJykucHJvcCgncmVhZG9ubHknLCB0cnVlKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvbmx5IGFydGljbGUgc2hvdWxkIHNob3cgQ29tbXVuaWNhdGlvbiBjaGFubmVsIHNlbGVjdC4KICAgICAgICAgICAgaWYgKEZpZWxkbmFtZSA9PT0gJ0FydGljbGUnKSB7CgogICAgICAgICAgICAgICAgJCgnI0NvbW11bmljYXRpb25DaGFubmVsQ29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAgICAgJCgnI0NvbW11bmljYXRpb25DaGFubmVsQ29udGFpbmVyJykucHJldignbGFiZWwnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsKICAgICAgICAgICAgICAgICQoJyNDb21tdW5pY2F0aW9uQ2hhbm5lbENvbnRhaW5lciAuTW9kZXJuaXplJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKCiAgICAgICAgICAgICAgICAkKCcjSXNWaXNpYmxlRm9yQ3VzdG9tZXJDb250YWluZXInKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAkKCcjSXNWaXNpYmxlRm9yQ3VzdG9tZXJDb250YWluZXInKS5wcmV2KCdsYWJlbCcpLmNzcygnZGlzcGxheScsICdibG9jaycpOwoKICAgICAgICAgICAgICAgICQoJyNUaW1lVW5pdHNDb250YWluZXInKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAkKCcjVGltZVVuaXRzQ29udGFpbmVyJykucHJldignbGFiZWwnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsKICAgICAgICAgICAgICAgICQoJyNUaW1lVW5pdHNDb250YWluZXIgLk1vZGVybml6ZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7Ci8vIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCgogICAgICAgICAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyJykucHJldignbGFiZWwnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsKLy8gRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICQoJyNDb21tdW5pY2F0aW9uQ2hhbm5lbENvbnRhaW5lcicpLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICQoJyNDb21tdW5pY2F0aW9uQ2hhbm5lbENvbnRhaW5lcicpLnByZXYoJ2xhYmVsJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKCiAgICAgICAgICAgICAgICAkKCcjSXNWaXNpYmxlRm9yQ3VzdG9tZXJDb250YWluZXInKS5hZGRDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAkKCcjSXNWaXNpYmxlRm9yQ3VzdG9tZXJDb250YWluZXInKS5wcmV2KCdsYWJlbCcpLmNzcygnZGlzcGxheScsICdub25lJyk7CgogICAgICAgICAgICAgICAgJCgnI1RpbWVVbml0c0NvbnRhaW5lcicpLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICQoJyNUaW1lVW5pdHNDb250YWluZXInKS5wcmV2KCdsYWJlbCcpLmNzcygnZGlzcGxheScsICdub25lJyk7Ci8vIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCgogICAgICAgICAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyJykuYWRkQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVzQ29udGFpbmVyJykucHJldignbGFiZWwnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwovLyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdCBoYW5kbGluZyBvZiBjbG9zaW5nIHBvcHVwIHdpdGggdGhlIE9TIGZ1bmN0aW9uYWxpdHkgKCJYIikKICAgICAgICAkKHdpbmRvdykub2ZmKCJiZWZvcmV1bmxvYWQuUE1Qb3B1cCIpLm9uKCJiZWZvcmV1bmxvYWQuUE1Qb3B1cCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgd2luZG93Lm9wZW5lci5Db3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LkhhbmRsZVBvcHVwQ2xvc2UoKTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkNsb3NlUG9wdXAnKS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRyYW5zaXRpb25FZGl0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSB0cmFuc2l0aW9uIGVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0VHJhbnNpdGlvbkVkaXQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIEluaXQgYWRkaXRpb24gb2YgbmV3IGNvbmRpdGlvbnMKICAgICAgICAkKCcjQ29uZGl0aW9uQWRkJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IHBhcmVudCBpbmRleAogICAgICAgICAgICB2YXIgQ3VycmVudFBhcmVudEluZGV4ID0gcGFyc2VJbnQoJCh0aGlzKS5wcmV2KCcuV2lkZ2V0U2ltcGxlJykuZmlyc3QoKS5hdHRyKCdpZCcpLnJlcGxhY2UoL0NvbmRpdGlvblxbL2csICcnKS5yZXBsYWNlKC9cXS9nLCAnJyksIDEwKSwKICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugd2UgYWRkIGEgd2hvbGUgbmV3IGNvbmRpdGlvbiwgdGhlIGZpZWxkaW5kZXggbXVzdCBiZSAxCiAgICAgICAgICAgICAgICBMYXN0S25vd25GaWVsZEluZGV4ID0gMSwKICAgICAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IGluZGV4CiAgICAgICAgICAgICAgICBDb25kaXRpb25IVE1MID0gJCgnI0NvbmRpdGlvbkNvbnRhaW5lcicpLmh0bWwoKS5yZXBsYWNlKC9fSU5ERVhfL2csIEN1cnJlbnRQYXJlbnRJbmRleCArIDEpLnJlcGxhY2UoL19GSUVMRElOREVYXy9nLCBMYXN0S25vd25GaWVsZEluZGV4KTsKCiAgICAgICAgICAgICQoJC5wYXJzZUhUTUwoQ29uZGl0aW9uSFRNTCkpLmluc2VydEJlZm9yZSgkKCcjQ29uZGl0aW9uQWRkJykpOwogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IHJlbW92YWwgb2YgY29uZGl0aW9ucwogICAgICAgICQoJyNQcmVzZW50Q29uZGl0aW9uc0NvbnRhaW5lcicpLmRlbGVnYXRlKCcuUGFyZW50V2lkZ2V0ID4gLkhlYWRlciAuUmVtb3ZlQnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKCcjUHJlc2VudENvbmRpdGlvbnNDb250YWluZXInKS5maW5kKCcuQ29uZGl0aW9uRmllbGQnKS5sZW5ndGggPiAxKSB7CgogICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgiU29ycnksIHRoZSBvbmx5IGV4aXN0aW5nIGNvbmRpdGlvbiBjYW4ndCBiZSByZW1vdmVkLiIpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IGFkZGl0aW9uIG9mIG5ldyBmaWVsZHMgd2l0aGluIGNvbmRpdGlvbnMKICAgICAgICAkKCcjUHJlc2VudENvbmRpdGlvbnNDb250YWluZXInKS5vZmYoJ2NsaWNrLkFkZEZpZWxkJykub24oJ2NsaWNrLkFkZEZpZWxkJywgJy5GaWVsZFdpZGdldCAuQWRkQnV0dG9uJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IHBhcmVudCBpbmRleAogICAgICAgICAgICB2YXIgQ3VycmVudFBhcmVudEluZGV4ID0gJCh0aGlzKS5jbG9zZXN0KCcuUGFyZW50V2lkZ2V0JykuYXR0cignaWQnKS5yZXBsYWNlKC9Db25kaXRpb25cWy9nLCAnJykucmVwbGFjZSgvXF0vZywgJycpLAogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbmRleCBmb3IgdGhlIG5ld2x5IHRvIGJlIGFkZGVkIGVsZW1lbnQKICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgd2Ugc2VhcmNoIHRoZSBwcmVjZWRpbmcgZmllbGRzZXQgYW5kIHRoZSBmaXJzdAogICAgICAgICAgICAgICAgLy8gbGFiZWwgaW4gaXQgdG8gZ2V0IGl0cyAiZm9yIi1hdHRyaWJ1dGUgd2hpY2ggY29udGFpbnMgdGhlIGluZGV4CiAgICAgICAgICAgICAgICBMYXN0S25vd25GaWVsZEluZGV4ID0gcGFyc2VJbnQoJCh0aGlzKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuZmluZCgnLkNvbnRlbnQnKS5maW5kKCdsYWJlbCcpLmZpcnN0KCkuYXR0cignZm9yJykucmVwbGFjZSgvQ29uZGl0aW9uRmllbGROYW1lXFtcZCtcXVxbLywgJycpLnJlcGxhY2UoL1xdLywgJycpLCAxMCksCiAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGZpZWxkCiAgICAgICAgICAgICAgICBDb25kaXRpb25GaWVsZEhUTUwgPSAkKCcjQ29uZGl0aW9uRmllbGRDb250YWluZXInKS5odG1sKCkucmVwbGFjZSgvX0lOREVYXy9nLCBDdXJyZW50UGFyZW50SW5kZXgpLnJlcGxhY2UoL19GSUVMRElOREVYXy9nLCBMYXN0S25vd25GaWVsZEluZGV4ICsgMSk7CgogICAgICAgICAgICAkKCQucGFyc2VIVE1MKENvbmRpdGlvbkZpZWxkSFRNTCkpLmluc2VydEFmdGVyKCQodGhpcykuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpLmZpbmQoJ2ZpZWxkc2V0JykubGFzdCgpKTsKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0KCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdCByZW1vdmFsIG9mIGZpZWxkcyB3aXRoaW4gY29uZGl0aW9ucwogICAgICAgICQoJyNQcmVzZW50Q29uZGl0aW9uc0NvbnRhaW5lcicpLm9mZignY2xpY2suUmVtb3ZlRmllbGQnKS5vbignY2xpY2suUmVtb3ZlRmllbGQnLCAnLkZpZWxkV2lkZ2V0IC5SZW1vdmVCdXR0b24nLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdCgnLkNvbnRlbnQnKS5maW5kKCdmaWVsZHNldCcpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkuY2xvc2VzdCgnZmllbGRzZXQnKS5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCJTb3JyeSwgdGhlIG9ubHkgZXhpc3RpbmcgZmllbGQgY2FuJ3QgYmUgcmVtb3ZlZC4iKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnI1N1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjVHJhbnNpdGlvbkZvcm0nKS5zdWJtaXQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI1RyYW5zaXRpb25Gb3JtJyksIGZ1bmN0aW9uIChGb3JtKSB7CiAgICAgICAgICAgIHZhciBDb25kaXRpb25Db25maWcgPSBUYXJnZXROUy5HZXRDb25kaXRpb25Db25maWcoJCgnI1ByZXNlbnRDb25kaXRpb25zQ29udGFpbmVyJykuZmluZCgnLkNvbmRpdGlvbkZpZWxkJykpOwogICAgICAgICAgICAkKCdpbnB1dFtuYW1lPUNvbmRpdGlvbkNvbmZpZ10nKS52YWwoQ29yZS5KU09OLlN0cmluZ2lmeShDb25kaXRpb25Db25maWcpKTsKCiAgICAgICAgICAgIC8vIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBzdWJtaXQKICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKTsKCiAgICAgICAgICAgIEZvcm0uc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXQgaGFuZGxpbmcgb2YgY2xvc2luZyBwb3B1cCB3aXRoIHRoZSBPUyBmdW5jdGlvbmFsaXR5ICgiWCIpCiAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKS5vbigiYmVmb3JldW5sb2FkLlBNUG9wdXAiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIuQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudC5IYW5kbGVQb3B1cENsb3NlKCk7CiAgICAgICAgfSk7CgogICAgICAgICQoJy5DbG9zZVBvcHVwJykub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKHdpbmRvdykub2ZmKCJiZWZvcmV1bmxvYWQuUE1Qb3B1cCIpOwogICAgICAgIH0pOwoKICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXQoKTsKCiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRyYW5zaXRpb25BY3Rpb25FZGl0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSB0cmFuc2l0aW9uIGFjdGlvbiBlZGl0IHNjcmVlbi4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFRyYW5zaXRpb25BY3Rpb25FZGl0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIEluaXQgYWRkaXRpb24gb2YgbmV3IGNvbmZpZyBwYXJhbWV0ZXJzCiAgICAgICAgJCgnI0NvbmZpZ0FkZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IGZvciB0aGUgbmV3bHkgdG8gYmUgYWRkZWQgZWxlbWVudAogICAgICAgICAgICAvLyB0aGVyZWZvcmUsIHdlIHNlYXJjaCB0aGUgcHJlY2VkaW5nIGZpZWxkc2V0IGFuZCB0aGUgZmlyc3QKICAgICAgICAgICAgLy8gbGFiZWwgaW4gaXQgdG8gZ2V0IGl0cyAiZm9yIi1hdHRyaWJ1dGUgd2hpY2ggY29udGFpbnMgdGhlIGluZGV4CiAgICAgICAgICAgIHZhciAkUHJldmlvdXNGaWVsZCA9ICQodGhpcykuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpLmZpbmQoJy5Db250ZW50IGZpZWxkc2V0JykubGFzdCgpLAogICAgICAgICAgICAgICAgTGFzdEtub3duRmllbGRJbmRleCwKICAgICAgICAgICAgICAgIENvbmZpZ1BhcmFtSFRNTDsKCiAgICAgICAgICAgIGlmICgkUHJldmlvdXNGaWVsZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIExhc3RLbm93bkZpZWxkSW5kZXggPSBwYXJzZUludCgkUHJldmlvdXNGaWVsZC5maW5kKCdsYWJlbCcpLmZpcnN0KCkuYXR0cignZm9yJykucmVwbGFjZSgvQ29uZmlnS2V5XFsvLCAnJykucmVwbGFjZSgvXF0vLCAnJyksIDEwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIExhc3RLbm93bkZpZWxkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBnZXQgY3VycmVudCBpbmRleAogICAgICAgICAgICBDb25maWdQYXJhbUhUTUwgPSAkKCcjQ29uZmlnUGFyYW1Db250YWluZXInKS5odG1sKCkucmVwbGFjZSgvX0lOREVYXy9nLCBMYXN0S25vd25GaWVsZEluZGV4ICsgMSk7CgogICAgICAgICAgICAkKCQucGFyc2VIVE1MKENvbmZpZ1BhcmFtSFRNTCkpLmluc2VydEFmdGVyKCRQcmV2aW91c0ZpZWxkKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IHJlbW92YWwgb2YgZmllbGRzCiAgICAgICAgJCgnI0NvbmZpZ1BhcmFtcycpLmRlbGVnYXRlKCcuUmVtb3ZlQnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5Db250ZW50JykuZmluZCgnZmllbGRzZXQnKS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2ZpZWxkc2V0JykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgiU29ycnksIHRoZSBvbmx5IGV4aXN0aW5nIHBhcmFtZXRlciBjYW4ndCBiZSByZW1vdmVkLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgICQoJyNTdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI1RyYW5zaXRpb25Gb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNUcmFuc2l0aW9uRm9ybScpLCBmdW5jdGlvbiAoRm9ybSkgewogICAgICAgICAgICAvLyBub3QgbmVlZGVkIGZvciBub3JtYWwgc3VibWl0CiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CgogICAgICAgICAgICBGb3JtLnN1Ym1pdCgpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0IGhhbmRsaW5nIG9mIGNsb3NpbmcgcG9wdXAgd2l0aCB0aGUgT1MgZnVuY3Rpb25hbGl0eSAoIlgiKQogICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIikub24oImJlZm9yZXVubG9hZC5QTVBvcHVwIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3aW5kb3cub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuSGFuZGxlUG9wdXBDbG9zZSgpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcuQ2xvc2VQb3B1cCcpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0UGF0aEVkaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplIHBhdGggZWRpdCBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRQYXRoRWRpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ3VycmVudFByb2Nlc3NFbnRpdHlJRCA9IENvcmUuQ29uZmlnLkdldCgnUHJvY2Vzc0VudGl0eUlEJyksCiAgICAgICAgICAgIEN1cnJlbnRUcmFuc2l0aW9uRW50aXR5SUQgPSBDb3JlLkNvbmZpZy5HZXQoJ1RyYW5zaXRpb25FbnRpdHlJRCcpLAogICAgICAgICAgICBTdGFydEFjdGl2aXR5SUQgPSBDb3JlLkNvbmZpZy5HZXQoJ1N0YXJ0QWN0aXZpdHlJRCcpLAogICAgICAgICAgICBBY3Rpdml0eUluZm8gPSB3aW5kb3cub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuUHJvY2Vzc0RhdGEuQWN0aXZpdHksCiAgICAgICAgICAgIFBhdGhJbmZvID0gd2luZG93Lm9wZW5lci5Db3JlLkFnZW50LkFkbWluLlByb2Nlc3NNYW5hZ2VtZW50LlByb2Nlc3NEYXRhLlByb2Nlc3NbQ3VycmVudFByb2Nlc3NFbnRpdHlJRF0uUGF0aCwKICAgICAgICAgICAgU3RhcnRBY3Rpdml0eUVudGl0eUlEID0gJycsIEVuZEFjdGl2aXR5RW50aXR5SUQgPSAnJywKICAgICAgICAgICAgQXNzaWduZWRUcmFuc2l0aW9uQWN0aW9ucyA9IFtdOwoKICAgICAgICAvLyBJbml0aWFsaXplIEFsbG9jYXRpb24gTGlzdAogICAgICAgIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuSW5pdCgiI0F2YWlsYWJsZVRyYW5zaXRpb25BY3Rpb25zLCAjQXNzaWduZWRUcmFuc2l0aW9uQWN0aW9ucyIsICIuQWxsb2NhdGlvbkxpc3QiKTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBsaXN0IGZpbHRlcgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJBdmFpbGFibGVUcmFuc2l0aW9uQWN0aW9ucycpLCAkKCcjQXZhaWxhYmxlVHJhbnNpdGlvbkFjdGlvbnMnKSk7CgogICAgICAgIC8vIHN0b3JlIHByb2Nlc3MgZGF0YSB0byBoaWRkZW4gZmllbGQgZm9yIGxhdGVyIG1lcmdpbmcKICAgICAgICAkKCcjUHJvY2Vzc0RhdGEnKS52YWwoQ29yZS5KU09OLlN0cmluZ2lmeSh3aW5kb3cub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuUHJvY2Vzc0RhdGEuUHJvY2VzcykpOwoKICAgICAgICAvLyBzZXQgY3VycmVudCBzdGFydCBhbmQgZW5kIGFjdGl2aXR5IChqdXN0IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcywgbm90IGNoYW5nZWFibGUpCiAgICAgICAgJC5lYWNoKFBhdGhJbmZvLCBmdW5jdGlvbihBY3Rpdml0eSwgVHJhbnNpdGlvbikgewogICAgICAgICAgICBpZiAoQWN0aXZpdHkgPT09IFN0YXJ0QWN0aXZpdHlJRCAmJiB0eXBlb2YgVHJhbnNpdGlvbltDdXJyZW50VHJhbnNpdGlvbkVudGl0eUlEXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICQoJyNTdGFydEFjdGl2aXR5JykuYXR0cigndGl0bGUnLCBBY3Rpdml0eUluZm9bQWN0aXZpdHldLk5hbWUpLnRleHQoQWN0aXZpdHlJbmZvW0FjdGl2aXR5XS5OYW1lKTsKICAgICAgICAgICAgICAgICQoJyNFbmRBY3Rpdml0eScpLmF0dHIoJ3RpdGxlJywgQWN0aXZpdHlJbmZvW1RyYW5zaXRpb25bQ3VycmVudFRyYW5zaXRpb25FbnRpdHlJRF0uQWN0aXZpdHlFbnRpdHlJRF0uTmFtZSkudGV4dChBY3Rpdml0eUluZm9bVHJhbnNpdGlvbltDdXJyZW50VHJhbnNpdGlvbkVudGl0eUlEXS5BY3Rpdml0eUVudGl0eUlEXS5OYW1lKTsKCiAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RW50aXR5SUQgPSBBY3Rpdml0eTsKICAgICAgICAgICAgICAgIEVuZEFjdGl2aXR5RW50aXR5SUQgPSBUcmFuc2l0aW9uW0N1cnJlbnRUcmFuc2l0aW9uRW50aXR5SURdLkFjdGl2aXR5RW50aXR5SUQ7CiAgICAgICAgICAgICAgICBBc3NpZ25lZFRyYW5zaXRpb25BY3Rpb25zID0gVHJhbnNpdGlvbltDdXJyZW50VHJhbnNpdGlvbkVudGl0eUlEXS5UcmFuc2l0aW9uQWN0aW9uOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBTZXQgY2hvc2VuIFN0YXJ0YWN0aXZpdHksIEVuZGFjdGl2aXR5IGFuZCBUcmFuc2l0aW9uCiAgICAgICAgJCgnI1RyYW5zaXRpb24nKS52YWwoQ3VycmVudFRyYW5zaXRpb25FbnRpdHlJRCk7CiAgICAgICAgJCgnI0VkaXRQYXRoIGEnKS5kYXRhKCdlbnRpdHknLCBDdXJyZW50VHJhbnNpdGlvbkVudGl0eUlEKTsKCiAgICAgICAgaWYgKEFzc2lnbmVkVHJhbnNpdGlvbkFjdGlvbnMgJiYgQXNzaWduZWRUcmFuc2l0aW9uQWN0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gRGlzcGxheSBhc3NpZ25lZCBUcmFuc2l0aW9uIEFjdGlvbnMKICAgICAgICAgICAgJC5lYWNoKEFzc2lnbmVkVHJhbnNpdGlvbkFjdGlvbnMsIGZ1bmN0aW9uKEluZGV4LCBUcmFuc2l0aW9uQWN0aW9uRW50aXR5SUQpIHsKICAgICAgICAgICAgICAgICQoJyNBdmFpbGFibGVUcmFuc2l0aW9uQWN0aW9ucycpLmZpbmQoJyMnICsgVHJhbnNpdGlvbkFjdGlvbkVudGl0eUlEKS5yZW1vdmUoKS5hcHBlbmRUbygkKCcjQXNzaWduZWRUcmFuc2l0aW9uQWN0aW9ucycpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBpZiB0cmFuc2l0aW9uIHNlbGVjdCBpcyB1cGRhdGVkLCBhbHNvIHVwZGF0ZSB0cmFuc2l0aW9uIGVkaXQgbGluawogICAgICAgICQoJyNUcmFuc2l0aW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAkKCcjRWRpdFBhdGggYScpLmRhdGEoJ2VudGl0eScsICQodGhpcykudmFsKCkpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcjU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNQYXRoRm9ybScpLnN1Ym1pdCgpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGluaXQgc3VibWl0CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNQYXRoRm9ybScpLCBmdW5jdGlvbiAoRm9ybSkgewoKICAgICAgICAgICAgdmFyIE5ld1RyYW5zaXRpb25FbnRpdHlJRCA9ICQoJyNUcmFuc2l0aW9uJykudmFsKCksCiAgICAgICAgICAgICAgICBOZXdUcmFuc2l0aW9uQWN0aW9ucyA9IFtdLAogICAgICAgICAgICAgICAgVHJhbnNpdGlvbkluZm87CgogICAgICAgICAgICAkKCcjQXNzaWduZWRUcmFuc2l0aW9uQWN0aW9ucyBsaScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBOZXdUcmFuc2l0aW9uQWN0aW9ucy5wdXNoKCQodGhpcykuYXR0cignaWQnKSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY29sbGVjdGlvbiB0cmFuc2l0aW9uIGluZm8gZm9yIGxhdGVyIG1lcmdpbmcKICAgICAgICAgICAgVHJhbnNpdGlvbkluZm8gPSB7CiAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RW50aXR5SUQ6IFN0YXJ0QWN0aXZpdHlFbnRpdHlJRCwKICAgICAgICAgICAgICAgIE5ld1RyYW5zaXRpb25FbnRpdHlJRDogTmV3VHJhbnNpdGlvbkVudGl0eUlELAogICAgICAgICAgICAgICAgTmV3VHJhbnNpdGlvbkFjdGlvbnM6IE5ld1RyYW5zaXRpb25BY3Rpb25zLAogICAgICAgICAgICAgICAgTmV3VHJhbnNpdGlvbkFjdGl2aXR5SUQ6IEVuZEFjdGl2aXR5RW50aXR5SUQKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICQoJyNUcmFuc2l0aW9uSW5mbycpLnZhbChDb3JlLkpTT04uU3RyaW5naWZ5KFRyYW5zaXRpb25JbmZvKSk7CgogICAgICAgICAgICAvLyBub3QgbmVlZGVkIGZvciBub3JtYWwgc3VibWl0CiAgICAgICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIik7CgogICAgICAgICAgICBGb3JtLnN1Ym1pdCgpOwogICAgICAgIH0pOwoKICAgICAgICBJbml0UHJvY2Vzc1BvcHVwcygpOwoKICAgICAgICAvLyBJbml0IGhhbmRsaW5nIG9mIGNsb3NpbmcgcG9wdXAgd2l0aCB0aGUgT1MgZnVuY3Rpb25hbGl0eSAoIlgiKQogICAgICAgICQod2luZG93KS5vZmYoImJlZm9yZXVubG9hZC5QTVBvcHVwIikub24oImJlZm9yZXVubG9hZC5QTVBvcHVwIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3aW5kb3cub3BlbmVyLkNvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQuSGFuZGxlUG9wdXBDbG9zZSgpOwogICAgICAgIH0pOwoKICAgICAgICAkKCcuQ2xvc2VQb3B1cCcpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigiYmVmb3JldW5sb2FkLlBNUG9wdXAiKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93T3ZlcmxheQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE9wZW5zIG92ZXJsYXkuCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dPdmVybGF5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICQoJzxkaXYgaWQ9Ik92ZXJsYXkiIHRhYmluZGV4PSItMSI+JykuYXBwZW5kVG8oJ2JvZHknKTsKICAgICAgICAkKCdib2R5JykuY3NzKHsKICAgICAgICAgICAgJ292ZXJmbG93JzogJ2hpZGRlbicKICAgICAgICB9KTsKICAgICAgICAkKCcjT3ZlcmxheScpLmhlaWdodCgkKGRvY3VtZW50KS5oZWlnaHQoKSkuY3NzKCd0b3AnLCAwKTsKCiAgICAgICAgLy8gSWYgdGhlIHVuZGVybHlpbmcgcGFnZSBpcyBwZXJoYXBzIHRvIHNtYWxsLCB3ZSBleHRlbmQgdGhlIHBhZ2UgdG8gd2luZG93IGhlaWdodCBmb3IgdGhlIGRpYWxvZwogICAgICAgICQoJ2JvZHknKS5jc3MoJ21pbi1oZWlnaHQnLCAkKHdpbmRvdykuaGVpZ2h0KCkpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEhpZGVPdmVybGF5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5Qcm9jZXNzTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2xvc2VzIG92ZXJsYXkgYW5kIHJlc3RvcmVzIG5vcm1hbCB2aWV3LgogICAgICovCiAgICBUYXJnZXROUy5IaWRlT3ZlcmxheSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICQoJ2JvZHknKS5jc3MoewogICAgICAgICAgICAnb3ZlcmZsb3cnOiAndmlzaWJsZScsCiAgICAgICAgICAgICdtaW4taGVpZ2h0JzogMAogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldENvbmRpdGlvbkNvbmZpZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge09iamVjdH0gQ29uZGl0aW9ucyBhbmQgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDb25kaXRpb25zIC0gQ29uZGl0aW9ucyBlbGVtZW50IGluIERPTS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBHZXQgYWxsIGNvbmRpdGlvbnMgYW5kIGNvcnJlc3BvbmRpbmcgZmllbGRzLgogICAgICovCiAgICBUYXJnZXROUy5HZXRDb25kaXRpb25Db25maWcgPSBmdW5jdGlvbiAoJENvbmRpdGlvbnMpIHsKCiAgICAgICAgdmFyIENvbmRpdGlvbnMgPSB7fSwKICAgICAgICAgICAgQ29uZGl0aW9uS2V5OwoKICAgICAgICBpZiAoISRDb25kaXRpb25zLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQoKICAgICAgICAkQ29uZGl0aW9ucy5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gZ2V0IGNvbmRpdGlvbiBrZXkKICAgICAgICAgICAgQ29uZGl0aW9uS2V5ID0gJCh0aGlzKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuYXR0cignaWQnKS5yZXBsYWNlKC8oQ29uZGl0aW9uXFt8XF0pL2csICcnKTsKCiAgICAgICAgICAgIC8vIHVzZSBjb25kaXRpb24ga2V5IGFzIGtleSBmb3Igb3VyIGxpc3QKICAgICAgICAgICAgQ29uZGl0aW9uc1tDb25kaXRpb25LZXldID0gewogICAgICAgICAgICAgICAgVHlwZTogJCh0aGlzKS5maW5kKCcuRmllbGQgPiBzZWxlY3QnKS52YWwoKSwKICAgICAgICAgICAgICAgIEZpZWxkczoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGdldCBhbGwgZmllbGRzIG9mIHRoZSBjdXJyZW50IGNvbmRpdGlvbgogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5GaWVsZFdpZGdldCBmaWVsZHNldCcpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBDb25kaXRpb25zW0NvbmRpdGlvbktleV0uRmllbGRzWyQodGhpcykuZmluZCgnaW5wdXQnKS5maXJzdCgpLnZhbCgpXSA9IHsKICAgICAgICAgICAgICAgICAgICBUeXBlOiAkKHRoaXMpLmZpbmQoJ3NlbGVjdCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIE1hdGNoOiAkKHRoaXMpLmZpbmQoJ2lucHV0JykubGFzdCgpLnZhbCgpCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBDb25kaXRpb25zOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFVwZGF0ZUNvbmZpZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgZmFsc2UsIGlmIENvbmZpZyBpcyBub3QgZGVmaW5lZC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDb25maWcKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBVcGRhdGUgZ2xvYWJsIHByb2Nlc3MgY29uZmlnIG9iamVjdCBhZnRlciBjb25maWcgY2hhbmdlIGUuZy4gaW4gcG9wdXAgd2luZG93cy4KICAgICAqLwogICAgVGFyZ2V0TlMuVXBkYXRlQ29uZmlnID0gZnVuY3Rpb24gKENvbmZpZykgewogICAgICAgIGlmICh0eXBlb2YgQ29uZmlnID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBJRSAoMTEpIGhhcyBzb21lIHBlcm1pc3Npb24gcHJvYmxlbXMgd2l0aCBvYmplY3RzIGZyb20gb3RoZXIgd2luZG93cwogICAgICAgIC8vIFRoZXJlZm9yZSB3ZSAiY29weSIgdGhlIG9iamVjdCBpZiB3ZSBhcmUgaW4gSUUKICAgICAgICBpZiAoJC5icm93c2VyLnRyaWRlbnQpIHsKICAgICAgICAgICAgQ29uZmlnID0gQ29yZS5KU09OLlBhcnNlKENvcmUuSlNPTi5TdHJpbmdpZnkoQ29uZmlnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgY29uZmlnIGZyb20gZS5nLiBwb3B1cCB3aW5kb3dzCgogICAgICAgIC8vIFVwZGF0ZSBQcm9jZXNzCiAgICAgICAgaWYgKHR5cGVvZiBDb25maWcuUHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuUHJvY2VzcyA9IENvbmZpZy5Qcm9jZXNzOwogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIEFjdGl2aXRpZXMKICAgICAgICBpZiAodHlwZW9mIENvbmZpZy5BY3Rpdml0eSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5lYWNoKENvbmZpZy5BY3Rpdml0eSwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlByb2Nlc3NEYXRhLkFjdGl2aXR5W0tleV0gPSBWYWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgQWN0aXZpdHkgRGlhbG9ncwogICAgICAgIGlmICh0eXBlb2YgQ29uZmlnLkFjdGl2aXR5RGlhbG9nICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAkLmVhY2goQ29uZmlnLkFjdGl2aXR5RGlhbG9nLCBmdW5jdGlvbiAoS2V5LCBWYWx1ZSkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuUHJvY2Vzc0RhdGEuQWN0aXZpdHlEaWFsb2dbS2V5XSA9IFZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBUcmFuc2l0aW9ucwogICAgICAgIGlmICh0eXBlb2YgQ29uZmlnLlRyYW5zaXRpb24gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICQuZWFjaChDb25maWcuVHJhbnNpdGlvbiwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlByb2Nlc3NEYXRhLlRyYW5zaXRpb25bS2V5XSA9IFZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBUcmFuc2l0aW9uIEFjdGlvbnMKICAgICAgICBpZiAodHlwZW9mIENvbmZpZy5UcmFuc2l0aW9uQWN0aW9uICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAkLmVhY2goQ29uZmlnLlRyYW5zaXRpb25BY3Rpb24sIGZ1bmN0aW9uIChLZXksIFZhbHVlKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5Qcm9jZXNzRGF0YS5UcmFuc2l0aW9uQWN0aW9uW0tleV0gPSBWYWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQWRtaW4uUHJvY2Vzc01hbmFnZW1lbnQgfHwge30pKTsKCi8qZXNsaW50LWVuYWJsZSBvdG9iby9uby13aW5kb3cqLwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.TicketProcess.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gNmVmZGM3YmYyYTMzMjUyNzdjZDc5YTYwZjBmMjQwN2Y4YWQ1OWU4NyAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5UaWNrZXRQcm9jZXNzLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5UaWNrZXRQcm9jZXNzCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50CiAqIEBhdXRob3IKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgVGlja2V0UHJvY2Vzcy4KICovCkNvcmUuQWdlbnQuVGlja2V0UHJvY2VzcyA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LlRpY2tldFByb2Nlc3MKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgdmFyIFByb2Nlc3NJRCA9IENvcmUuQ29uZmlnLkdldCgnUHJvY2Vzc0lEJyk7CgogICAgICAgIGlmICh0eXBlb2YgUHJvY2Vzc0lEICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKFByb2Nlc3NJRCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIENvcmUuQ29uZmlnLkdldCgnUGFyZW50UmVsb2FkJykgIT09ICd1bmRlZmluZWQnICYmIHBhcnNlSW50KENvcmUuQ29uZmlnLkdldCgnUGFyZW50UmVsb2FkJyksIDEwKSA9PT0gMSl7CiAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuRXhlY3V0ZUluUGFyZW50V2luZG93KGZ1bmN0aW9uKFdpbmRvd09iamVjdCkgewogICAgICAgICAgICAgICAgaWYgKFdpbmRvd09iamVjdC5Db3JlLlVJLlBvcHVwLkdldFdpbmRvd01vZGUoKSAhPT0gJ0lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICBXaW5kb3dPYmplY3QuQ29yZS5VSS5Qb3B1cC5GaXJlUG9wdXBFdmVudCgnUmVsb2FkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJCgnI1Byb2Nlc3NFbnRpdHlJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRUaWNrZXRQcm9jZXNzJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnLAogICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEOiAkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBMaW5rVGlja2V0SUQ6ICQoJyNMaW5rVGlja2V0SUQnKS52YWwoKSwKICAgICAgICAgICAgICAgIEFydGljbGVJRDogJCgnI0FydGljbGVJRCcpLnZhbCgpLAogICAgICAgICAgICAgICAgRm9ybUlEOiAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dDpoaWRkZW5bbmFtZT1Gb3JtSURdJykudmFsKCksCiAgICAgICAgICAgICAgICBJc0FqYXhSZXF1ZXN0OiAxLAogICAgICAgICAgICAgICAgSXNNYWluV2luZG93OiAxCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoJCgnI0lzUHJvY2Vzc0Vucm9sbCcpLnZhbCgpICE9PSAndW5kZWZpbmVkJyAmJiAkKCcjSXNQcm9jZXNzRW5yb2xsJykudmFsKCkgPT09ICcxJykgewogICAgICAgICAgICAgICAgJC5leHRlbmQoRGF0YSwgewogICAgICAgICAgICAgICAgICAgIElzTWFpbldpbmRvdzogMCwKICAgICAgICAgICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGw6IDEsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6ICQoJyNUaWNrZXRJRCcpLnZhbCgpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIGlmICgkKCcjUHJvY2Vzc0VudGl0eUlEJykudmFsKCkpIHsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGFjdGl2aXR5IGRpYWxvZwogICAgICAgICAgICAgICAgJCgnI0FjdGl2aXR5RGlhbG9nQ29udGVudCcpLmVtcHR5KCk7CgogICAgICAgICAgICAgICAgLy8gZmFkZSBvdXQgdGhlIGVtcHR5IGNvbnRhaW5lciBzbyBpdCB3aWxsIGZhZGUgaW4gYWdhaW4gb24gcHJvY2Vzc2VzIGNoYW5nZQogICAgICAgICAgICAgICAgLy8gaXMgbm90IHJlY29tbWVuZGVkIHRvIGVtcHR5IGFmdGVyIGZhZGUgb3V0IGF0IHRoaXMgcG9pbnQgc2luY2UgdGhlIHRyYW5zaXRpb24gb2ZmZWN0CiAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBsb29rIHNvIG5pY2UKICAgICAgICAgICAgICAgICQoJyNBY3Rpdml0eURpYWxvZ0NvbnRlbnQnKS5mYWRlT3V0KCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgLy8gc2hvdyBsb2FkZXIgaWNvbgogICAgICAgICAgICAgICAgJCgnI0FKQVhMb2FkZXInKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CgogICAgICAgICAgICAgICAgLy8gZ2V0IG5ldyBBY3Rpdml0eURpYWxvZyBjb250ZW50CiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJEVsZW1lbnRUb1VwZGF0ZSA9ICQoJyNBY3Rpdml0eURpYWxvZ0NvbnRlbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVNjcmlwdFN0cmluZyA9ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2U7CgogICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBvdXQgb2YgdGhlIE9UT0JPIEFwcCBzY29wZSwgdGhhdCdzIHdoeSBhbiBleGNlcHRpb24gd291bGQgbm90IGJlIGNhdWdodC4gVGhlcmVmb3Igd2UgaGFuZGxlIHRoZSBlcnJvciBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uSGFuZGxlRmluYWxFcnJvcihuZXcgQ29yZS5FeGNlcHRpb24uQXBwbGljYXRpb25FcnJvcigiTm8gY29udGVudCByZWNlaXZlZC4iLCAnQ29tbXVuaWNhdGlvbkVycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQUpBWExvYWRlcicpLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJEVsZW1lbnRUb1VwZGF0ZSAmJiBpc0pRdWVyeU9iamVjdCgkRWxlbWVudFRvVXBkYXRlKSAmJiAkRWxlbWVudFRvVXBkYXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudFRvVXBkYXRlLmdldCgwKS5pbm5lckhUTUwgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnRUb1VwZGF0ZS5maW5kKCdzY3JpcHQnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVNjcmlwdFN0cmluZyArPSAkKHRoaXMpLmh0bWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudFRvVXBkYXRlLmZhZGVJbigpOwogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCRFbGVtZW50VG9VcGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyplc2xpbnQtZGlzYWJsZSBuby1ldmFsICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKEphdmFTY3JpcHRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyplc2xpbnQtZW5hYmxlIG5vLWV2YWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgaGVyZSAoY29kZSBuZWVkZWQgIHRvIG5vdCBoYXZlIGFuIGVtcHR5IGJsb2NrIGhlcmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLm5vb3AoRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBzZXJ2ZXIgZXJyb3JzIChSZXNwb25zZSA9IDxkaXYgY2xhc3M9IlNlcnZlckVycm9yIiBkYXRhLW1lc3NhZ2U9Ik1lc3NhZ2UiPjwvZGl2PikKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3QgZWxlbWVudCBoYXMgY2xhc3MgJ1NlcnZlckVycm9yJwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnRUb1VwZGF0ZS5jaGlsZHJlbigpLmZpcnN0KCkuaGFzQ2xhc3MoJ1NlcnZlckVycm9yJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9ICRFbGVtZW50VG9VcGRhdGUuY2hpbGRyZW4oKS5maXJzdCgpLmRhdGEoJ21lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2xhc3MgU2VydmVyRXJyb3IgdG8gdGhlIHByb2Nlc3Mgc2VsZWN0IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNQcm9jZXNzRW50aXR5SUQnKS5hZGRDbGFzcygnU2VydmVyRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHRoZSBwcm9jY2VzcyBzZWxlY3QgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1Byb2Nlc3NFbnRpdHlJRFNlcnZlckVycm9yJykuY2hpbGRyZW4oKS5maXJzdCgpLnRleHQoRXJyb3JNZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkluaXQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGZvciB0cmVlIHNlbGVjdGlvbiBkaWFsb2cKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5UcmVlU2VsZWN0aW9uLkluaXRUcmVlU2VsZWN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGFqYXggZG5kIHVwbG9hZAogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkluaXRBamF4RG5EVXBsb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGhlbHAgdHJpZ2dlcnMgaW50byBmaWVsZCByb3dzIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICAkKCcuUm93ID4gLkZpZWxkQ2VsbCA+IC5GaWVsZEhlbHBDb250YWluZXInKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS5uZXh0KCdsYWJlbCcpLmZpbmQoJy5NYXJrZXInKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByZXBlbmRUbygkKHRoaXMpLm5leHQoJ2xhYmVsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5pbnNlcnRBZnRlcigkKHRoaXMpLm5leHQoJ2xhYmVsJykuZmluZCgnLk1hcmtlcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGx5IGRpc3BsYXkgZHluYW1pYyBmaWVsZHMgd2l0aCBUcmVlTW9kZSA9IDEgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuVHJlZVNlbGVjdGlvbi5Jbml0RHluYW1pY0ZpZWxkVHJlZVZpZXdSZXN0b3JlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFnYWluIGEgcmVzcG9uc2l2ZSBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29yZS5BcHAuUmVzcG9uc2l2ZS5Jc1NtYWxsZXJPckVxdWFsKENvcmUuQXBwLlJlc3BvbnNpdmUuR2V0U2NyZWVuU2l6ZSgpLCAnU2NyZWVuTCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5BcHAuUmVzcG9uc2l2ZS5TbWFsbGVyT3JFcXVhbFNjcmVlbkwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dldCBjdXN0b21lciBhdXRvIGNvbXBsZXRlIGV2ZW50IGlmIGZpZWxkIGlzIGFjY2VzaWJsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnRUb1VwZGF0ZS5maW5kKCcjQ3VzdG9tZXJBdXRvQ29tcGxldGUnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGUuSW5pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQUpBWExvYWRlcicpLmFkZENsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0FKQVhEaWFsb2cnKS52YWwoJzEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVGlja2V0UHJvY2Vzcy5Jbml0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXRNdWx0aVZhbHVlRHluYW1pY0ZpZWxkcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgUXVpY2tEYXRlQnV0dG9ucy5Jbml0KCk7CgovLyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGV2ZW50IHRvIFN0YW5kYXJkVGVtcGxhdGUgZmllbGQuCiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uQ29uZmlybVRlbXBsYXRlT3ZlcndyaXRlKCdSaWNoVGV4dCcsICQodGhpcyksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjUmljaFRleHQnKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKLy8gRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaXNoIGV2ZW50IHdoZW4gZmlyc3QgYWN0aXZpdHkgZGlhbG9nIGhhcyBsb2FkZWQsIHNvIG90aGVyIGNvZGUgY2FuIGtub3cgdG8gZXhlY3V0ZSBhZ2Fpbi4KICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnVGlja2V0UHJvY2Vzcy5Jbml0LkZpcnN0QWN0aXZpdHlEaWFsb2cuTG9hZCcsIFskRWxlbWVudFRvVXBkYXRlXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFIHRoaXMgY29kZSBhaW1zIHRvIHJlc2VtYmxlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzdWJtaXQgZXZlbnQgaW4gQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0KCksIGN1cnJlbnRseSBsb2NhdGVkIGluIHZhci9odHRwcy9odGRvY3MvanMvQ29yZS5VSS5JbnB1dEZpZWxkcy5qcyBMaW5lIDMyMCwgd2hpY2ggZG9lcyBub3QgdGFrZSBlZmZlY3QgaW4gQWdlbnRUaWNrZXRQcm9jZXNzIGZvciBhbiB5ZXQgdW5rbm93biByZWFzb24KICAgICAgICAgICAgICAgICAgICAgICAgJCgnYnV0dG9uW3R5cGU9c3VibWl0XScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuRHluYW1pY0ZpZWxkVGV4dCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBvdXQgb2YgdGhlIE9UT0JPIEFwcCBzY29wZSwgdGhhdCdzIHdoeSBhbiBleGNlcHRpb24gd291bGQgbm90IGJlIGNhdWdodC4gVGhlcmVmb3Igd2UgaGFuZGxlIHRoZSBlcnJvciBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uSGFuZGxlRmluYWxFcnJvcihuZXcgQ29yZS5FeGNlcHRpb24uQXBwbGljYXRpb25FcnJvcigiTm8gc3VjaCBlbGVtZW50IGlkOiAiICsgJEVsZW1lbnRUb1VwZGF0ZS5hdHRyKCdpZCcpICsgIiBpbiBwYWdlISIsICdDb21tdW5pY2F0aW9uRXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNBSkFYTG9hZGVyJykuYWRkQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sICdodG1sJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkKCcjQWN0aXZpdHlEaWFsb2dDb250ZW50JykuZmFkZU91dCg0MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNBY3Rpdml0eURpYWxvZ0NvbnRlbnQnKS5lbXB0eSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKLy8gUm90aGVyIE9TUyAvIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICAgICAvLyBCaW5kIGV2ZW50IHRvIFN0YW5kYXJkVGVtcGxhdGUgZmllbGQuCiAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkNvbmZpcm1UZW1wbGF0ZU92ZXJ3cml0ZSgnUmljaFRleHQnLCAkKHRoaXMpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjUmljaFRleHQnKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKLy8gRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgIC8vIElmIHByb2Nlc3MgaXMgcHJlLXNlbGVjdGVkIHRyaWdnZXIgY2hhbmdlIGV2ZW50IG9uIFByb2Nlc3NFbnRpdHlJRCBmaWVsZC4KICAgICAgICBpZiAoJCgnI1Byb2Nlc3NFbnRpdHlJRCcpLnZhbCgpICE9PSAiIikgewogICAgICAgICAgICAkKCcjUHJvY2Vzc0VudGl0eUlEJykudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuVGlja2V0UHJvY2VzcyB8fCB7fSkpOwo=</File>
        <File Location="doc/en/ProcessTicketTemplates.pdf" Permission="644" Encode="Base64">JVBERi0xLjUKJeTw7fgKNCAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA4MjgvSGVpZ2h0IDI1My9Db2xvclNwYWNlL0RldmljZUdyYXkvQml0c1BlckNvbXBvbmVudAo4L0RlY29kZVBhcm1zPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9ycyAxL0NvbHVtbnMgODI4L1ByZWRpY3RvciAyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aAoyNDQzPj4Kc3RyZWFtCnja7d2LddpYAgZgUkGYCqKtIGwFZisIqWCYCsJUsGwFw1QwuIJlKli5gpUrGKhgTQVZJ465AoORhB7X6PvOmXMSGzsaSf/VfWswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF5LktEwSR7/kC3WNf3K8TSp/LOr5cN1nufZ5PxnsodsnTV5EE9XJh2s19mDW/+yUzke34S/bcf1XLflz5f89P34Gq/qMP1Y8JPb1WrV1FHkr8wmS9NMBKpdzcnk0+FlS+q4bef/vOzn70dXeLbTmxIf3i4WjZQfk38ffGGTLlNJKP/wPvZw+HVRw69+eH/hL/jH9V3P0X/LfX47XzRwFNmRZ99muVyLQwnT+YejX//XvIb201+X/oY6jiK2ouo/ZX/iblL/o+fr8S/fzqXn0uTEkp1fF7JTX+vzfHakp/BlnJ+uev+yrOEfWH+48Bf8PZOdRsKz+nTyW7/P9bud7SGYfzn9zc2ojhP4okVatrYyHshOI+F57Si205V0vH72lq88FDaTeq7V7LeLojN5kJ06y7J8bf2PV77559Sj5xWnuo/vBoOHbL2q69wlk+GJ7+z+/bv0VL3iKsccQnZuT7csRsPkoGS7ndZ8HMl08PhUTz40WnZeZX1t+bK+u02ztMUh5q919kq8yey83gGfjKd7rdGmuutHyXj8saH27lVG58XQdpND2LJTJTvfPrr42E7b78jg+OD3mZwcK2rSgzHLu2X7pYzsFHiS5GfONDtOnEynTdcSrzE6d/O0g6OQnSJhyIWn8Xv5cLBPeM5FZzNNOzkM2Sn0IMnNfnvXeFV+NnsvPMXbOp3dubJTKDtJtrudPzffIk2WN8Jz2t4swPtpZ32RslOsARNqba2cqNk8/+jR23aq9Tm4nXU3BiY7xbIT5l23M8titMq3eq5wInv19uAfMdTXZKfEfbmbFLhJ2q/U17OO6yrkas9dP5Blp2B2Qm/Bu3aOcLjKNXqucUphNfk1ix3XZWWnYHbC7Kl3bR1jfpb1FS4DqdYQ/C2eZmBfsxOuQbzZyVfbtqO14DyeknWosXU+5aKv2QlRiDc7e+H5cyI5e31s3VdjZSfi7OwNoOtr21sCHUH3iewUvCcXXzrITr5DVnfB3mMngqJEdsr2s22HbR5nrr/Agyf32IlhroXslB3fabf8zzWOPXjCYyeKAS/ZKZadUOS13L2Tq7X1/cGTK0eiuFtlp9gdGW7hzy2vTgwzH/s+JzRcg00ykJ03k50wnP1Ty7WF3K4kP/V7Zk4oReIYKZadQtkJN3D7rY5wy/R7PnWoNkcyvU92Sq59a//+DVWVfo+PhqkgkWziIDtFshM+3UWRF/bi73WlLXTXR7JP7dee1gfCXqkFLkSur6uLIiYMy/a60vY1rp6C3LDF39b9rDyfH+ocLsJodic17bDurs89baHJGcu+W8/lb+/2AXuuAZztstnb9bibDp5dAXeVbxEr3dyJZpzrqULQv62PfywtO1NmJJNpfmOJjob2w3h6jxs84SS8i+aYksd6QJr28GJMHgvxg1esTcf7VenR/hZ6tW/lXlBob/V4asGuq9PcpHgfRSc18PKqko2zPi8f/Rpbc4cX1df4ouO+2TsHlp/HfHWOR6fDVc/qK+U3mKCTq3PcZr7s6tB2w4KyIztvMTuPd+60o0fPbl5Duwvv4rw679yq8Xl4f+4TXb0DtJPNEuIS+hpl5+31FXzXzayYMC7Y2xtH8RG3vV3CYwqPCkuk2RmPs2zdw6sxHI8O3+w6PXin8bF36HbRVJWdKOtsT9O1ejhu8L0g287OPEaGo/F4f8S0i+mg6mwxFh/Pc3R7F57nOkCB7QeG01n++dPBCjSV/Vx2Ilm9kxt169kahOH/fvxhkxQq+PPvkmq/1qaPOsbxnb6ufQuXolihMVqG+dTtD1AaG41xTo411wWLsfy+6q2XfObkxDinT3aKBiG3r3rryzfNBY2x/JCdwg+R0NnVdqsjLLru8Rzi+Na+yU7xCthu6XPbe4Na+7ZXdH1eyc5by064ei2fLGuu9x6+sVRcZad4dsLyzZar3LtJqn3e6yOchU0iO28tO62/J/6HsJdcr5cbx7u3oeyUuXqtNldDlS2Wmn4nQqsvkh4T2SmRnY6mxoTNsHs9/X43FSSWcXzZqZSdVmcw7bLT83dd7x77kcwfk51K2Wm1r3j3z/b7HSK7eVSxFCHtZOfbuph0cVH/6nQ6yi78FW81O8/vCux1L9v3e2Dx7UREs4dtK9l5auxetL/Z0wucNuO6ntaVpuV2tRRgtPrWwXc/fuh5dgbD6fAhjWUJQivZee4gueDiP28lUNvASqXshA0NWm60D0fjQbYaEJU2srN76V/lOZShe7KuZmKl7OjwouXshP02KzZ2c1OY62poVMrO7n/EduK0nZ1q4UmysGizy+yE8f2+v62dtrIThuMrhSe/6qy2jTaqZCeM7/e8s5jWsrO3WW3p2y6/2rm+o6yQnTAVtG+bO9BZdnJ9u+XDk2vr1NnOqJCd0FPQ+4EWWsvOXq2tXGPhaTis7hpblezkNg31Bhhay06+yfJYbE+KVnnyr5iu9+VRpbOz7Phl1/Q0O3tdZY8337xYwb33iul6W+gls9NMowvZKdtseXz0zM7fscl8f2v1Wju3SmVn/0g8dmg1O4fhGdzNX79nh7PZ++aiUyI7yWRy0+CBIDulwzO4W5yeoTWaHb7Oo+Y7NmTn9rXGV5KMDl9o1fNFNHSQnf02w1PtZ7lKj5b00xefnNUbnQIvSDzBbGbaz85guLp58bVtmmb5l+CMRqPJy5fe1P969qrZER26yM7BIGkuGtngIRsMR0ffFfWtdjep/YatmB3RoaPsHPY6F9PEoVXLTjRLFokpOy2NlQ/nX0r+xP20iYWCVbJTdFiKfthtttjafnHjxccI7tewQ2thtzMPHY60QNqc3jidF624bReLpu7X7GOpj29X87W7hb061NNMs82k1R0UiqWnweQcGW56xSZd2SyAl2aTWjdvKlpzm/58rp2zWDV6UMP56OZceB8LlPU6yzxxiOuJN5l8Oh2c5coNC6fjMx4fKfvvszQVHDjf8BiOH/97+nM6yB5SpwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDL/B9n0iy4KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlUkdCL1NNYXNrIDQgMCBSL1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDgyOC9IZWlnaHQgMjUzL0JpdHNQZXJDb21wb25lbnQKOC9EZWNvZGVQYXJtczw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvcnMgMy9Db2x1bW5zIDgyOC9QcmVkaWN0b3IgMTU+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoCjE4NDg+PgpzdHJlYW0KeNrt3Gtu2zoQgNG48JK6/xVkT6qBAEZao7FEkeLM8Bz0133gOpRIfqJyfdu27QMAgNh+GQIAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQBAtAEAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgAg2gAAEG0AAIg2AADRBgCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAABEGwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AADRBgCAaAMAQLQBABRzNwSF3W6/f/4Htu1zzR88rKpXBNPHzW8Zp8P9sG2bUVh5wa034fMWmyUYc8cUsJ7zAydtqy+1j3+30jzPXmzAcxYvniANq5mhK8/vtKWf1TLFSg0lbzxz4eTWYADrcdJmhTUmQOhJ7dzIAPLFSVvWRyjjAHgew64h2jDxUvI0CboNO4how2RDeoJuM4yINubNsWKJoHjAYmg1cwog2lBsum34JxedwDWrmW5LmQS+XHeFXJMC4y6EsWWRBWfQrd6w0Jl0HTcIg5mLr/yoOSHNQyCF52Ll4Kd5kff96qKNlMVm7gGpK2TP6qcz+oav8UzE77QVKTa/DgVU6g+aN4KGMXTMKdq4qNjkGqDbODmGuk20MXbOyDXAakmvDcKoijY8jAJY33Kkm24TbfSfKlY0AEZsGbpNtNFtknglCugMdJtoI0GxGS4AdLBow3wDoPI+snMrcdgm2mifGIoNgIDbE6LNlFBsAAxhTxFtmF0AlNpZHLaJNkwGAJwIINpMKgDotMU4XxBt7JoGig0AEG0A5H6y5TyHbaKNDhPAMRsAQboN0YYpBEACDttEGwC0JIIn276Mp2jD8woAINo88QB4suWqrcd1EW0AcKwMPNmyrLshyPWsA1ByaXKQA285aQv3EImdDFa7mfevjSadBU20ARYyuHoKPFrt64/JmIJzh+m8HhUH7Lo0/6xWLhZVl6DmW92ODqINJDWEvtWvyTVzELweBcBTE8ZZtAGAkgDRlotf+ACsbBZPEG0AVE5D6QaiLQrn/4C16226GXBEGwAkoNsQbQDQ6OIXBbqNZfmeNmjZKrzOZoX7fP+t/voF1KM/pDmIaAN2PdnbM3Crv3Zbl/+iboP/8XoUGjcV72hwq5/3CK/nH5cARFvu5RJXDRa5mY/WmwmIaAOAmXnk1A1E2/yHSIMA0HHBdNiGaAMAD7og2gBAt8Xj5FK0AcCobtMZiDY84gAAog0ASMXbatHmjgfAyjmftz2iDXMGABBtAMB4zjtFGwCc5R0Fog0PKwBAFHdDIOmgr9djj6Q3dpkfBOxNNThpc/fD2ND5yPn2qswPYlHFMIo2Os+Nx18xYShZbBlzR5xhb7I3BeT1qGca4ECxPf6uyYu9iSmctAEhYsiHBBBtgCRSbG4bEG0AJTZgZQCINoDoebT/I/mNH3cLiDYgvf1BE2onVmyL3HUg2gASd5uDnMhcHfjOV34Ak7fkWSclR4PAiY5ig7mctAGdHY2bKXuzYgueazsvkOvCUpy0AUO67VAVXXnk1tCIyiBsTINoA7i62y5It7YgUGxhW82lQbQBTOu2QenWfH4jC86P4bi7y0VBtAFM7rbviXBmbz7ZGbIAEG2AbmsMr7ch1etASLEFv6kMAqINYNQW2yWnrnlJpwkUGwTkKz8Ae+1fH1ITuItAtAF23E8fDz0NbbweBSaEkf8VERcIjnLSBjaSOUMXZ/Rcx8iD4IANnpy0AZNDYeKpmxoQkZDIbds2owDvp8pLWNhURo+wJih/FVwXEG2AaNAEQDVejwKBPKOqb71pNUC0AYytt7aGU2mAaAOY33AAC/KVHwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AABEGwCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAAAQbQAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAACiDQBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAADRBgAg2gAAEG0AAKINAIBI/gCkqoRBCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMyNT4+CnN0cmVhbQp42nVSS0/DMAy+8yv8B5rZTpzEUpUD4iG4TfSGOKzbugsT2om/j9O0PASosSLH9vewChcgQPsIEttB2J8tu7c4/XtfwKlGD++WdepCFDhDiHlNXuEJtn9MkWZnFF5nxog1IQaO6tiGU3JRYhWweTgj3LwZyPUAmzsCDi7lRDBMQJlcRoWOyDthhuHw3CPuIpJqYe6RKiyhxRFpRzVKEOsZLQ++1SS33rnnUGuFGJeHGAzMAGVEnHxtKLL2UnkZHmdRlByThFlUCubcQ8fJZZVVk36OyViooZfO9wsqtZxzrRz3czBPdo/tnnAm67w6n6vlwA6D/oSvbs0B+WOjsi2YDLWGzOaLaiwkNls66ptBnBAFv9yQUxGubmzDLGRmBI2XFrrMpct9254tZJVtzFMwubvvL2agVdq2bodff8P26gMWL40oCmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzND4+CnN0cmVhbQp42lMoVDBUMABCQwVzIyAyUEjOBfLcgTidIB3IBQCH6gxHCmVuZHN0cmVhbQplbmRvYmoKMjggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA3NjA+PgpzdHJlYW0KeNrtmTtv2zAQx/d+Cn4Bsffg6wBDQ4E2QLe03ooOjiV1aYZ06dfvUZIlmbbhIHGWRkhiUnRyD+p++h8d82TQgH6hiaTfYPaPenWnP79Oxk9b8/ELGnSWXSCz7QwLWRJvqhhtBDHb5scGgBAgEUAMAA8tAOM8f8D65/ar+bw1YAmSvnJ0+upSMN/uziz+mfyKlUAhuwVTYRTLlAaP2O7rCpFDdp7qKukStoA71BEARQAd6xh0rRnmmiuGMAVznOLsygXXB3Pq8CZpaBCWnD9YbepKgtvkbQJsXC2bIYldU/sxp+DqimJ+Q6QmHFclAT74MUtdp+m3x7HPXDdpsPiMtMmmk/DaFybNC8taPeJ0PwnZ0pQ3EHXjbfQ5RnCpTkOOqLlAx3Mu+3a4e/mu+nQ2laVDidZFPnKozurKiYwzD7DO3tfsWtH09Y9SlGlb/t0tOCBv0YeShMwqJYUedqF2IwH5WaYVf7jkWBNMj7rrIIANKRUeL27ViscKxUUojmv2TbDgaBGxxKJVLJizImgzgdzOitcrYQRyrtf5HpCsEFnvm14zaRTTrB0c6oo3gya6zNBeLR+4moX16pag03hDGe8K0HuA4LhCXwtB2Rh6sUAyW68kakMEe98/63OLe9CAvqe7UKtlT0dMpe0ObtnVRbCS3BT2sq8LYWxse71qhoZVwtUdV5PMvrC9IrbObgd0KMsLO3wLUUtkhaWko5lEjfBwMNXl0NMdNyMoi5NQcYYdtA12kjvDni4O47FweRQMQwP5HFXzyXrmIuAVuf+s4I+q8dUFXwgYg7PJx0Ota4BRcpWC9mfQDbWb61o7sOcIFzOWNju6oXAxBpX16aTXLYWLoUBT+ZvOYxfiX/pIbAVKHytN6+yF3acyW9TrAoXbqRVTsjHEEon+kwnJvVzTzOrSH7Xw6kerZ7FY+lmxWGevweKoZs9gMY5PxrIkb/5mqQrB28jOPKqdNF/+Nt/N/Tk18jY49RVitCkd/iPguPR1/+Efo2OZtgplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTEwPj4Kc3RyZWFtCnjaUyhUMFQwAEJDBXMjIDJQSM4F8tyBOB0nXaigZ2xpYapQDuTpmpmZ6pkbmyjkKpiYWSC4OQrBCoEKTiEK+m6GCpZ6lmZGZgohaWAN5uZ6FhYWCiEp0TYGhibGIGwXG+Kl4BoCtyGQCwBXxB/VCmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0Mzk+PgpzdHJlYW0KeNqNU8uu1DAM3fMV/oEGOw+nlqoskACJ3RXdIRad6Qwb7uKu+H2cxJnpMALRNmrs2uccOzW8AQHqTZC9PgjnV7U+6/rx9H4DJ8IBfqk1iYuc4BUiz8P4CV/hBT6s8P4TgThhz7BeIfrgYsgw+exmSbDu3xZET4gJ9YqIGyOeLohBfZuU7+uXBkHRhci+YuhWfFSI4ITIIGaPmLmmtZSP66NC9s5zHhLNetB4IAg5OWKGiZAdD41z13SirncT1Zzueuu+izDN4VD2dINM2eU5GqbmUdBFlzKFOSxIomjXoB5ESnNRVzNDLh6XEeiXRksixZN69ahaAinURnWVmAw+3sG8Xyxmr98KGSQSx8ZM6dTptr2kEUvG2ANNHl5rcJGnoEa/9yANJsp9P6RSvkXuJf4vfe1M4F6oIt179a8WGI+CDzWjlSQHYiurklprR/+1jta+s72rvcd2uvpHETlJ9gPXMmtIS7W+VEWVC5euxueqJjYl1QpLRxzn3zzPCk3ZMfuhdyKtNTfR6vP+OmbgMK1B5mSzwMnlEG/DYObfJpZ1MLKOG2cd2Xm2ii/nPzle3v0GUM7xLwplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjcyPj4Kc3RyZWFtCnjabZG/boQwDMb3PoVfgNR2EieRUIZKbaVup7JVHeCAW3rDTX39OiTQk1qBZb74D3w/4AYEqBdBYL0RzldVrxqXIz8N8PhCkEwSFhhWPeRoXLIwzB894ihIKWXmHklXEKHGgjRSieyc9kyqna01H2vv1jOXWibGdiBOl+lCPyGutjRk3x/7mMfccUjlrSm7VvBTpjqfO9u3OaqaY6ks5y2YV81TzSvmz+ENnge4gbEpevguzpwJGOAKTuIuvuAdTn+w3E91It4E69rcIevkPwA7CcHEGCtCWubtW6xPRpQrNrKsJuxSDRUodzAUeAXRfOVOfAHNMXfxF9gGPKUKv66oz+VHiewEdk+nhx/HfHa/CmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0ODE+PgpzdHJlYW0KeNq1lL9uGzEMxvc+BV/AKilS/4BAQ4E2QLe0txUd7LtzlmZIl75+P+nukthOgAyObVmmTiY//kSRHkmI8RZKHh+m8QHWLcb9xfxIrpSo9A/WrjiLgR7IYt6MP/ST7ujLQJ+/CRVXoo80HMm8OtNEO59cLoGG6dcNsxfmwHgZ8z4yH2Zmxdq+1N/D9+5CzKlF33yIOC4KF+qKyOriMNedMH5MczVM2fe/fh1OlUbvfEyb1NU60foikDK7nIXgOLq4BZIqLcBs1YduP+tNVpFYuWnK1wwy84jUQnheS7bOa6bwuEp9guwEuBjiFN8ahX7cvrL49/4V0UhS0vK8C5Z5Yu+PmMeLMFcIh0OIIZ3FZMsVFKSUKh7mUVmiscjMMmKgtvCMJeRzST2AvigYpONxDJtjHKuU5bg9dxvVw30d5H1Ld+xjSfmwzJNembDX4hJfEJ4+hHDEPjuLiWvSy7yRRSk1kpupqaPpsPfyLsAxuWLrZfRmV4alnFywdA5r/hBYwZUG6yRmu2WiGKa9Jn2rExQsUoUdF2ytHvcTamW7w4C3VKrGutNmT3VnjeyIXrPRbu6k034PadXgUpE3SaNXaclh7VURm9WemtVqvtVZ0czaroTGmvMG+0LV3af/o3NIqQplbmRzdHJlYW0KZW5kb2JqCjQzIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjg3Pj4Kc3RyZWFtCnjabVHLTsQwDLzzFf6BBtt5S1UOSIDEbUVviEO7bffCHvbE7+PUTVkJ1FiWM55JPYYbEKB8BJHlIJyvUr1KXI78NMDjC0E2OXCAYZVLTsZlC8P80SOOASnnwtwjiQQRSixII9UozknPJLWzivmkvVvPXLFCjPtFcCImgn5CXG1tKL4/9JjH0nHM9dVc3A74qZDyS2f7nUdac6rIct6CeZU8aV6xfA5v8DzADYzNycN3ncyZiBGu4EJqxRe8w+mPLfesLgRvonU77yiV+Y+BXYjRpJTUQlrW7V8sZpOswGosywx20XmqJ3deiN/qAy1zHad0wW8+C2V2pQKb/b+M4Bqj7oqaTkKavO6m7bCtYcv6bEeq2BxrHpwefgBejYJNCmVuZHN0cmVhbQplbmRvYmoKNDYgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMTAzNS9IZWlnaHQgNzIxL0NvbG9yU3BhY2UvRGV2aWNlR3JheS9CaXRzUGVyQ29tcG9uZW50CjgvRGVjb2RlUGFybXM8PC9CaXRzUGVyQ29tcG9uZW50IDgvQ29sb3JzIDEvQ29sdW1ucyAxMDM1L1ByZWRpY3RvciAyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aAoxNjU3Pj4Kc3RyZWFtCnja7dQhAQAAAMIw+peGFLgtwsUbgFQCwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAK5AAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACiQArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAgkAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsQALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArkACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKJACsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACCQArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKxAAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArAA4G7qIzk4KZW5k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</File>
    </Filelist>
</otrs_package>