<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ProcessTicketTemplates</Name>
    <Version>11.0.4</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-04-27 16:15:21" 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>6d094b577f46c2b3ebd915ea7c9dec2e66dd4a14</BuildCommitID>
    <BuildDate>2026-04-27 16:15:25</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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiYTJiOGQ0YzNkMWQyYzc1YWMzZTQ3NWFmMWFkYjVmYWZkNTBmMzc4IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRQcm9jZXNzLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByb2Nlc3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwp1c2UgTGlzdDo6VXRpbCBxdyhub25lKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBNYWlsOjpBZGRyZXNzICgpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MgJFNlbGYsICRUeXBlOwoKICAgICMgZ2xvYmFsIGNvbmZpZyBoYXNoIGZvciBpZCBkaXNzb2x1dGlvbgogICAgJFNlbGYtPntOYW1lVG9JRH0gPSB7CiAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBTdGF0ZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFByaW9yaXR5ICAgICAgID0+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+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdiBjbGFzcz0iU2VydmVyRXJyb3IiIGRhdGEtbWVzc2FnZT0iJyAuICRFcnJvck1lc3NhZ2UgLiAnIj48L2Rpdj4nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgaW52YWxpZCBwcm9jZXNzIGlzIGRldGVjdGVkIG9uIGEgQWN0aXZpdHlEaWxvZyBwb3AtdXAgc2NyZWVuIHNob3cgYW4gZXJyb3IgbWVzc2FnZQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJwogICAgICAgICYmICEkRm9sbG93dXBQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgISRTZWxmLT57SXNNYWluV2luZG93fQogICAgICAgICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Byb2Nlc3MgJXMgaXMgaW52YWxpZCEnLCAkUHJvY2Vzc0VudGl0eUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycwogICAgIyBjb2xsZWN0cyBhIG1peHR1cmUgb2YgcHJlc2VudCB2YWx1ZXMgYm90dG9tIHRvIHRvcDoKICAgICMgU3lzQ29uZmlnIERlZmF1bHRWYWx1ZXMsIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMsIFRpY2tldFZhbHVlcywgU3VibWl0dGVkVmFsdWVzCiAgICAjIGluY2x1ZGluZyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBQcm9jZXNzRW50aXR5SUQKICAgICMgYWxzbyBzZXRzICRTZWxmLT57RHluYW1pY0ZpZWxkfSB3aGljaCBjb250YWlucyBhbGwgREZzIG9mIHRoZSBjdXJyZW50IERpYWxvZwogICAgIyBpcyB1c2VkIGZvcjoKICAgICMgLSBQYXJhbWV0ZXIgY2hlY2tpbmcgYmVmb3JlIHN0b3JpbmcKICAgICMgLSB3aWxsIGJlIHVzZWQgZm9yIEFDTCBjaGVja2luZyBsYXRlciBvbgogICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPl9HZXRQYXJhbSgKICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlQWN0aXZpdHlEaWFsb2cnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9TdG9yZUFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NOYW1lICAgICA9PiAkUHJvY2Vzc0xpc3QtPnskUHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEaXNwbGF5QWN0aXZpdHlEaWFsb2cnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgICMgaW5pdGlhbCByZW5kZXJpbmcgLSBwcmUtZmlsbCBkeW5hbWljIGZpZWxkcyB3aXRoIHRpY2tldCB2YWx1ZXMKICAgICAgICBteSAlVGlja2V0OwogICAgICAgIGlmICgkVGlja2V0SUQpIHsKICAgICAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBUaGlzIG92ZXJ3cml0ZXMgdGhlIHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiB0YWtlbiBmcm9tIHRoZSB3ZWIgcmVxdWVzdC4KICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhlcmUgc2hvdWxkbid0IGJlIGFueSB2YWx1ZXMgZnJvbSB0aGUgd2ViIHJlcXVlc3QsCiAgICAgICAgICAgICMgYmVjYXVzZSBzdWJtaXRzLCBzdWNjZXNzZnVsIGFuZCB1bnN1Y2Nlc3NmdWwgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeSBhYm92ZS4KICAgICAgICAgICAgaWYgKCAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApICYmICRUaWNrZXRJRCApIHsKCiAgICAgICAgICAgICAgICAjIFZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgZnJvbSBUaWNrZXQuCiAgICAgICAgICAgICAgICAkR2V0UGFyYW0tPntEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgICMgZGVsZXRlIHZpc2liaWxpdHkgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdIaWRkZW5GaWVsZHMnLAogICAgICAgICAgICBLZXkgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dIVE1MID0gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRBY3Rpdml0eURpYWxvZ0hUTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CgogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fUmVuZGVyQWpheCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTdWJhY3Rpb24gaXMgaW52YWxpZCEnKSwKICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICApOwp9CgpzdWIgX1JlbmRlckFqYXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgRmF0YWxFcnJvciBpcyBzYWZlIGJlY2F1c2UgYSBKU09OIHN0cnVjdHVyZSBpcyBleHBlY3RpbmcsIHRoZW4gaXQgd2lsbCByZXN1bHQgaW50byBhCiAgICAjIGNvbW11bmljYXRpb25zIGVycm9yCgogICAgZm9yIG15ICROZWVkZWQgKHF3KFByb2Nlc3NFbnRpdHlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQWpheCcgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywgJ19SZW5kZXJBamF4JyApLAogICAgICAgICk7CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ05vIEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyZWQgZm9yICVzIGluIF9SZW5kZXJBamF4IScsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIG15ICVGaWVsZHNQcm9jZXNzZWQ7CiAgICBteSBASlNPTkNvbGxlY3RvcjsKICAgIG15ICRTZXJ2aWNlczsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHkgZGlhbG9nJ3MgU3VibWl0IFBhcmFtJ3Mgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+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+ICdBY3Rpdml0eUVudGl0eUlEJyApOwogICAgJEdldFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gICAgICAgID0gJFByb2Nlc3NFbnRpdHlJRDsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHlkaWFsb2dzJ3MgU3VibWl0IFBhcmFtJ3Mgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgU2tpcCBpZiB3ZSdyZSB3b3JraW5nIG9uIGEgZmllbGQgdGhhdCB3YXMgYWxyZWFkeSBkb25lIHdpdGggb3Igd2l0aG91dCBJRAogICAgICAgIGlmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gJiYgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMgc2VwYXJhdGVseQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXM7CgogICAgICAgICMgZ2V0IGFydGljbGUgZmllbGRzCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyApIHsKCiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJqZWN0JyApOwogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQm9keScgKTsKIyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnICk7CiMgRU8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICBAeyAkR2V0UGFyYW17SW5mb3JtVXNlcklEfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbntBcnRpY2xlfSA9IDEgaWYgKCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJEdldFBhcmFte0JvZHl9ICk7CgogICAgICAgICAgICAkR2V0UGFyYW17VGltZVVuaXRzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaW1lVW5pdHMnICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICBteSAkUHJlZml4ID0gJ1BlbmRpbmdUaW1lJzsKCiAgICAgICAgICAgICMgT2ssIHdlIG5lZWQgdG8gdHJ5IHRvIGZpbmQgdGhlIHRhcmdldCBzdGF0ZSBub3cKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHN0YXRlIG9iamVjdAogICAgICAgICAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICAgICAgICAgICMgV2FzIHNvbWV0aGluZyBzdWJtaXR0ZWQgZnJvbSB0aGUgR1VJPwogICAgICAgICAgICBteSAkVGFyZ2V0U3RhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGF0ZUlEJyApOwogICAgICAgICAgICBpZiAoJFRhcmdldFN0YXRlSUQpIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUYXJnZXRTdGF0ZUlELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBGYWxsYmFjayAxOiBkZWZhdWx0IHZhbHVlIG9mIGRpYWxvZyBmaWVsZCBTdGF0ZQogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGV9e0RlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGV9e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDI6IGRlZmF1bHQgdmFsdWUgb2YgZGlhbG9nIGZpZWxkIFN0YXRlSUQKICAgICAgICAgICAgaWYgKCAhJVN0YXRlRGF0YSAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e1N0YXRlSUR9e0RlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e1N0YXRlSUR9e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDM6IGV4aXN0aW5nIHRpY2tldCBzdGF0ZQogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICVUaWNrZXQgKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcGVuZGluZyB0aW1lIHZhbHVlcwogICAgICAgICAgICAjIGRlcGVuZHMgb24gU3RhdGVUeXBlIGNvbnRhaW5pbmcgJ15wZW5kaW5nJwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGF0ZURhdGEgKQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIG1hcCB0aGUgR2V0UGFyYW0ncyBEYXRlIFZhbHVlcyB0byBvdXIgRGF0ZVBhcmFtSGFzaAogICAgICAgICAgICAgICAgbXkgJURhdGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeCwKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAoICRQcmVmaXggLiAkXyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAoICRQcmVmaXggLiAkXyApICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGlmIGFsbCB2YWx1ZXMgYXJlIHByZXNlbnQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdEYXknIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnSG91cicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJERhdGVQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgcmVjYWxjdWxhdGUgdGltZSBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICVEYXRlUGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlRGF0ZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcmVmb3JtYXQgZm9yIHN0b3JpbmcgKGUuZy4gdGFrZSBvdXQgUHJlZml4KQogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSB9ID0gbWFwIHsgJF8gPT4gJERhdGVQYXJhbXsgJFByZWZpeCAuICRfIH0gfSBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlc0dvdHRlbntQZW5kaW5nVGltZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vbiBEeW5hbWljRmllbGRzCiAgICAgICAgIyAxLiB0cnkgdG8gZ2V0IHRoZSByZXF1aXJlZCBwYXJhbQogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICk7CgogICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBJRCBmaWVsZCBtYWtlIHN1cmUgdGhlIHZhbHVlIHdpdGhvdXQgSUQgd29uJ3QgYmUgaW4gdGhlCiAgICAgICAgICAgICMgJUdldFBhcmFtIEhhc2ggYW55IG1vcmUKICAgICAgICAgICAgIyBleGNsdWRlIHF1ZXVlIGZyb20gdGhpcyBhcyB3ZSBuZWVkIGl0IGZvciBzY3JpcHQgZmllbGQgZXZhbHVhdGlvbgogICAgICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgICAgIG15ICRRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkVmFsdWUgKTsKICAgICAgICAgICAgICAgIGlmICgkUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkUXVldWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSA9fiBteyguKilJRCR9eG1zICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyQxfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSAgICAgPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBnb3QgdGlja2V0IHBhcmFtcywgdGhlIEdldFBhcmFtIEhhc2ggd2FzIGFscmVhZHkgZmlsbGVkIGJlZm9yZSB0aGUgbG9vcAogICAgICAgICMgYW5kIHdlIGNhbiBuZXh0IG91dAogICAgICAgIGlmICggJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnUXVldWUnICYmICEkR2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKSB7CiAgICAgICAgICAgIG15ICRVc2VyRGVmYXVsdFF1ZXVlID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpVc2VyRGVmYXVsdFF1ZXVlJykgfHwgJyc7CiAgICAgICAgICAgIGlmICgkVXNlckRlZmF1bHRRdWV1ZSkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFVzZXJEZWZhdWx0UXVldWU7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICAgICA9ICRRdWV1ZUlEOwogICAgICAgICAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gU3VibWl0dGVkIG5vciBUaWNrZXQgUGFyYW0gZ2V0IEFjdGl2aXR5RGlhbG9nIENvbmZpZydzIFBhcmFtCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIG5lICdDdXN0b21lcklEJyApIHsKICAgICAgICAgICAgJFZhbHVlID0gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQogICAgfQoKICAgIFJFUVVJUkVERklFTERMT09QOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKHF3KFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkpKSB7CiAgICAgICAgJFZhbHVlID0gdW5kZWY7CiAgICAgICAgaWYgKCAhJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEZWZhdWx0JEN1cnJlbnRGaWVsZCIpOwogICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkRlZmF1bHQlcyBDb25maWcgVmFsdWUgbWlzc2luZyEnLAogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRGVzdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgaWYgKCREZXN0KSB7CgogICAgICAgIG15IEBRdWV1ZVBhcnRzID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKCiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlUGFydHNbMF07CiAgICAgICAgJEdldFBhcmFte1F1ZXVlfSAgID0gJFF1ZXVlUGFydHNbMV07CgogICAgICAgICRWYWx1ZXNHb3R0ZW57UXVldWVJRH0gPSAxOwogICAgfQoKICAgICMgZ2V0IGFsc28gdGhlIElEcyBmb3IgdGhlIFJlcXVpcmVkIGZpbGVzIChpZiB0aGV5IGFyZSBub3QgcHJlc2VudCkKICAgIGlmICggJEdldFBhcmFte1F1ZXVlfSAmJiAhJEdldFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJEdldFBhcmFte1F1ZXVlfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17U3RhdGV9ICYmICEkR2V0UGFyYW17U3RhdGVJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTG9va3VwKCBTdGF0ZSA9PiAkR2V0UGFyYW17U3RhdGV9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtMb2NrfSAmJiAhJEdldFBhcmFte0xvY2tJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0xvY2tJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpLT5Mb2NrTG9va3VwKCBMb2NrID0+ICRHZXRQYXJhbXtMb2NrfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHl9ICYmICEkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICBQcmlvcml0eSA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhbmQgYWxtb3N0IGZpbmFsbHkgd2UnbGwgaGF2ZSB0aGUgc3BlY2lhbCBwYXJhbWV0ZXJzOgogICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbCcgKTsKICAgICRHZXRQYXJhbXtPd25lckFsbH0gICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGwnICk7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApOwoKICAgICMgaGFuZGxlIGR5bmFtaWMgZmllbGRzCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSB7fTsKCiAgICAjIFBhcnNlIGRlZmluaXRpb24gaWYgcHJlc2VudAogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntJbnB1dEZpZWxkRGVmaW5pdGlvbn0gKSB7CiAgICAgICAgbXkgJElucHV0RmllbGREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+TG9hZCgKICAgICAgICAgICAgRGF0YSA9PiAkQWN0aXZpdHlEaWFsb2ctPntJbnB1dEZpZWxkRGVmaW5pdGlvbn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElucHV0RGVmaW5pdGlvbkR5bmFtaWNGaWVsZHMoCiAgICAgICAgICAgIElucHV0RmllbGREZWZpbml0aW9uID0+ICRJbnB1dEZpZWxkRGVmaW5pdGlvbiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkRHluYW1pY0ZpZWxkcyAvLyB7fTsKICAgIH0KCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9ICkgKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgREZOQU1FOgogICAgICAgIGZvciBteSAkREZOYW1lICggbWFwIHsvXkR5bmFtaWNGaWVsZF8oLispJC99IGtleXMgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgREZOQU1FIGlmICRTZWxmLT57RHluYW1pY0ZpZWxkfXskREZOYW1lfTsKCiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskREZOYW1lfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJERGTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lICgga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewoKICAgICAgICAjIG92ZXJ3cml0ZSBkeW5hbWljIGZpZWxkIGNvbmZpZyBkZWZhdWx0IHZhbHVlIHdpdGggYWN0aXZpdHkgZGlhbG9nIGRlZmF1bHQgdmFsdWUsIGlmIHByZXNlbnQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSJ9CiAgICAgICAgICAgICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSJ9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXtDb25maWd9e0RlZmF1bHRWYWx1ZX0gPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUifXtEZWZhdWx0VmFsdWV9OwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIENvbmZpZyBvZiB0aGUgY3VycmVudCBEeW5hbWljRmllbGQKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0KICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICREeW5hbWljRmllbGROYW1lLCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgRHluYW1pY0ZpZWxkIFZhbHVlcwogICAgICAgICRHZXRQYXJhbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgICMgQUNMQ29tcGF0CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPSAkR2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH07CiAgICB9CgogICAgcmV0dXJuIFwlR2V0UGFyYW07Cn0KCnN1YiBfT3V0cHV0QWN0aXZpdHlEaWFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFte0dldFBhcmFtfXtUaWNrZXRJRH07CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIENoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzOgogICAgIyBQcm9jZXNzRW50aXR5SUQgb25seQogICAgIyBUaWNrZXRJRCBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICBpZiAoICEkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSB8fCAoICEkVGlja2V0SUQgJiYgISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICkgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ0dvdCBubyBQcm9jZXNzRW50aXR5SUQgb3IgVGlja2V0SUQgYW5kIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQhJyk7CgogICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nOwogICAgbXkgJVRpY2tldDsKICAgIG15ICVFcnJvciAgICAgICAgID0gKCk7CiAgICBteSAlRXJyb3JNZXNzYWdlcyA9ICgpOwoKICAgICMgSWYgd2UgaGFkIEVycm9ycywgd2UgZ290IGFuIEVycm9yaGFzaAogICAgJUVycm9yICAgICAgICAgPSAleyAkUGFyYW17RXJyb3J9IH0gICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgKTsKICAgICVFcnJvck1lc3NhZ2VzID0gJXsgJFBhcmFte0Vycm9yTWVzc2FnZXN9IH0gaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yTWVzc2FnZXN9ICkgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEFjdGl2aXR5T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRBY3Rpdml0eU9iamVjdCwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgfQogICAgKTsKICAgIG15ICRQcm9jZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggISRUaWNrZXRJRCB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgU3RhcnRBY3Rpdml0eURpYWxvZyBhbmQgU3RhcnRBY3Rpdml0eURpYWxvZyBmb3IgdGhlIFByb2Nlc3NFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gQUpBWCB1cGRhdGUgaW4gdGhpcyBwYXJ0CiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NhblwndCBnZXQgVGlja2V0ICIlcyIhJywgJFBhcmFte1RpY2tldElEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZFByb2Nlc3NJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKTsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQWN0aXZpdHlJRCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEJyk7CgogICAgICAgIGlmICggISRUaWNrZXR7JER5bmFtaWNGaWVsZFByb2Nlc3NJRH0gfHwgISRUaWNrZXR7JER5bmFtaWNGaWVsZEFjdGl2aXR5SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgUHJvY2Vzc0VudGl0eUlEIG9yIEFjdGl2aXR5RW50aXR5SUQgZm9yIFRpY2tldCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9IHsKICAgICAgICAgICAgQWN0aXZpdHkgICAgICAgPT4gJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0sCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAhJVRpY2tldCAmJiAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHkgPSAkQWN0aXZpdHlPYmplY3QtPkFjdGl2aXR5R2V0KAogICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9CiAgICApOwogICAgaWYgKCAhJEFjdGl2aXR5ICkgewogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnQ2FuXCd0IGdldCBBY3Rpdml0eSBjb25maWd1cmF0aW9uIGZvciBBY3Rpdml0eUVudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICk7CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnQ2FuXCd0IGdldCBBY3Rpdml0eURpYWxvZyBjb25maWd1cmF0aW9uIGZvciBBY3Rpdml0eURpYWxvZ0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICk7CiAgICB9CgogICAgIyBncmVwIG91dCBPdmVyd3JpdGVzIGlmIGRlZmluZWQgb24gdGhlIEFjdGl2aXR5CiAgICBteSBAT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXIgPSBncmVwIHsKICAgICAgICByZWYgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfQogICAgICAgICAgICAmJiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9IGVxCiAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e092ZXJ3cml0ZX0gKQogICAgfSBrZXlzICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfSB9OwoKICAgICMgbGV0IHRoZSBPdmVyd3JpdGVzIE92ZXJ3cml0ZSB0aGUgQWN0aXZpdHlEaWFsb2cncyBIYXNoIHZhbHVlcwogICAgaWYgKCAkT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXJbMF0gKSB7CiAgICAgICAgJXskQWN0aXZpdHlEaWFsb2d9ID0gKAogICAgICAgICAgICAleyRBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXsgJE92ZXJ3cml0ZUFjdGl2aXR5RGlhbG9nTnVtYmVyWzBdIH17T3ZlcndyaXRlfSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCBQYWdlSGVhZGVyLCBOYXZiYXIsIEZvcm1oZWFkZXIgKFByb2Nlc3MvQWN0aXZpdHlEaWFsb2dIZWFkZXIpCiAgICBteSAkT3V0cHV0OwogICAgbXkgJE1haW5Cb3hDbGFzczsKCiAgICBpZiAoICEkU2VsZi0+e0lzTWFpbldpbmRvd30gJiYgISRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBUeXBlICA9PiAnU21hbGwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IGdpdmVuIG5vdGlmeSBtZXNzYWdlcyBpZiB0aGlzIGlzIG5vdCBhbiBBSkFYIHJlcXVlc3QKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte05vdGlmeX0gKSApIHsKCiAgICAgICAgICAgIGZvciBteSAkTm90aWZ5RGF0YSAoIEB7ICRQYXJhbXtOb3RpZnl9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggJXskTm90aWZ5RGF0YX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEFjdGl2aXR5RGlhbG9nLT57TmFtZX0gKQogICAgICAgICAgICAgICAgICAgIHx8ICcnLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAoICRTZWxmLT57SXNNYWluV2luZG93fSB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZGlzcGxheSBjb21wbGV0ZSBoZWFkZXIgYW5kIG5hdmlnYXRpb24gYmFyIGluIEFKQVggZGlhbG9ncyB3aGVuIHRoZXJlIGlzIGEgc2VydmVyIGVycm9yCiAgICAgICAgIyAgICB1bmxlc3Mgd2UgYXJlIGluIGEgcHJvY2VzcyBlbnJvbGxtZW50IChvbmx5IHdoZW4gSXNNYWluV2luZG93IGlzIGFjdGl2ZSkKICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57SXNNYWluV2luZG93fSA/ICcnIDogJ1NtYWxsJzsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IG9yaWdpbmFsIGhlYWRlciB0ZXh0cyAodGhlIHByb2Nlc3MgbGlzdCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5KQogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UHJvY2VzcycgLiAkVHlwZSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGwgPT4gJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRoZSBNYWluQm94IGNsYXNzIHRvIGFkZCBjb3JyZWN0IGJvcmRlcnMgdG8gdGhlIHNjcmVlbgogICAgICAgICRNYWluQm94Q2xhc3MgPSAnTWFpbkJveCc7CiAgICB9CgogICAgIyBkaXNwbGF5IHByb2Nlc3MgaW5mb3JtYXRpb24KICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewoKICAgICAgICAjIGdldCBwcm9jZXNzIGRhdGEKICAgICAgICBteSAkUHJvY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzR2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbWFpbiBwcm9jZXNzIGluZm9ybWF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NJbmZvU2lkZWJhcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUHJvY2VzcyAgICAgICAgPT4gJFByb2Nlc3MtPntOYW1lfSAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpdml0eSAgICAgICA9PiAkQWN0aXZpdHktPntOYW1lfSAgICAgICB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+ICRBY3Rpdml0eURpYWxvZy0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGFjdGl2aXR5IGRpYWxvZyBzaG9ydCBkZXNjcmlwdGlvbiAoaWYgYW55KQogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fQogICAgICAgICAgICAmJiAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NJbmZvU2lkZWJhckFjdGl2aXR5RGlhbG9nRGVzYycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0Rlc2NyaXB0aW9uID0+ICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGxvbmcgZGVzY3JpcHRpb24gaW5mb3JtYXRpb24gaWYgZXhpc3RzCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30KICAgICAgICAgICAgJiYgbGVuZ3RoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb25nRGVzY3JpcHRpb25TaWRlYmFyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZGVzY3JpcHRpb25zCiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0CiAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nCiAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY2xvc2UgJiBjYW5jZWwgbGluayBpZiBuZWNlc3NhcnkKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgIGlmICggJFBhcmFte1JlbmRlckxvY2tlZH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbmNlbExpbmsnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQWN0aXZpdHlEaWFsb2dIZWFkZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1OYW1lICAgICAgICAgICAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nRGlhbG9nJyAuICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgU3ViYWN0aW9uICAgICAgICAgICAgICA9PiAnU3RvcmVBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgICAgIExpbmtUaWNrZXRJRCAgICAgICAgICAgPT4gJFNlbGYtPntMaW5rVGlja2V0SUR9LAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlFbnRpdHlJRH0KICAgICAgICAgICAgICAgIHx8ICRUaWNrZXR7CiAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgICAgICAgICB8fCAkVGlja2V0ewogICAgICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgSXNNYWluV2luZG93ICAgID0+ICRTZWxmLT57SXNNYWluV2luZG93fSwKICAgICAgICAgICAgSXNQcm9jZXNzRW5yb2xsID0+ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSwKICAgICAgICAgICAgTWFpbkJveENsYXNzICAgID0+ICRNYWluQm94Q2xhc3MgfHwgJycsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVJlbmRlcmVkRmllbGRzID0gKCk7CgogICAgbXkgJElucHV0RGVmaW5pdGlvblJlbmRlcmVkID0gMDsKICAgIG15ICVERlBvc3NpYmxlVmFsdWVzICAgICAgICA9ICV7ICRQYXJhbXtERlBvc3NpYmxlVmFsdWVzfSAvLyB7fSB9OwogICAgbXkgJVZpc2liaWxpdHkgICAgICAgICAgICAgID0gJXsgJFBhcmFte1Zpc2liaWxpdHl9ICAgICAgIC8vIHt9IH07CgogICAgIyBpZiB3ZSBhcmUgcmVuZGVyaW5nIGEgbmV3IG1hc2sgYW5kIGFyZSBub3QgcmVyZW5kZXJpbmcgd2l0aCBlcnJvcnMgZ2V0IHRpY2tldCBhbmQgZGVmYXVsdCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gbmUgJ1N0b3JlQWN0aXZpdHlEaWFsb2cnICkgewoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgICAgICBteSAkTmV3VGlja2V0OwoKICAgICAgICAjIGdldCBzdG9yZWQgZHluYW1pYyBmaWVsZCB2YWx1ZSAoc3BsaXQpCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3VmZml4ICAgICAgPT4gJFNlbGYtPntJRFN1ZmZpeH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHdlIGFyZSB1cGRhdGluZyBhbiBleGlzdGluZyB0aWNrZXQKICAgICAgICBlbHNpZiAoJVRpY2tldCkgewoKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eyAnRHluYW1pY0ZpZWxkXycgLiAkTmFtZSB9ID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJE5hbWUgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICROZXdUaWNrZXQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZXRyaWV2ZSBmaWVsZCByZXN0cmljdGlvbnMgZm9yIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQXV0b3NlbGVjdCAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgICAgIG15ICRMb29wUHJvdGVjdGlvbiA9IDEwMDsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgVGlja2V0T2JqZWN0ICAgICAgICAgICAgICA9PiAkVGlja2V0T2JqZWN0LAogICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4ge30sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lclVzZXJJRH0gfHwgJycsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgICAgICAgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uICAgICAgICAgICA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgKTsKCiAgICAgICAgJURGUG9zc2libGVWYWx1ZXMgPSBtYXAgeyAkXyA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX317UG9zc2libGVWYWx1ZXN9IH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgICVWaXNpYmlsaXR5ICAgICAgID0gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LT4lKjsKICAgIH0KCiAgICAjIFBhcnNlIGRlZmluaXRpb24gaWYgcHJlc2VudAogICAgbXkgJElucHV0RmllbGREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+TG9hZCgKICAgICAgICBEYXRhID0+ICRBY3Rpdml0eURpYWxvZy0+e0lucHV0RmllbGREZWZpbml0aW9ufSwKICAgICk7CiAgICBteSAlRGVmaW5lZEZpZWxkc0xpc3Q7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkSW5wdXRGaWVsZERlZmluaXRpb24pICkgewogICAgICAgIGZvciBteSAkUm93ICggJElucHV0RmllbGREZWZpbml0aW9uLT5AKiApIHsKICAgICAgICAgICAgaWYgKCAkUm93LT57REZ9ICkgewogICAgICAgICAgICAgICAgJERlZmluZWRGaWVsZHNMaXN0eyAnRHluYW1pY0ZpZWxkXycgLiAkUm93LT57REZ9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJvdy0+e0dyaWR9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRHcmlkUm93ICggJFJvdy0+e0dyaWR9e1Jvd3N9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggZ3JlcCB7ICRfLT57REZ9IH0gJEdyaWRSb3ctPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGVmaW5lZEZpZWxkc0xpc3R7ICdEeW5hbWljRmllbGRfJyAuICRGaWVsZC0+e0RGfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlcyA9IG1hcCB7ICggJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gJFBhcmFte0dldFBhcmFtfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gfSApIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwoKICAgICMgTG9vcCB0aHJvdWdoIEFjdGl2aXR5RGlhbG9nRmllbGRzIGFuZCByZW5kZXIgdGhlaXIgb3V0cHV0CiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSApICkgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdDYW5cJ3QgZ2V0IGRhdGEgZm9yIEZpZWxkICIlcyIgb2YgQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVGaWVsZERhdGEgPSAleyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICMgV2UgcmVuZGVyIGp1c3QgdmlzaWJsZSBBY3Rpdml0eURpYWxvZ0ZpZWxkcwogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgISRGaWVsZERhdGF7RGlzcGxheX07CgogICAgICAgICMgSGFuZGxlIG11bHRpY29sdW1uIGZpZWxkIHJlbmRlcmluZwogICAgICAgIGlmICggJERlZmluZWRGaWVsZHNMaXN0eyRDdXJyZW50RmllbGR9ICkgewoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkSW5wdXREZWZpbml0aW9uUmVuZGVyZWQ7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkSW5wdXRGaWVsZERlZmluaXRpb24sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gXCVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiBcJURGUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgICA9PiAkUGFyYW17REZFcnJvcnN9LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJElucHV0RGVmaW5pdGlvblJlbmRlcmVkID0gMTsKCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBEeW5hbWljRmllbGRzCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKICAgICAgICAgICAgbXkgJFJlc3BvbnNlICAgICAgICAgPSAkU2VsZi0+X1JlbmRlckR5bmFtaWNGaWVsZCgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgICAgICAgIHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICAgICAgICAgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2VzICAgICAgID0+IFwlRXJyb3JNZXNzYWdlcyB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgICA9PiAkREZQb3NzaWJsZVZhbHVlc3skRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgID0+ICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9IC8vIDAsCiAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICA9PiAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAlRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBTdGF0ZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1N0YXRlSUQnICkKICAgICAgICB7CgogICAgICAgICAgICAjIFdlIGRvbid0IHJlbmRlciBGaWVsZHMgdHdpY2UsCiAgICAgICAgICAgICMgaWYgdGhlcmUgd2FzIGFscmVhZHkgYSBDb25maWcgd2l0aG91dCBJRCwgc2tpcCB0aGlzIGZpZWxkCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTdGF0ZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBRdWV1ZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1F1ZXVlSUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJRdWV1ZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBQcmlvcml0eQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1ByaW9yaXR5SUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJQcmlvcml0eSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBMb2NrCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnTG9ja0lEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckxvY2soCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU2VydmljZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1NlcnZpY2VJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTZXJ2aWNlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFNMQQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1NMQUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNMQSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBPd25lcgogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ093bmVySUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyT3duZXIoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgcmVzcG9uc2libGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdSZXNwb25zaWJsZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclJlc3BvbnNpYmxlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIEN1c3RvbWVySUQKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lcklEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckN1c3RvbWVyKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewoKICAgICAgICAgICAgIyBQZW5kaW5nVGltZSBpcyBqdXN0IHVzZWZ1bCBpZiB3ZSBoYXZlIFN0YXRlIG9yIFN0YXRlSUQKICAgICAgICAgICAgaWYgKCBub25lIHtte14oU3RhdGVJRHxTdGF0ZSkkfXhtc30gQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdQZW5kaW5nVGltZSBjYW4ganVzdCBiZSB1c2VkIGlmIFN0YXRlIG9yIFN0YXRlSUQgaXMgY29uZmlndXJlZCBmb3IgdGhlIHNhbWUgQWN0aXZpdHlEaWFsb2cuIEFjdGl2aXR5RGlhbG9nOiAlcyEnLAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJQZW5kaW5nVGltZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciAgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUaXRsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1RpdGxlJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclRpdGxlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIEFydGljbGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgojIFJvdGhlciBPU1MgLyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICAgICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoICRQYXJhbXtHZXRQYXJhbX0tPiUqICk7CgojIEVPIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yICB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgSW5mb3JtQWdlbnRzICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e0FydGljbGV9e0NvbmZpZ317SW5mb3JtQWdlbnRzfSwKIyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFN0YW5kYXJkVGVtcGxhdGVzLAojIEVPIFByb2Nlc3NUaWNrZXRUZW1wbGF0ZXMKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUeXBlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnVHlwZUlEJyApIHsKCiAgICAgICAgICAgICMgV2UgZG9uJ3QgcmVuZGVyIEZpZWxkcyB0d2ljZSwKICAgICAgICAgICAgIyBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhIENvbmZpZyB3aXRob3V0IElELCBza2lwIHRoaXMgZmllbGQKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclR5cGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRm9vdGVyQ1NTQ2xhc3MgPSAnRm9vdGVyJzsKCiAgICBpZiAoICRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CgogICAgICAgICMgRHVlIHRvIHRoZSBpbml0aWFsIGxvYWRpbmcgb2YKICAgICAgICAjIHRoZSBmaXJzdCBBY3Rpdml0eURpYWxvZyBhZnRlciBQcm9jZXNzIHNlbGVjdGlvbgogICAgICAgICMgd2UgaGF2ZSB0byBiaW5kIHRoZSBBamF4VXBkYXRlIEZ1bmN0aW9uIG9uCiAgICAgICAgIyB0aGUgc2VsZWN0cywgc28gd2UgZ2V0IHRoZSBjb21wbGV0ZSBKU09uRG9jdW1lbnRDb21wbGV0ZSBjb2RlCiAgICAgICAgIyBhbmQgZGVsaXZlciBpdCBpbiB0aGUgRm9vdGVySlMgYmxvY2suCiAgICAgICAgIyBUaGlzIEphdmFzY3JpcHQgUGFydCBpcyBleGVjdXRlZCBpbgogICAgICAgICMgQWdlbnRUaWNrZXRQcm9jZXNzLnR0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zvb3RlckpTJywKICAgICAgICApOwoKICAgICAgICAkRm9vdGVyQ1NTQ2xhc3MgPSAnQ2VudGVyZWQnOwogICAgfQoKICAgICMgc2V0IHN1Ym1pdCBidXR0b24gZGF0YQogICAgbXkgJEJ1dHRvblRleHQgID0gJ1N1Ym1pdCc7CiAgICBteSAkQnV0dG9uVGl0bGUgPSAnU2F2ZSc7CiAgICBteSAkQnV0dG9uSUQgICAgPSAnU3VibWl0JyAuICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9OwogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fSApIHsKICAgICAgICAkQnV0dG9uVGV4dCAgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgICAgICAkQnV0dG9uVGl0bGUgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGb290ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb290ZXJDU1NDbGFzcyA9PiAkRm9vdGVyQ1NTQ2xhc3MsCiAgICAgICAgICAgIEJ1dHRvblRleHQgICAgID0+ICRCdXR0b25UZXh0LAogICAgICAgICAgICBCdXR0b25UaXRsZSAgICA9PiAkQnV0dG9uVGl0bGUsCiAgICAgICAgICAgIEJ1dHRvbklEICAgICAgID0+ICRCdXR0b25JRAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1Ym1pdEFkdmljZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFkdmljZVRleHQgPT4gJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbG9hZCBwYXJlbnQgd2luZG93CiAgICBpZiAoICRQYXJhbXtQYXJlbnRSZWxvYWR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1BhcmVudFJlbG9hZCcsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCB0aGUgRm9ybUZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9BY3Rpdml0eURpYWxvZ0Zvb3RlcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgcmVndWxhciBmb290ZXIgb25seSBpbiBub24tYWpheCBjYXNlCiAgICBpZiAoICEkU2VsZi0+e0lzQWpheFJlcXVlc3R9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICRTZWxmLT57SXNNYWluV2luZG93fSA/ICcnIDogJ1NtYWxsJyApOwogICAgfQoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1JlbmRlclBlbmRpbmdUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJQZW5kaW5nVGltZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJQZW5kaW5nVGltZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsID0+ICgKICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQZW5kaW5nIERhdGUnKQogICAgICAgICAgICAgICAgLiAnICgnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZm9yIHBlbmRpbmcqIHN0YXRlcycpIC4gJyknCiAgICAgICAgKSwKICAgICAgICBGaWVsZElEID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBGb3JtSUQgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgKTsKCiAgICBteSAkRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtFcnJvcn17J1BlbmRpbmd0VGltZURheSd9ICkgewogICAgICAgICAgICAkRGF0YXtQZW5kaW5ndFRpbWVEYXlFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKTsKICAgICAgICAgICAgJEVycm9yID0gJFBhcmFte0Vycm9yfXsnUGVuZGluZ3RUaW1lRGF5J307CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte0Vycm9yfXsnUGVuZGluZ3RUaW1lSG91cid9ICkgewogICAgICAgICAgICAkRGF0YXtQZW5kaW5ndFRpbWVIb3VyRXJyb3J9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIik7CiAgICAgICAgICAgICRFcnJvciA9ICRQYXJhbXtFcnJvcn17J1BlbmRpbmd0VGltZURheSd9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FsZW5kYXIgPSAnJzsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHVzZWQgY2FsZW5kYXIgaWYgd2UgaGF2ZSB0aWNrZXQgZGF0YQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSApIHsKICAgICAgICAkQ2FsZW5kYXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDYWxlbmRhckdldCgKICAgICAgICAgICAgJXsgJFBhcmFte1RpY2tldH0gfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRRdWlja0RhdGVCdXR0b25zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e1F1aWNrRGF0ZUJ1dHRvbnN9CiAgICAgICAgLy8gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBQZW5kaW5nVGltZVJlcXVpcmVkID0+CiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMgogICAgICAgICAgICApID8gMSA6IDAsCiAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgIHx8ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgfHwgODY0MDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJEVycm9yLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICAgICAgUXVpY2tEYXRlQnV0dG9ucyAgICAgPT4gJFF1aWNrRGF0ZUJ1dHRvbnMsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UGVuZGluZ1RpbWUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlBlbmRpbmdUaW1lOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6UGVuZGluZ1RpbWU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9QZW5kaW5nVGltZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyRHluYW1pY0ZpZWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCBGaWVsZE5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckR5bmFtaWNGaWVsZCcgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKCiAgICAgICAgbXkgJE1lc3NhZ2UgPSAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkUGFyYW17RmllbGROYW1lfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgSFRNTCAgICA9PiAnJywKICAgICAgICB9OwogICAgfQoKICAgIG15ICRTZXJ2ZXJFcnJvcjsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yfXsgJFBhcmFte0ZpZWxkTmFtZX0gfQogICAgICAgICAgICAmJiAkUGFyYW17RXJyb3J9eyAkUGFyYW17RmllbGROYW1lfSB9IG5lICcnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZXJ2ZXJFcnJvciA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRFcnJvck1lc3NhZ2UgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvck1lc3NhZ2VzfSApICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17RXJyb3JNZXNzYWdlc317ICRQYXJhbXtGaWVsZE5hbWV9IH0KICAgICAgICAgICAgJiYgJFBhcmFte0Vycm9yTWVzc2FnZXN9eyAkUGFyYW17RmllbGROYW1lfSB9IG5lICcnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgPSAkUGFyYW17RXJyb3JNZXNzYWdlc317ICRQYXJhbXtGaWVsZE5hbWV9IH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQYXJhbXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyLAogICAgICAgIEFDTEhpZGRlbiAgICAgICAgICAgID0+ICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgJiYgISRQYXJhbXtWaXNpYmlsaXR5fSApLAogICAgICAgIFNlcnZlckVycm9yICAgICAgICAgID0+ICRTZXJ2ZXJFcnJvciwKICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgICA9PiAkRXJyb3JNZXNzYWdlLAogICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+ICRQYXJhbXtPYmplY3R9LAogICAgKTsKCiAgICBteSAkRmllbGRDbGFzc2VzID0gJ0ZpZWxkJyAuICggJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ1JpY2hUZXh0JyA/ICcgUmljaFRleHRGaWVsZCcgOiAnJyApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIE5hbWUgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgTGFiZWwgICAgICAgID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgIEhpZGRlbkNsYXNzICA9PiAhJFBhcmFte1Zpc2liaWxpdHl9ID8gJyBvb29BQ0xIaWRkZW4nIDogJycsCiAgICAgICAgRmllbGRDbGFzc2VzID0+ICRGaWVsZENsYXNzZXMsCiAgICApOwoKICAgICMgaGFuZGxlIG11bHRpdmFsdWUgZmllbGQKICAgIGlmICggJER5bmFtaWNGaWVsZEhUTUwtPntNdWx0aVZhbHVlfSApIHsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd19EeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlQ29sdW1ucyA9PiAnMWZyJywKICAgICAgICAgICAgICAgIFJvd0NsYXNzZXMgICAgICA9PiAnIE11bHRpVmFsdWUnLAogICAgICAgICAgICAgICAgSGlkZGVuQ2xhc3MgICAgID0+ICEkUGFyYW17VmlzaWJpbGl0eX0gPyAnIG9vb0FDTEhpZGRlbicgOiAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBvbmUgYmxvY2sgZm9yIGVhY2ggbXVsdGl2YWx1ZSBpdGVtCiAgICAgICAgZm9yIG15ICRNdWx0aVZhbHVlSW5kZXggKCAwIC4uICQjeyAkRHluYW1pY0ZpZWxkSFRNTC0+e011bHRpVmFsdWV9IH0gKSB7CgogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICREeW5hbWljRmllbGRIVE1MLT57TXVsdGlWYWx1ZX1bJE11bHRpVmFsdWVJbmRleF07CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpEeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgTXVsdGlWYWx1ZSA9PiAxLAoKICAgICAgICAgICAgICAgICAgICAjIFRPRE8gYXNrIGFib3V0IHRoaXMKICAgICAgICAgICAgICAgICAgICAjIFJvd1JlYWRPbmx5ICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e1JlYWRvbmx5fSwKICAgICAgICAgICAgICAgICAgICBDb2x1bW5DbGFzc2VzID0+ICcgTXVsdGlWYWx1ZV8nIC4gJE11bHRpVmFsdWVJbmRleCwKICAgICAgICAgICAgICAgICAgICBDb2x1bW5TdHlsZSAgID0+ICdncmlkLWNvbHVtbjogMSAvIHNwYW4gMScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW5kZXIgc2hvcnQgZGVzY3JpcHRpb24gb25jZSBmb3IgZmlyc3QgZWxlbWVudAogICAgICAgICAgICBpZiAoICEkTXVsdGlWYWx1ZUluZGV4ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVuZGVyIGxvbmcgZGVzY3JpcHRpb24gb25jZSBmb3IgbGFzdCBlbGVtZW50CiAgICAgICAgICAgIGlmICggJE11bHRpVmFsdWVJbmRleCA9PSAkI3sgJER5bmFtaWNGaWVsZEhUTUwtPntNdWx0aVZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkTXVsdGlWYWx1ZVRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e011bHRpVmFsdWVUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgICA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIENvbHVtblN0eWxlID0+ICdncmlkLWNvbHVtbjogMSAvIHNwYW4gMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZW5kZXIgc2hvcnQgZGVzY3JpcHRpb24gb25jZSBmb3IgZmlyc3QgZWxlbWVudAogICAgICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uTG9uZ1RlbXBsYXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGF7Q29udGVudH0gPSAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6RHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9CiAgICAgICAgICAgICAgICAgICAgfHwgJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAncnc6RHluYW1pY0ZpZWxkOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGVtcGxhdGVGaWxlID0gJ1Byb2Nlc3NNYW5hZ2VtZW50LycgLiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e011bHRpVmFsdWV9ID8gJ1Jvd0R5bmFtaWNGaWVsZCcgOiAnRHluYW1pY0ZpZWxkJyApOwoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJFRlbXBsYXRlRmlsZSApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJUaXRsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkVGl0bGUgPSAkUGFyYW17VGlja2V0fXtUaXRsZX0gLy8gJyc7CgogICAgaWYgKCAhJFRpdGxlICYmICRTZWxmLT57TGlua0FydGljbGVEYXRhfSApIHsKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRUaXRsZSA9ICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgICRQYXJhbXtHZXRQYXJhbX17VGl0bGV9IC8vPSAkVGl0bGU7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRpdGxlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgVmFsdWUgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e1RpdGxlfSwKICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydUaXRsZSd9ICkgewogICAgICAgICREYXRhe1NlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpUaXRsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpUaXRsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1RpdGxlJyApLAogICAgfTsKCn0KCnN1YiBfUmVuZGVyQXJ0aWNsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIFRpY2tldCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQXJ0aWNsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJBcnRpY2xlJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9ICkgKSB7CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVF1b3RlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfXtBcnRpY2xlSUR9LAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKSwKICAgICAgICAgICAgQXR0YWNobWVudHNJbmNsdWRlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAoKICAgICAgICAgICAgIyBTdHJpcCBvdXQgZXh0ZXJuYWwgY29udGVudCBpZiBCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50IGlzIGVuYWJsZWQuCiAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKSwKCiAgICAgICAgICAgICMgRGlzYWxsb3cgcG90ZW50aWFsbHkgdW5zYWZlIGNvbnRlbnQuCiAgICAgICAgICAgIE5vQXBwbGV0ICAgICA9PiAxLAogICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgICAgIE5vU1ZHICAgICAgICA9PiAxLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdBcnRpY2xlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICAgICAgU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtCb2R5fSwKICAgICAgICBMYWJlbFN1YmplY3QgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtDb25maWd9e0xhYmVsU3ViamVjdH0KICAgICAgICAgICAgfHwgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTdWJqZWN0IiksCiAgICAgICAgTGFiZWxCb2R5ID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtDb25maWd9e0xhYmVsQm9keX0KICAgICAgICAgICAgfHwgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUZXh0IiksCiAgICAgICAgQXR0YWNobWVudExpc3QgPT4gJFBhcmFte0F0dGFjaG1lbnRMaXN0fSwKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnQXJ0aWNsZVN1YmplY3QnfSApIHsKICAgICAgICAkRGF0YXtTdWJqZWN0U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydBcnRpY2xlQm9keSd9ICkgewogICAgICAgICREYXRhe0JvZHlTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6QXJ0aWNsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuU3ViamVjdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQm9keScsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gUHJvY2Vzc1RpY2tldFRlbXBsYXRlcwogICAgbXkgJEFjdGl2YXRlU3RhbmRhcmRUZW1wbGF0ZXMgPSBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtDb25maWd9e1N0YW5kYXJkVGVtcGxhdGVzfSA/ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtDb25maWd9e1N0YW5kYXJkVGVtcGxhdGVzfSA6IDE7CiAgICBpZiAoICRBY3RpdmF0ZVN0YW5kYXJkVGVtcGxhdGVzICkgewoKICAgICAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpOwogICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgVHlwZSAgPT4gJ1Byb2Nlc3NEaWFsb2cnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CgogICAgICAgICAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAgICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U3RhbmRhcmRUZW1wbGF0ZUlEfTsKICAgICAgICAgICAgaWYgKCRTdGFuZGFyZFRlbXBsYXRlSURQYXJhbSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFN0YW5kYXJkVGVtcGxhdGVJRFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgICAgICAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnU3RhbmRhcmRUZW1wbGF0ZUlEJ30gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSB8fCB7fSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKIyBFTyBQcm9jZXNzVGlja2V0VGVtcGxhdGVzCiAgICBpZiAoICRQYXJhbXtJbmZvcm1BZ2VudHN9ICkgewoKICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkR0lEICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1RpY2tldH17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICBTaXplICAgICAgID0+IDMsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydUaW1lVW5pdHMnfSApIHsKICAgICAgICAkUGFyYW17VGltZVVuaXRzSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgc2hvdyB0aW1lIHVuaXRzCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317VGltZVVuaXRzfQogICAgICAgICkKICAgIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0NvbmZpZ317VGltZVVuaXRzfSA9PSAxICkgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBUaW1lVW5pdHMgdmFsdWUuCiAgICAgICAgJFBhcmFte1RpbWVVbml0c30gPSAkUGFyYW17R2V0UGFyYW19e1RpbWVVbml0c307CgogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFte1RpbWVVbml0c30gJiYgJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzfSA9ICRTZWxmLT5fR2V0VGltZVVuaXRzKAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9BcnRpY2xlJyApLAogICAgfTsKfQoKc3ViIF9HZXRUaW1lVW5pdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQWNjb3VudGVkVGltZSA9ICcnOwoKICAgICMgR2V0IGFjY291bnRlZCB0aW1lIGlmIEFjY291bnRUaW1lIGNvbmZpZyBpdGVtIGlzIGVuYWJsZWQuCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSAmJiBkZWZpbmVkICRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICRBY2NvdW50ZWRUaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRBY2NvdW50ZWRUaW1lID8gJEFjY291bnRlZFRpbWUgOiAnJzsKfQoKc3ViIF9SZW5kZXJDdXN0b21lciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQ3VzdG9tZXInICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyQ3VzdG9tZXInICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwoKICAgIG15ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9OwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsQ3VzdG9tZXJVc2VyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpLAogICAgICAgIExhYmVsQ3VzdG9tZXJJRCAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lckF1dG9Db21wbGV0ZVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXtDdXN0b21lcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lcklEU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRTZWxmLT57TGlua1RpY2tldERhdGF9e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICgKICAgICAgICAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVyVXNlcklEfSApCiAgICAgICAgfHwgJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgKQogICAgewogICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgfHwgJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDdXN0b21lciB1c2VyIGZyb20gYXJ0aWNsZSBpcyBwcmVzZWxlY3RlZCBmb3IgbmV3IHNwbGl0IHRpY2tldC4gU2VlIGJ1ZyMxMjk1Ni4KICAgIGlmICgKICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9ICkKICAgICAgICAmJiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17RnJvbX0KICAgICAgICAmJiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJwogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgQEFydGljbGVGcm9tQWRkcmVzcyA9IE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX17RnJvbX0gKTsKCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgICAgICBteSAlTGlzdCAgICAgICAgICAgICAgID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEFydGljbGVGcm9tQWRkcmVzc1swXS0+YWRkcmVzcygpLAogICAgICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlciA9IHNvcnQga2V5cyAlTGlzdDsKICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlclswXSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBmaWVsZCBhcyAiRmlyc3ROYW1lIExhc3RuYW1lIiA8TWFpbEFkZHJlc3M+CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUN1c3RvbWVyVXNlckRhdGEgKSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lclVzZXJJRH0gICAgICAgPSAiXCIkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRnVsbG5hbWV9IiAuICJcIiA8JEN1c3RvbWVyVXNlckRhdGF7VXNlckVtYWlsfT4iOwogICAgICAgICREYXRhe0N1c3RvbWVySUR9ICAgICAgICAgICA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSB8fCAnJzsKICAgICAgICAkRGF0YXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0gPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VySUR9ICAgICAgICAgfHwgJyc7CiAgICB9CgogICAgIyBXaGVuIHRoZXJlIGlzIG5vIEN1c3RvbWVyIGluIHRoZSBEQiwgaXQgY291bGQgYmUgdW5rbm93biBDdXN0b21lciwgc2V0IGl0IGZyb20gdGhlIHRpY2tldC4KICAgICMgU2VlIGJ1ZyMxMjc5NyAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3OTcgKS4KICAgIGVsc2UgewogICAgICAgICREYXRhe0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVyVXNlcklEfSB8fCAnJzsKICAgICAgICAkRGF0YXtDdXN0b21lcklEfSAgICAgPSAkUGFyYW17VGlja2V0fXtDdXN0b21lcklEfSAgICAgfHwgJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJERhdGF7RGVzY3JpcHRpb25TaG9ydH0gPSAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH07CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpDdXN0b21lcicsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkN1c3RvbWVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQ3VzdG9tZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclJlc3BvbnNpYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJSZXNwb25zaWJsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJSZXNwb25zaWJsZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgfQoKICAgIG15ICRSZXNwb25zaWJsZXMgPSAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlJlc3BvbnNpYmxlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUmVzcG9uc2libGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBSZXNwb25zaWJsZUFsbCAgID0+ICRQYXJhbXtHZXRQYXJhbX17UmVzcG9uc2libGVBbGx9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBpZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjICAgIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gKSB7CgogICAgICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1Jlc3BvbnNpYmxlJyApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3BvbnNpYmxlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UmVzcG9uc2libGVJRH07CiAgICBpZiAoICRSZXNwb25zaWJsZUlEUGFyYW0gJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJJRCA9PiAkUmVzcG9uc2libGVJRFBhcmFtICk7CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBubyB1c2VyIGZyb20gR2V0UGFyYW0gb3IgZGVmYXVsdCBhbmQgdGhlIGZpZWxkIGlzIG1hbmRhdG9yeSBnZXQgaXQgZnJvbSB0aGUgdGlja2V0CiAgICAjICAgIChpZiBhbnkpCiAgICBpZiAoCiAgICAgICAgISRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9e1Jlc3BvbnNpYmxlfTsKICAgIH0KCiAgICAjIGlmIHdlIGhhdmUgYSB1c2VyIGFscmVhZHkgYW5kIHRoZSBmaWVsZCBpcyBub3QgbWFuZGF0b3J5IGFuZCBpdCBpcyB0aGUgc2FtZSBhcyBpbiB0aWNrZXQsIHRoZW4KICAgICMgICAgc2V0IGl0IHRvIG5vbmUgKGFzIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkIGFmdGVyYWxsKQogICAgZWxzaWYgKAogICAgICAgICRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICE9IDIKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKQogICAgICAgICYmICRTZWxlY3RlZFZhbHVlIGVxICRQYXJhbXtUaWNrZXR9e1Jlc3BvbnNpYmxlfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICcnOwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1Jlc3BvbnNpYmxlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZElEID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17UmVzcG9uc2libGVJRH07CiAgICB9CgogICAgIyBidWlsZCBSZXNwb25zaWJsZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZXMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkSUQsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICJNb2Rlcm5pemUgRm9ybVVwZGF0ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlJlc3BvbnNpYmxlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UmVzcG9uc2libGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpSZXNwb25zaWJsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1Jlc3BvbnNpYmxlJyApLAogICAgfTsKCn0KCnN1YiBfUmVuZGVyT3duZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlck93bmVyJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlck93bmVyJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e093bmVyQWxsfSA9IDE7CiAgICB9CgogICAgbXkgJE93bmVycyA9ICRTZWxmLT5fR2V0T3duZXJzKCAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiT3duZXIiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdPd25lcklEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE93bmVyQWxsICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtPd25lckFsbH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIGlmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgICAgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSApIHsKCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnT3duZXInICkgewoKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPd25lcklEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e093bmVySUR9OwogICAgaWYgKCAkT3duZXJJRFBhcmFtICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VySUQgPT4gJE93bmVySURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gdXNlciBmcm9tIEdldFBhcmFtIG9yIGRlZmF1bHQgYW5kIHRoZSBmaWVsZCBpcyBtYW5kYXRvcnkgZ2V0IGl0IGZyb20gdGhlIHRpY2tldAogICAgIyAgICAoaWYgYW55KQogICAgaWYgKAogICAgICAgICEkU2VsZWN0ZWRWYWx1ZQogICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtPd25lcn07CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIGEgdXNlciBhbHJlYWR5IGFuZCB0aGUgZmllbGQgaXMgbm90IG1hbmRhdG9yeSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gdGlja2V0LCB0aGVuCiAgICAjICAgIHNldCBpdCB0byBub25lIChhcyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCBhZnRlcmFsbCkKICAgIGVsc2lmICgKICAgICAgICAkU2VsZWN0ZWRWYWx1ZQogICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAhPSAyCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkKICAgICAgICAmJiAkU2VsZWN0ZWRWYWx1ZSBlcSAkUGFyYW17VGlja2V0fXtPd25lcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAnJzsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydPd25lcklEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17T3duZXJJRH07CiAgICB9CgogICAgIyBsb29rIHVwICRTZWxlY3RlZElECiAgICBteSAkU2VsZWN0ZWRJRDsKICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICRTZWxlY3RlZElEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgT3duZXIgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkT3duZXJzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnT3duZXJJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZElEIHx8ICcnLAogICAgICAgIENsYXNzICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpPd25lcicsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3Ok93bmVyOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6T3duZXI6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Pd25lcicgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyU0xBIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTTEEnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU0xBJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1F1ZXVlSUR9ICAgICAgICA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1F1ZXVlSUR9OwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17VGlja2V0SUR9ICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17VGlja2V0SUR9OwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9ID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17Q3VzdG9tZXJVc2VySUR9OwogICAgfQoKICAgICMgY3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgR2V0UGFyYW0KICAgIG15ICVHZXRTZXJ2aWNlc1BhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgdXNlIHRpY2tldCBpbmZvcm1hdGlvbiBhcyBhIGZhbGwgYmFjayBpZiBjdXN0b21lciB3YXMgYWxyZWFkeSBzZXQsIG90aGVyd2lzZSB3aGVuIHRoZQogICAgIyBhY3Rpdml0eSBkaWFsb2cgZGlzcGxheXMgdGhlIHNlcnZpY2UgbGlzdCB3aWxsIGJlIGluaXRpYWxseSBlbXB0eSwgc2VlIGJ1ZyMxMDA1OQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSApIHsKICAgICAgICAkR2V0U2VydmljZXNQYXJhbXtDdXN0b21lclVzZXJJRH0gfHw9ICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVyVXNlcklEfSB8fD0gJyc7CiAgICB9CgogICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAlR2V0U2VydmljZXNQYXJhbSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1NlcnZpY2VzfSAgPSAkU2VydmljZXM7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX17U2VydmljZUlEfTsKICAgIH0KCiAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU0xBIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IFNMQSBvYmplY3QKICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgogICAgbXkgJFNMQUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1NMQUlEfTsKICAgIGlmICgkU0xBSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKCBTTEFJRCA9PiAkU0xBSURQYXJhbSApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1NMQScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU0xBID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17U0xBfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydTTEFJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1NMQX07CiAgICB9CgogICAgIyBidWlsZCBTTEEgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICAgICBNYXggICAgICAgICAgID0+IDIwMCwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpTTEEnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpTTEE6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTTEE6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TTEEnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNlcnZpY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclNlcnZpY2UnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU2VydmljZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXtRdWV1ZUlEfSAgICAgICAgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtRdWV1ZUlEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e1RpY2tldElEfSAgICAgICA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1RpY2tldElEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e0N1c3RvbWVyVXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIEdldFBhcmFtCiAgICBteSAlR2V0U2VydmljZXNQYXJhbSA9ICV7ICRQYXJhbXtHZXRQYXJhbX0gfTsKCiAgICAjIHVzZSB0aWNrZXQgaW5mb3JtYXRpb24gYXMgYSBmYWxsIGJhY2sgaWYgY3VzdG9tZXIgd2FzIGFscmVhZHkgc2V0LCBvdGhlcndpc2Ugd2hlbiB0aGUKICAgICMgYWN0aXZpdHkgZGlhbG9nIGRpc3BsYXlzIHRoZSBzZXJ2aWNlIGxpc3Qgd2lsbCBiZSBpbml0aWFsbHkgZW1wdHksIHNlZSBidWcjMTAwNTkKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgKSB7CiAgICAgICAgJEdldFNlcnZpY2VzUGFyYW17Q3VzdG9tZXJVc2VySUR9IHx8PSAkUGFyYW17VGlja2V0fXtDdXN0b21lclVzZXJJRH0gfHw9ICcnOwogICAgfQoKICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgJUdldFNlcnZpY2VzUGFyYW0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTZXJ2aWNlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgIG15ICRTZXJ2aWNlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U2VydmljZUlEfTsKICAgIGlmICgkU2VydmljZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnU2VydmljZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtTZXJ2aWNlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydTZXJ2aWNlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtTZXJ2aWNlfTsKICAgIH0KCiAgICAjIGJ1aWxkIFNlcnZpY2Ugc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBUcmVlVmlldyAgICAgID0+ICRUcmVlVmlldywKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAkVHJlZVZpZXcsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6U2VydmljZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlNlcnZpY2U6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTZXJ2aWNlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvU2VydmljZScgKSwKICAgIH07Cgp9CgpzdWIgX1JlbmRlckxvY2sgewoKICAgICMgZm9yIGxvY2sgc3RhdGVzIHRoZXJlJ3Mgbm8gQUNMIGNoZWNraW5nIHlldCBpbXBsZW1lbnRlZCBzbyBubyBjaGVja2luZy4uLgoKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJMb2NrJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckxvY2snICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkTG9ja3MgPSAkU2VsZi0+X0dldExvY2tzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkxvY2sgc3RhdGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IGxvY2sgb2JqZWN0CiAgICBteSAkTG9ja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2NrJyk7CgogICAgbXkgJExvY2tJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtMb2NrSUR9OwogICAgJFNlbGVjdGVkVmFsdWUgPSAkTG9ja09iamVjdC0+TG9ja0xvb2t1cCggTG9ja0lEID0+ICRMb2NrSURQYXJhbSApCiAgICAgICAgaWYgKCRMb2NrSURQYXJhbSk7CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnTG9jaycgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkTG9ja09iamVjdC0+TG9ja0xvb2t1cCgKICAgICAgICAgICAgICAgIExvY2sgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoCiAgICAgICAgICAgIExvY2tJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJwogICAgICAgICAgICApCiAgICAgICAgICAgIGlmICEkU2VsZWN0ZWRWYWx1ZTsKICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtMb2NrfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydMb2NrSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtMb2NrfTsKICAgIH0KCiAgICAjIGJ1aWxkIGxvY2sgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJExvY2tzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0xvY2tJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpMb2NrJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6TG9jazpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkxvY2s6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Mb2NrJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJQcmlvcml0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUHJpb3JpdHknICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyUHJpb3JpdHknICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJQcmlvcml0eSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHByaW9yaXR5IG9iamVjdAogICAgbXkgJFByaW9yaXR5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5Jyk7CgogICAgbXkgJFByaW9yaXR5SURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UHJpb3JpdHlJRH07CiAgICBpZiAoJFByaW9yaXR5SURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdHlJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUHJpb3JpdHknICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUHJpb3JpdHlPYmplY3QtPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH17UHJpb3JpdHl9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn17J1ByaW9yaXR5SUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtQcmlvcml0eX07CiAgICB9CgogICAgIyBidWlsZCBuZXh0IFByaW9yaXRpZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpQcmlvcml0eScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlByaW9yaXR5OkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6UHJpb3JpdHk6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Qcmlvcml0eScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUXVldWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclF1ZXVlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclF1ZXVlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFF1ZXVlcyA9ICRTZWxmLT5fR2V0UXVldWVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRvIHF1ZXVlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBxdWV1ZSBvYmplY3QKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgaWYgd2UgZ290IFF1ZXVlSUQgYXMgUGFyYW0gZnJvbSB0aGUgR1VJCiAgICBteSAkUXVldWVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtRdWV1ZUlEfTsKICAgIGlmICgkUXVldWVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdRdWV1ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtRdWV1ZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfXsnUXVldWVJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9e1F1ZXVlfTsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgcXVldWVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRRdWV1ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAkVHJlZVZpZXcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgRm9ybVVwZGF0ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFRyZWVWaWV3ICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0xheW91dEJsb2NrfSB8fCAncnc6UXVldWUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpRdWV1ZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlF1ZXVlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUXVldWUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclN0YXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJTdGF0ZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTdGF0ZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRTdGF0ZXMgPSAkU2VsZi0+X0dldFN0YXRlcyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBzdGF0ZSBvYmplY3QKICAgIG15ICRTdGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpOwoKICAgIG15ICRTdGF0ZUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1N0YXRlSUR9OwogICAgaWYgKCRTdGF0ZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVMb29rdXAoIFN0YXRlSUQgPT4gJFN0YXRlSURQYXJhbSApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1N0YXRlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBTdGF0ZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9e1N0YXRlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydTdGF0ZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpTdGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlN0YXRlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U3RhdGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TdGF0ZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJUeXBlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFR5cGVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUeXBlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCB0eXBlIG9iamVjdAogICAgbXkgJFR5cGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwoKICAgIG15ICRUeXBlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17VHlwZUlEfTsKICAgIGlmICgkVHlwZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRUeXBlT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlSUQgPT4gJFR5cGVJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnVHlwZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fXtUeXBlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9eydUeXBlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfXtUeXBlfTsKICAgIH0KCiAgICAjIGJ1aWxkIFNlcnZpY2Ugc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFR5cGVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplIEZvcm1VcGRhdGUgJFNlcnZlckVycm9yIiwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfXtMYXlvdXRCbG9ja30gfHwgJ3J3OlR5cGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH17TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6VHlwZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1R5cGUnICksCiAgICB9Owp9CgpzdWIgX1N0b3JlQWN0aXZpdHlEaWFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19e1RpY2tldElEfTsKICAgIG15ICRQcm9jZXNzU3RhcnRwb2ludDsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAkUHJvY2Vzc0VudGl0eUlEOwogICAgbXkgJEFjdGl2aXR5RW50aXR5SUQ7CiAgICBteSAlRXJyb3I7CiAgICBteSAlRXJyb3JNZXNzYWdlczsKCiAgICBteSAlVGlja2V0UGFyYW07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBtaXNzaW5nIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYWN0aXZpdHkgZGlhbG9nIG9iamVjdAogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nICAgICAgID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZ2V0IENvbmZpZyBmb3IgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBjaGVjayBlYWNoIEZpZWxkIG9mIGFuIEFjdGl2aXR5IERpYWxvZyBhbmQgZmlsbCB0aGUgZXJyb3IgaGFzaCBpZiBzb21ldGhpbmcgZ29lcyBob3JyaWJseSB3cm9uZwogICAgbXkgJUNoZWNrZWRGaWVsZHM7CiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMgc2VwYXJhdGVseQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXM7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnCiAgICAgICAgICAgIHx8ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eydDdXN0b21lcklEJ30gfTsKCiAgICAgICAgICAgICMgaXMgbm90IHBvc3NpYmxlIHRvIGEgaGF2ZSBhbiBpbnZpc2libGUgZmllbGQgZm9yIHRoaXMgcGFydGljdWxhciB2YWx1ZQogICAgICAgICAgICAjIG9uIGFnZW50IGludGVyZmFjZQogICAgICAgICAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGlzcGxheX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkblwndCB1c2UgQ3VzdG9tZXJJRCBhcyBhbiBpbnZpc2libGUgZmllbGQuJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDdXN0b21lcklEIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5IGFzIGluIG90aGVyIHNjcmVlbnMKICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFte0dldFBhcmFtfXtDdXN0b21lcklEfSB8fCAnJzsKCiAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSBUaWNrZXRDcmVhdGUgbmVlZHMgJ0N1c3RvbWVyVXNlcicgYXMgcGFyYW0gaW5zdGVhZCBvZiAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKCiAgICAgICAgICAgICMgZmFsbC1iYWNrLCBpZiBjdXN0b21lciBhdXRvLWNvbXBsZXRlIGRvZXMgbm90IHNob3duIGFueSByZXN1bHRzLCB0aGVuIHRyeSB0byB1c2UKICAgICAgICAgICAgIyB0aGUgY29udGVudCBvZiB0aGUgb3JpZ2luYWwgZmllbGQgYXMgY3VzdG9tZXIgdXNlciBpZAogICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJVc2VySUQgKSB7CgogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyQXV0b0NvbXBsZXRlJyApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lclVzZXJJRCkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydDdXN0b21lclVzZXJJRCd9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRDdXN0b21lclVzZXJJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKCiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBWYWx1ZXMgb3RoZXJ3aXNlIHRha2UgYW4gZW1wdHkgc3RyaW5nCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX17UGVuZGluZ1RpbWV9e1llYXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX17UGVuZGluZ1RpbWV9e01vbnRofQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17R2V0UGFyYW19e1BlbmRpbmdUaW1lfXtEYXl9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX17UGVuZGluZ1RpbWV9e0hvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX17UGVuZGluZ1RpbWV9e01pbnV0ZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFBhcmFte0dldFBhcmFtfXtQZW5kaW5nVGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBubyBQZW5kaW5nIHN0YXR1cyB3ZSBoYXZlIG5vIHRpbWUgdG8gc2V0CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7J1BlbmRpbmdUaW1lJ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNraXAgaWYgd2UndmUgYWxyZWFkeSBjaGVja2VkIElEIG9yIE5hbWUKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X0NoZWNrRmllbGQoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIEFydGljbGUgKFN1YmplY3QgJiBCb2R5KQogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFydGljbGVQYXJ0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtHZXRQYXJhbX17JEFydGljbGVQYXJ0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBmb3IgZWFjaCBwYXJ0IChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICdBcnRpY2xlJyAuICRBcnRpY2xlUGFydCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFsbCBvdGhlciBmaWVsZHMKICAgICAgICAgICAgICAgIGVsc2lmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEaXNwbGF5fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnCiAgICAgICAgICAgICAgICAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0NvbmZpZ317VGltZVVuaXRzfQogICAgICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtDb25maWd9e1RpbWVVbml0c30gPT0gMgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX17VGltZVVuaXRzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgZXJyb3IgZm9yIHRoZSB0aW1lLXVuaXRzIChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHMnfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2lmICgkUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAkUmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBza2lwIHZhbGlkYXRpb24gb2YgaGlkZGVuIGZpZWxkcwogICAgbXkgJVZpc2liaWxpdHk7CgogICAgIyB0cmFuc2Zvcm0gZHluYW1pYyBmaWVsZCBkYXRhIGludG8gREZOYW1lID0+IERGTmFtZSBwYWlyCiAgICBteSAlRHluYW1pY0ZpZWxkQWNsID0gbWFwIHsgJF8gPT4gJF8gfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGNhbGwgdGlja2V0IEFDTHMgZm9yIER5bmFtaWNGaWVsZHMgdG8gY2hlY2sgZmllbGQgdmlzaWJpbGl0eQogICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT4lKiwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdGb3JtJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQWNsLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICgkQUNMUmVzdWx0KSB7CiAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAwIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRmllbGQgfSA9IDE7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAxIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgfQoKICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgIyBHZXQgdGhlIENvbmZpZyBvZiB0aGUgY3VycmVudCBEeW5hbWljRmllbGQgKHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBncmVwIHJlc3VsdCBhcnJheSkKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBXaWxsIGJlIGV4dGVuZGVkIGxhdGVyIG9uIGZvciBBQ0wgQ2hlY2tpbmc6CiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwoKICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT4lKiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBvc3NpYmxlVmFsdWVzRmlsdGVyID0gJFBvc3NpYmxlVmFsdWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICMgaWYgd2UgaGF2ZSBhbiBpbnZpc2libGUgZmllbGQsIHVzZSBjb25maWcncyBkZWZhdWx0IHZhbHVlCiAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9ICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH17RGlzcGxheX0gPT0gMCApCiAgICAgICAgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgbGVuZ3RoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH17RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lIH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBza2lwIGZpZWxkcyB3aGljaCBhcmUgaGlkZGVuIGJ5IEFDTHMKICAgICAgICBlbHNpZiAoICEkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IHZhbGlkYXRlIHZpc2libGUgZmllbGRzCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRNYW5kYXRvcnkgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9CiAgICAgICAgICAgICAgICA/ICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWUgfXtEaXNwbGF5fSA9PSAyICkKICAgICAgICAgICAgICAgIDogJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX07CgogICAgICAgICAgICAjIENoZWNrIER5bmFtaWNGaWVsZCBWYWx1ZXMKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkTWFuZGF0b3J5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgPSAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX07CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRpY2tldFBhcmFteyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9ID0KICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgcHJvY2VzcyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgIEFjdGl2aXR5T2JqZWN0ICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpLAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ09iamVjdCAgID0+ICRBY3Rpdml0eURpYWxvZ09iamVjdCwKICAgICAgICAgICAgVHJhbnNpdGlvbk9iamVjdCAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb24nKSwKICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbk9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb24nKSwKICAgICAgICB9CiAgICApOwogICAgbXkgJFByb2Nlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKCiAgICBteSBATm90aWZ5OwoKICAgIG15ICROZXdUaWNrZXRJRDsKICAgIG15ICROZXdPd25lcklEOwogICAgaWYgKCAhJFRpY2tldElEICkgewoKICAgICAgICAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFte0dldFBhcmFtfXtQcm9jZXNzRW50aXR5SUR9OwogICAgICAgIGlmICggISRQcm9jZXNzRW50aXR5SUQgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTWlzc2luZyBQcm9jZXNzRW50aXR5SUQsIGNoZWNrIHlvdXIgQWN0aXZpdHlEaWFsb2dIZWFkZXIudHQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc1N0YXJ0cG9pbnQgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUHJvY2Vzc1N0YXJ0cG9pbnQKICAgICAgICAgICAgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzU3RhcnRwb2ludCkKICAgICAgICAgICAgfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTm8gU3RhcnRBY3Rpdml0eURpYWxvZyBvciBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciBQcm9jZXNzICIlcyIgY29uZmlndXJlZCEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHl9OwoKICAgICAgICBORUVERURMT09QOgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5KSkgewoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskTmVlZGVkfSB9ICkgewoKICAgICAgICAgICAgICAgICMgaWYgYSByZXF1aXJlZCBmaWVsZCBoYXMgbm8gdmFsdWUgY2FsbCBfQ2hlY2tGaWVsZCBhcyBmaWxlZCBpcyBoaWRkZW4KICAgICAgICAgICAgICAgICMgKE5vIERpc3BsYXkgcGFyYW0gPSBEaXNwbGF5ID0+IDApIGFuZCBubyBEZWZhdWx0VmFsdWUsIHRvIHVzZSBnbG9iYWwgZGVmYXVsdCBhcwogICAgICAgICAgICAgICAgIyBmYWxsLWJhY2suIE9uZSByZWFzb24gZm9yIHRoaXMgdG8gaGFwcGVuIGlzIHRoYXQgQWN0aXZpdHlEaWFsb2cgRGVmYXVsdFZhbHVlIHRyaWVkCiAgICAgICAgICAgICAgICAjIHRvIHNldCBiZWZvcmUsIHdhcyBub3QgdmFsaWQuCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9DaGVja0ZpZWxkKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRTZWxmLT57TmFtZVRvSUR9eyROZWVkZWR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFNlbGYtPntOYW1lVG9JRH17JE5lZWRlZH0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyROZWVkZWR9IH0gPSAkUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhZCBubyBFcnJvcnMsIHdlIGNhbiBjcmVhdGUgdGhlIFRpY2tldCBhbmQgU2V0IEFjdGl2aXR5RW50aXR5SUQgYXMgd2VsbCBhcwogICAgICAgICMgUHJvY2Vzc0VudGl0eUlECiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAgICAgaWYgKCAkVGlja2V0UGFyYW17T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkTmV3T3duZXJJRCA9ICRUaWNrZXRQYXJhbXtPd25lcklEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTZXQgT3duZXJJRCB0byAxIG9uIFRpY2tldENyZWF0ZS4gVGhpcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgb24sIHNvIGV2ZW50cyBjYW4gYmUgdHJpZ2dlcmVkLgogICAgICAgICAgICAkVGlja2V0UGFyYW17T3duZXJJRH0gPSAxOwoKICAgICAgICAgICAgIyBpZiBTdGFydEFjdGl2aXR5RGlhbG9nIGRvZXMgbm90IHByb3ZpZGUgYSB0aWNrZXQgdGl0bGUgc2V0IGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoICEkVGlja2V0UGFyYW17VGl0bGV9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHNlcnZlciBUaW1lLXN0YW1wCiAgICAgICAgICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRUaW1lU3RhbXAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBteSAkT1RPQk9UaW1lWm9uZSAgICA9ICREYXRlVGltZU9iamVjdC0+T1RPQk9UaW1lWm9uZUdldCgpOwogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte1RpdGxlfSA9ICIkUGFyYW17UHJvY2Vzc05hbWV9IC0gJEN1cnJlbnRUaW1lU3RhbXAgKCRPVE9CT1RpbWVab25lKSI7CgogICAgICAgICAgICAgICAgIyB1c2UgYXJ0aWNsZSBzdWJqZWN0IGZyb20gdGhlIHdlYiByZXF1ZXN0IGlmIGFueQogICAgICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte1RpdGxlfSA9ICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IHRpY2tldAogICAgICAgICAgICAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoJVRpY2tldFBhcmFtKTsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgY3JlYXRlIHRpY2tldCBmb3IgUHJvY2VzcyB3aXRoIFByb2Nlc3NFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0UHJvY2Vzc1NldCgKICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IFByb2Nlc3NFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSB1bmRlZjsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgKICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IEFjdGl2aXR5RW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzdG9yZSBBY3Rpdml0eURpYWxvZywgaW52YWxpZCBUaWNrZXRJRDogJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBuZXcgY3JlYXRlZCBUaWNrZXRJRAogICAgICAgICAgICAkTmV3VGlja2V0SUQgPSAkVGlja2V0SUQ7CiAgICAgICAgfQogICAgfQoKICAgIGVsc2lmICggJFRpY2tldElEICYmICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKCiAgICAgICAgIyB1c2UgRXJyb3IgaW5zdGVhZCBvZiBGYXRhbEVycm9yIGFzIHdlIGFyZSBpbiBhIFBvcC11cCB3aW5kb3cKICAgICAgICAjIEdldCBUaWNrZXQgdG8gY2hlY2sgVGlja2V0SUQgd2FzIHZhbGlkCiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdJbnZhbGlkIFRpY2tldElEOiAlcyEnLCAkVGlja2V0SUQgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NUaWNrZXRQcm9jZXNzU2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBQcm9jZXNzRW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTdWNjZXNzID0gdW5kZWY7CgogICAgICAgICRQcm9jZXNzU3RhcnRwb2ludCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQcm9jZXNzU3RhcnRwb2ludAogICAgICAgICAgICB8fCAhSXNIYXNoUmVmV2l0aERhdGEoJFByb2Nlc3NTdGFydHBvaW50KQogICAgICAgICAgICB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHl9IHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTm8gU3RhcnRBY3Rpdml0eURpYWxvZyBvciBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciBQcm9jZXNzICIlcyIgY29uZmlndXJlZCEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTdWNjZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBBY3Rpdml0eUVudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVzZSBQcm9jZXNzRW50aXR5SUQgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH07CiAgICB9CgogICAgIyBJZiB3ZSBoYWQgYSBUaWNrZXRJRCwgZ2V0IHRoZSBUaWNrZXQKICAgIGVsc2UgewoKICAgICAgICAjIEdldCBUaWNrZXQgdG8gY2hlY2sgVGlja2V0SUQgd2FzIHZhbGlkCiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHN0b3JlIEFjdGl2aXR5RGlhbG9nLCBpbnZhbGlkIFRpY2tldElEOiAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEJykKICAgICAgICB9OwogICAgICAgIGlmICggISRBY3Rpdml0eUVudGl0eUlEICkKICAgICAgICB7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93RGlhbG9nRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTWlzc2luZyBBY3Rpdml0eUVudGl0eUlEIGluIFRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBhY3Rpdml0eSBkaWFsb2cgdG8gc2F2ZSBpcyBzdGlsbCB0aGUgY29ycmVjdCBhY3Rpdml0eQogICAgICAgIG15ICRBY3Rpdml0eSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKS0+QWN0aXZpdHlHZXQoCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJEFjdGl2aXR5RW50aXR5SUQsCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gWydBZ2VudEludGVyZmFjZSddLAogICAgICAgICk7CiAgICAgICAgbXkgJUFjdGl2aXR5RGlhbG9ncyA9IHJldmVyc2UgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9IC8vIHt9IH07CiAgICAgICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nc3skQWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gKSB7CgogICAgICAgICAgICBteSAkVGlja2V0SG9vayAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpOwogICAgICAgICAgICBteSAkVGlja2V0SG9va0RpdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKTsKCiAgICAgICAgICAgICRFcnJvcntXcm9uZ0FjdGl2aXR5fSA9IDE7CiAgICAgICAgICAgIHB1c2ggQE5vdGlmeSwgewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGhpcyBzdGVwIGRvZXMgbm90IGJlbG9uZyBhbnltb3JlIHRvIHRoZSBjdXJyZW50IGFjdGl2aXR5IGluIHByb2Nlc3MgZm9yIHRpY2tldCBcJyVzJXMlc1wnISBBbm90aGVyIHVzZXIgY2hhbmdlZCB0aGlzIHRpY2tldCBpbiB0aGUgbWVhbnRpbWUuIFBsZWFzZSBjbG9zZSB0aGlzIHdpbmRvdyBhbmQgcmVsb2FkIHRoZSB0aWNrZXQuJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SG9vaywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SG9va0RpdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkVGlja2V0ewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcpCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAhJFByb2Nlc3NFbnRpdHlJRCApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93RGlhbG9nRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnTWlzc2luZyBQcm9jZXNzRW50aXR5SUQgaW4gVGlja2V0ICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIHdlIGdvdCBlcnJvcnMgZ28gYmFjayB0byBkaXNwbGF5aW5nIHRoZSBBY3Rpdml0eURpYWxvZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVFcnJvciApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X091dHB1dEFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgICAgICAgID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgPT4gJFRpY2tldElEIHx8IHVuZGVmLAogICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZXMgICAgICAgICAgPT4gXCVFcnJvck1lc3NhZ2VzLAogICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICAgID0+IFwlVmlzaWJpbGl0eSwKICAgICAgICAgICAgREZFcnJvcnMgICAgICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQsCiAgICAgICAgICAgIERGUG9zc2libGVWYWx1ZXMgICAgICAgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICBOb3RpZnkgICAgICAgICAgICAgICAgID0+IFxATm90aWZ5LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB3ZSBkZWFsIHdpdGggYSBUaWNrZXQgVXBkYXRlCiAgICBteSAkVXBkYXRlVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19e1RpY2tldElEfTsKCiAgICAjIFdlIHNhdmUgb25seSBvbmNlLCBubyBtYXR0ZXIgaWYgb25lIG9yIG1vcmUgY29uZmlndXJhdGlvbnMgYXJlIHNldCBmb3IgdGhlIHNhbWUgcGFyYW0KICAgIG15ICVTdG9yZWRGaWVsZHM7CgogICAgIyBTYXZlIGxvb3AgZm9yIHN0b3JpbmcgVGlja2V0IFZhbHVlcyB0aGF0IHdlcmUgbm90IHJlcXVpcmVkIG9uIHRoZSBpbml0aWFsIFRpY2tldENyZWF0ZQogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBkYXRhIGZvciBGaWVsZCAiJXMiIG9mIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXM7CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewoKICAgICAgICAgICAgIyBUaGlzIFZhbHVlIGlzIGp1c3Qgc2V0IGlmIFN0YXR1cyB3YXMgb24gYSBQZW5kaW5nIHN0YXRlCiAgICAgICAgICAgICMgc28gaXQgaGFzIHRvIGJlIHBvc3NpYmxlIHRvIHN0b3JlIHRoZSB0aWNrZXQgaWYgdGhpcyBvbmUncyBlbXB0eQogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkVGlja2V0UGFyYW17J1BlbmRpbmdUaW1lJ30gKSApIHsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAleyAkVGlja2V0UGFyYW17J1BlbmRpbmdUaW1lJ30gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc2V0IFBlbmRpbmdUaW1lIGZvciBUaWNrZXQgd2l0aCBJRCAiJXMiIGluIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgJiYgKCAkVXBkYXRlVGlja2V0SUQgfHwgJE5ld1RpY2tldElEICkgKSB7CgogICAgICAgICAgICBteSAkVGlja2V0SUQgPSAkVXBkYXRlVGlja2V0SUQgfHwgJE5ld1RpY2tldElEOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9ICYmICRQYXJhbXtHZXRQYXJhbX17Qm9keX0gKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgbm90ZQogICAgICAgICAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJE1pbWVUeXBlICA9ICd0ZXh0L3BsYWluJzsKCiAgICAgICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwLCBkZWxldGVkIG5vdCB1c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cy4KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEBBdHRhY2htZW50cyA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19e0JvZHl9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJENvbW11bmljYXRpb25DaGFubmVsID0gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtBcnRpY2xlfXtDb25maWd9e0NvbW11bmljYXRpb25DaGFubmVsfQogICAgICAgICAgICAgICAgICAgIC8vICdJbnRlcm5hbCc7CgogICAgICAgICAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQ2hhbm5lbCgKICAgICAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSA9PiAkQ29tbXVuaWNhdGlvbkNoYW5uZWwsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ2hhbmdlIGhpc3RvcnkgdHlwZSBhbmQgY29tbWVudCBhY2NvcmRpbmdseSB0byB0aGUgcHJvY2VzcyBhcnRpY2xlLgogICAgICAgICAgICAgICAgbXkgJEhpc3RvcnlUeXBlICAgID0gJ0FkZE5vdGUnOwogICAgICAgICAgICAgICAgbXkgJEhpc3RvcnlDb21tZW50ID0gJyUlTm90ZSc7CiAgICAgICAgICAgICAgICBpZiAoICRDb21tdW5pY2F0aW9uQ2hhbm5lbCBlcSAnUGhvbmUnICkgewogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5VHlwZSAgICA9ICdQaG9uZUNhbGxBZ2VudCc7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlDb21tZW50ID0gJyUlJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkRnJvbSA9ICJcIiRTZWxmLT57VXNlckZ1bGxuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXtBcnRpY2xlfXtDb25maWd9e0lzVmlzaWJsZUZvckN1c3RvbWVyfSAvLyAwLAogICAgICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgPT4gJEhpc3RvcnlUeXBlLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgPT4gJEhpc3RvcnlDb21tZW50LAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtCb2R5fSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e0FydGljbGV9e0NvbmZpZ317SW5mb3JtQWdlbnRzfQogICAgICAgICAgICAgICAgICAgID8gJFBhcmFte0dldFBhcmFtfXtJbmZvcm1Vc2VySUR9CiAgICAgICAgICAgICAgICAgICAgOiBbXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0dldFBhcmFtfXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRQYXJhbXtHZXRQYXJhbX17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhdmUgdG8gVXBkYXRlIGEgdGlja2V0LCB1cGRhdGUgdGhlIHRyYW5zbWl0dGVkIHZhbHVlcwogICAgICAgIGVsc2lmICgkVXBkYXRlVGlja2V0SUQpIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgICAgICBpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdUaXRsZScgKSB7CgogICAgICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aXRsZSwgbm90aGluZyBpcyBuZWVkZWQgdG8gYmUgZG9uZQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfQogICAgICAgICAgICAgICAgICAgIHx8ICggZGVmaW5lZCAkVGlja2V0UGFyYW17J1RpdGxlJ30gJiYgJFRpY2tldFBhcmFteydUaXRsZSd9IGVxICcnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNldCB0aGUgdGlja2V0IHRpdGxlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkVGlja2V0UGFyYW17J1RpdGxlJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lcklEJwogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEaXNwbGF5fSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dyb25nIEFjdGl2aXR5RGlhbG9nIEZpZWxkIGNvbmZpZzogJXMgY2FuXCd0IGJlIERpc3BsYXkgPT4gMSAvIFNob3cgZmllbGQgKFBsZWFzZSBjaGFuZ2UgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYmUgRGlzcGxheSA9PiAwIC8gRG8gbm90IHNob3cgZmllbGQgb3IgRGlzcGxheSA9PiAyIC8gU2hvdyBmaWVsZCBhcyBtYW5kYXRvcnkpIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBza2lwIFRpY2tldEN1c3RvbWVyU2V0KCkgaWYgdGhlcmUgaXMgbm8gY2hhbmdlIGluIHRoZSBjdXN0b21lcgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7Q3VzdG9tZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgYWRkaXRpb25hbCBzdG9yZXMKICAgICAgICAgICAgICAgICAgICAjIG9uIEN1c3RvbWVyLCBDdXN0b21lck5vLCBDdXN0b21lcklEIG9yIEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eydDdXN0b21lclVzZXJJRCd9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclNldCgKICAgICAgICAgICAgICAgICAgICBObyA9PiAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0sCgogICAgICAgICAgICAgICAgICAgICMgaGVyZSB0b286IHVuZm9ydHVuYXRlbHkgVGlja2V0Q3JlYXRlIHRha2VzIFBhcmFtICdDdXN0b21lclVzZXInCiAgICAgICAgICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIEN1c3RvbWVyVXNlcklELCBzbyBvdXIgVGlja2V0UGFyYW0gaGFzaAogICAgICAgICAgICAgICAgICAgICMgaGFzIHRoZSBDdXN0b21lclVzZXIgS2V5IGluc3RlYWQgb2YgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICAgICAgICAgIFVzZXIgICAgID0+ICRUaWNrZXRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgYWRkaXRpb25hbCBzdG9yZXMKICAgICAgICAgICAgICAgICMgb24gQ3VzdG9tZXIsIEN1c3RvbWVyTm8sIEN1c3RvbWVySUQgb3IgQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgICAgICMgc28gbWFrZSBzdXJlIGJvdGggZmllbGRzIGFyZSBzZXQgdG8gIlN0b3JlZCIgOykKICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH17J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgbXkgJFRpY2tldEZpZWxkU2V0U3ViID0gJEN1cnJlbnRGaWVsZDsKICAgICAgICAgICAgICAgICRUaWNrZXRGaWVsZFNldFN1YiA9fiBze0lEJH17fXhtczsKICAgICAgICAgICAgICAgICRUaWNrZXRGaWVsZFNldFN1YiA9ICdUaWNrZXQnIC4gJFRpY2tldEZpZWxkU2V0U3ViIC4gJ1NldCc7CgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0T2JqZWN0LT5jYW4oJFRpY2tldEZpZWxkU2V0U3ViKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVwZGF0ZUZpZWxkTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgIyBzYWRseSB3ZSBuZWVkIGFuIGV4Y2VwdGlvbiBmb3IgT3duZXIoSUQpIGFuZCBSZXNwb25zaWJsZShJRCksIGJlY2F1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXQqU2V0IHN1YnMgbmVlZCBOZXdVc2VySUQgYXMgcGFyYW0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhciBncmVwIHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJF8gfQogICAgICAgICAgICAgICAgICAgICAgICBxdyggT3duZXJJRCBSZXNwb25zaWJsZUlEICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9ICdOZXdVc2VySUQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB0byBzdG9yZSBpZiB0aGUgZmllbGQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgICAgICAgICAgICAgICAgIG15ICRGaWVsZFVwZGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IFNlcnZpY2UgYW5kIFNMQSBmaWVsZHMgYWNjZXB0cyBlbXB0eSB2YWx1ZXMgaWYgdGhlIGhhc2gga2V5IGlzIG5vdAogICAgICAgICAgICAgICAgICAgICMgZGVmaW5lZCBzZXQgaXQgdG8gZW1wdHkgc28gdGhlIFRpY2tldCpTZXQgZnVuY3Rpb24gY2FsbCB3aWxsIGdldCB0aGUgZW1wdHkKICAgICAgICAgICAgICAgICAgICAjIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAoICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NlcnZpY2VJRCcgfHwgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU0xBSUQnICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgU2VydmljZSBhbiBTTEEgZmllbGRzIGlmIHRoZXkgaGF2ZSBhIGRlZmluZWQgdmFsdWUgKGV2ZW4gZW1wdHkpCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVXBkYXRlRmllbGROYW1lIGVxICdTZXJ2aWNlSUQnIHx8ICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NMQUlEJyApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgYW55IG90aGVyIGZpZWxkIHRoYXQgaXRzIHZhbHVlIGlzIGRlZmluZWQgYW5kIG5vdCBlbXB0eQogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSBuZSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVXBkYXRlRmllbGROYW1lIG5lICdTTEFJRCcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9IG5lICcnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgICAgICAgICAgICAgICAgIGlmICgkRmllbGRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT4kVGlja2V0RmllbGRTZXRTdWIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lID0+ICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSBuZXcgc2VydmljZSBhbmQgbm8gbmV3IFNMQSBpcyB0byBiZSBzZXQsIGNoZWNrIGlmIGN1cnJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgIyBhc3NpZ25lZCBTTEEgaXMgc3RpbGwgdmFsaWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJFRpY2tldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGlja2V0IGRldGFpbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRpY2tldCBhbHJlYWR5IGhhdmUgYW4gU0xBIGFzc2lnbmVkIGdldCB0aGUgbGlzdCBTTEFzIGZvciB0aGUgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRUaWNrZXR7U0xBSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNMQUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgY3VycmVudCBTTEEgaXMgbm90IGluIHRoZSBsaXN0IG9mIFNMQSBmb3IgbmV3IHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBTTEEgZnJvbSB0aWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU0xBTGlzdHsgJFRpY2tldHtTTEFJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgJXMgZm9yIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX07CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICREeW5hbWljRmllbGROYW1lLCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBkb24ndCBzZXQgdmFsdWUgb2YgZHluYW1pYyBmaWVsZCBpZiBpdCBpcyBoaWRkZW4gdmlhIEFDTCAoYW5kIG5vdCB2aWEgYWN0aXZpdHkgZGlhbG9nIGRlZmluaXRpb24pCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9e0Rpc3BsYXl9ICE9IDAKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgRHluYW1pY0ZpZWxkIHZhbHVlIGZvciAlcyBvZiBUaWNrZXQgd2l0aCBJRCAiJXMiIGluIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaW5rIHRpY2tldCBpZCBpZiBnaXZlbgogICAgbXkgJExpbmtUaWNrZXRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdMaW5rVGlja2V0SUQnICkgfHwgJyc7CgogICAgIyBnZXQgc2NyZWVuIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBsaW5rIHRpY2tldHMKICAgIGlmICgKICAgICAgICAkTGlua1RpY2tldElECiAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9CiAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9e0xpbmtUeXBlfQogICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfXtEaXJlY3Rpb259CiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJExpbmtUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkIHJvIHBlcm1pc3Npb24hIiwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU291cmNlS2V5ID0gJExpbmtUaWNrZXRJRDsKICAgICAgICBteSAkVGFyZ2V0S2V5ID0gJFRpY2tldElEOwoKICAgICAgICBpZiAoICRDb25maWctPntTcGxpdExpbmtUeXBlfXtEaXJlY3Rpb259IGVxICdTb3VyY2UnICkgewogICAgICAgICAgICAkU291cmNlS2V5ID0gJFRpY2tldElEOwogICAgICAgICAgICAkVGFyZ2V0S2V5ID0gJExpbmtUaWNrZXRJRDsKICAgICAgICB9CgogICAgICAgICMgbGluayB0aGUgdGlja2V0cwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX17TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICgkTmV3T3duZXJJRCkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICBOZXdVc2VySUQgPT4gJE5ld093bmVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFRyYW5zaXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSB0aWNrZXQgZXZlbnQgbW9kdWxlIChUaWNrZXRQcm9jZXNzVHJhbnNpdGlvbnMucG0pLgoKICAgICMgaWYgd2Ugd2VyZSB1cGRhdGluZyBhIHRpY2tldCwgY2xvc2UgdGhlIHBvcC11cCBhbmQgcmV0dXJuIHRvIHpvb20KICAgICMgZWxzZSAobmV3IHRpY2tldCkganVzdCBnbyB0byB6b29tIHRvIHNob3cgdGhlIG5ldyB0aWNrZXQKICAgIGlmICgkVXBkYXRlVGlja2V0SUQpIHsKCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wLXVwCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVXBkYXRlVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIsCiAgICApOwp9CgpzdWIgX0Rpc3BsYXlQcm9jZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgSWYgd2UgaGF2ZSBhIFByb2Nlc3NFbnRpdHlJRAogICAgJFBhcmFte0Vycm9yc317UHJvY2Vzc0VudGl0eUlESW52YWxpZH0gPSAnIFNlcnZlckVycm9yJwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gJiYgISRQYXJhbXtQcm9jZXNzTGlzdH17ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9IH0gKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRQYXJhbXtQcm9jZXNzTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9e1Byb2Nlc3NFbnRpdHlJREludmFsaWR9IHx8ICcgJyApLAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17UHJvY2Vzc0xpc3R9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvY2Vzc0VudGl0eUlEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgQXV0b0NvbXBsZXRlID0+ICdvZmYnLAogICAgKTsKCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1ByZVNlbGVjdFByb2Nlc3N9ICYmICRQYXJhbXtQcm9jZXNzSUR9ICkgewoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1Byb2Nlc3NJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtQcm9jZXNzSUR9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0xpc3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBvbiBpbml0aWFsIHNjcmVlbiBmcm9tIG5hdmJhciB0aGVyZSBpcyBubyBJc01haW5XaW5vdyBidXQgYWxzbyBubyBJc1Byb2Nlc3NFbnJvbGwsCiAgICAjIHRoZW4gaXQgbXVzdCBiZSBhIE1haW5XaW5kb3cKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgICRTZWxmLT57SXNNYWluV2luZG93fSA9IDE7CiAgICB9CgogICAgbXkgJFR5cGUgPSAkU2VsZi0+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">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ZUdyYXkvQml0c1BlckNvbXBvbmVudAo4L0RlY29kZVBhcm1zPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9ycyAxL0NvbHVtbnMgMTAzNS9QcmVkaWN0b3IgMj4+L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgKMTY1Nz4+CnN0cmVhbQp42u3UIQEAAADCMPqXhhS4LcLFG4BUAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACuQALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAokAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsAIJACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArEACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAK5AAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACiQArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAsAKACsArACwAgkAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsALACwAoAKwCsQALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAsALACgArAKwAOBu6iM5OCmVuZHN0cmVhbQplbmRvYmoKNDcgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU01hc2sgNDYgMCBSL1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDEwMzUvSGVpZ2h0CjcyMS9CaXRzUGVyQ29tcG9uZW50IDgvRGVjb2RlUGFybXM8PC9CaXRzUGVyQ29tcG9uZW50IDgvQ29sb3JzIDMvQ29sdW1ucyAxMDM1L1ByZWRpY3RvcgoxNT4+L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDAzMDc+PgpzdHJlYW0KeNrs3QV41OYfB/DIee/qblChtFihuJbhMIa7jMGGw5ABw50x3J3hQwcDxrAy3F2KtVCj7u1dz5P8c3ctdAwYsKL/7+fpbu1dksu9SXh+38v7JqRGoyMAAAAAAADMKDQBAAAAAAAgIQAAAAAAABICAAAAAAAgIQAAAAAAABICAAAAAAAgIQAAAAAAABICAAAAAAAgIQAAAAAAABICAAAAAAAgIQAAAAAAwHsgQBN8Boxp97cu27f90O3w2CwlIXMu5lu7Wf0+AxpWcaLf7Rsziftm7z+XzVLFao7qH2xPvvkS9Jf7+o3blMkStFOPHWtWNFUULIOLWzas7Kg7ekJYc/bGowNd3m2WZRIW1O819oqx0FMkKRDZurpXqNfg+9FtGxcTfj67C5e1rmXngX8ZXvHPQoVJq88MSezjM2FrDiduNDJqT5N/3bjs4531Kq66ZKCKD1pwe1aZN28v5s7WXzbfMhICn84TmlaQ4LAGAABAQoC3LffSTq3r2G37xUyWKyi648Kv/xp+Y/svh0b9On1CbQX57t6cTTu9cffyJ6younPffm+VEJ7Vh+lbx2/rWbdPVenH0rCcUZcVH31809pTR++tOD65ezGccHun2Kij+5bu0nKSGhVGIyEAAAAgIcDbMkTu7dF5+4UcliAp24DKrZsGuAvzHp07s+9CmjYjfFanqc6nZvXz/yRKW87wcO/oVU3Chnp/yJ1S4N1xcpta1iS/OsrExwc3HzuXaGCSL0xdeKv9gs+laiVlNQZ8v6Qla6nLEw9tnX0ojSHoUp17969uyWekUyV7Sij5etbQ6nqC9iotI3GoAQAAICHAJ4HL3T998ylTPBD4dR13aGkdL0vfDq7H2fHDv1r0WJt9c8Hqu9/OLssemuXT/mgWJ2y0/NfFzvuGTzj4oM64G/MriAgu8/rh2XP+2Hc2NsUgdfMv2fTrDsO+CfYQFbyDMnrXvC2r9t0Jj8vRkBJHb59arVqNHhZaSkEab//WdejBS6mmUxfG8D1dGlxt/fP0UVUEBKe+t3vHzytPngxPU4vsfINDugzu3KeRu+zfP47u8rzV29pP6+7xsoL0pWurPTY/sPWfKaygwuQ1Z0Z60wRza3rfWjOjjaSwwZJt+3vakUTeri4de+zTEJKKS+7O+tb1JW9BO9bs3Py7glf7N7Gu3nDHAyObcjH8EVOhxNGXNSPB5TzeuXD7mn0378QqjRJb3/IV2vbpPLCFd6EzOGzapYOz5x/880Jcooqw8far267t2GF1SloVvK5JOrx886JtV2/EqCgH19K1vhgwok2rIKun3a6ybhyZNefAH+di4nMYib1L6Zo1eg7r3DVEkZ//OM39303NfupOcqZOYOPhXa1R4yEjv6zl+s9jXBzYpFlgwVrdSTkw51AaQVCetRt928Pm2frqwjf9uNDSy6hlQy+J5YW8+P1Lf12+69qtmFyd2C6gavVvRnTvXcPuRb3ZjA9WjKk36jrfXIG9p4XNr+xIEoakW2tmbd906H5kBmvjWaxai69++L5hRdMLt6a1XLPrjt40n/7OjC+HHOz+w4be3jSOcQAAACQEeLOAkHnh14O5LF/cOX/x8+zaXk+7fpPymsO/7nF+80UtIVClZ3KE7dMq9PLGdtsPhmtJ15qcqYfSkcWNuv7xQGPpoKSNunFx2c2r+/4avH9T8yAxX+PFLe84bNQpJZs/tyrp4Z1ds+4ev6O9sKOJqzLl5tXYFMZcZvK/X9GWz+F/VV+YPrL17Ac5+fMk3zl+cOzJ84cnT985PMj65V9Fk1YuxWRpMWmXpk671HxFNbsXTPnKta0SUkN+8Pdc5uHVCCXnbUvk3bmRaFo1jgm/EW3oaScyxFy9o+PnFJYJqeP0ul+JS4L8AgTkAyPHqvJU7LPn/96MBJd6cWjTqWse6PI7emnTwk8eDT99dv+w6QenBNua3o1L2ju3Ya+jjwsmSY0M3znzXtiZ3of3dyjHN7UuelmHET+eyGYsr8fHnt2+4fzB84N/nTmznmkB6ssbmjX/9WZe/uz6lCcX9uy4eOhy+J5FP9fhU4Tx/ooJ9X+8kZW/kob0qIcHVkYcOfRg0/FRrVyL6BSAJmJe61ETzxXsD5rUW0f2DT9x9daWRcu/tHtuY2WfXtt9PL8+lFOjAdtnmeIBE/tXryazd8cZLZ9BHXnv93n3D/1x85d9I9q4KB9dexCp4iw70+Nr9wV1NRyOcAAAACQEeFOGm3evafk6irT5ok49m79VgaRDrYUnaj39U5f/f+OFLYcpW6+atT2LB1lTqmtThxx4oDF9pbx0Zfd6zjnnFi8csCoi/s/lA1YGHxviZTi9e94ZJUsKfFv3mTuonKsxYdek+Ysu5GUcO7I/vvHAmgMfZtT6oewI8ziE/jePtvOhCMONTYPnPczhKO+WA9ZOq11cE7Fu5NzZp7NPT5s9u/bq6VWEL08IIT+Oyxo77GLC9tVze1aYUVX0/BSvXtvvy35RUbj3hF538/4dY4PaRPT1cIOl3sy4HRnHhPimProZz1e2tE+d8j6v/dW07mFUpLmgpZ0dnZ/N9fdm5JR/jpu/lo8HpNCnxdfT+5azSbq8aPz2Y0nqm4vmTm+4dm5tMZd7YcLwMD4eUM4Vhk3v2Nyfu7Fy2ehd8VnnNk/aUX/P1/ZRaxdP4uMBaVtv/Oh53YuTESfH91v9Z3zE0n5rQ6/+0NQ67+Di32/lcaSsRP8VQ74LlmTfPDJ2yO6LOTGrfw4bVKuVl+H2ivm3svhNVaLBkmUdazjoIn7fMOinKymxf81Y2675eL+iOM7ZBysWTz/P7w+iwA7fTulZ2j757JThO89mJmwes6NHw35VCk3KPDk+oNfucC0hLdN207qvSppOsmT/NnbpnjgjoQj8fuWwQVVkT45u6j/sWERE2KAfylff0WhjyqE237TqbB6HsC5mWmcFjm8AAAAkBHhzmtRM0xkEgvL0dRG93ixUyTYHjvatbf5aO++Pn3bzRTOpaDlhYLfKMoJwbT+j34WDI1bE6a7tOhM5qLMz5d7862ZG2qHJyDZNvfhZvDWV7ZZcyGPZnLRMlnhBHxDjle3HHxg4UlJh5LxWtd34WRzHzW19qOaGW4b433Y/nFTlFZe4oTw79/7h1xsTLsetHLu3+5EOz/VKyjtx9JVr26l2XR/BiYeGlIhrcWxNKvJmKku7urhlpiY8jLijITzvPAg38m9iW/sL31ft9Ez6hZ2HhHzc4ozKpMcHNx5+wM9FCgLrh3hTBPOiZuQyjm7YxzcHKSzTedvGLsGmT1immntepeZ7Y4zJ2zffmFq7mjHs2B+ppkkqDR02pasH33DVgnSXjk3dkak5c+SOqqvv7m338jhCWK71nJGVA/mXPdotGnn52NDr2sSzO08NbNos50m86ewDJVK4uDkW83cKKtFzgV68+yFD2bowHMGp0+L5VeBX1NrO3c3Fz1cWMGqAgQy7riZEJYuoq44xetf2CD6QUs71flrcrqmcf6rk4ujrVadEGGKvhj1gqhR0l+LUEXO/Wb83iaNdayzY9l1d8/kgLvXcr0eULEEV695nait/MUF4ffP95BMXu/6mzD7+16G0hr1ccEADAAAgIcB/xnGWjhgkRVOv14+ELtOhWQ1by7TM41tRStMZCMO5mT+GLrJMYEjNNleDEY/v68nAuh0X12WyIsJPHts5+W7M3Zvhpy8nGV+xeDbr9p10vowm2Zjlnb/fbHkfNjfOVFmzyeFR6VwZt1esqLB4/59abG7628PL28Zvqzvn75X7v60t1bxOsDf98LEx5vJNrUYYcd9AKmo07fh4y7y7Udcf6v2vP+bTFGldtl6lV4YpY9y2MfO2/e0pUhLQfEZ/H/5QYV7QjITx7oObpjM5guCO9Z8GIKvqDVoV37/wMZtzi1+lyvpb0WrTJG6htV3zC3brWqsf7FvEcCQtlmvP3nxoajbmSVjfBpcs4wq43CRT+uM098OTma/cy5Wzo6+kMdnXJzXuMsvVr06jKo0bV/tuVFAxuXk1FL7lfAWH7xu113a2LPe7U2DZBo2rNmnc+IeanrZF1ZdfHX07yhRCxFVDasrzg1LQ8IXx/Y0cQYqkNBGbv1cmbV3zs07PRwnrKnWa+uT/C2N48CjclHHI7IMrG13Nf1KTYBp4wBli7/AfHwkBAAAACQH+O5mTnZwitCybGJduJJ7rO8MZ9QzDcSRJCUVPXyEdnawLLmzEqZRacyd6bUL4vYTnsocxL9vUKTxmXb/Jo3bHm3u/k5TU1sdDropTsi+NLBql0rxIfeb9K5nPx4ccVQ5LuL2yYJVV6zK9/YlOW9MPT99Qv3vhjuj/vrbCsiG1HX57nKq9eTXyruSRihNUqRpaXfY7dTvp5q2kkjfiGb66rVyhxmt3XyEpgZWTe6WmzcdNbF3rbwMjCjcjn4BU5hYhnZ1tnn042tbNmSYes1yuKofjDDl55pM9Ni4OT+cjRVYyS1jh0tQq8/gDNjP+6uXnmy07m59XXG/SuOm5S+fve5ymZ9VJkYc38j9bR9j6dJ07aXFnT7HAf/gv36cO27T9coaGM6Tdv76N/1m0Su5Xa8rGUQPKF8EVZPmPmWtaSUrhaPPsmk4CsbVCnD9BwdbQa/X5a35w89wLtWfXME3AKfPMowzYnJiIyzHPLTovKweDDgAAAJAQoCgIg0uFiA8f1bCZJy9e1FQOLVQHclnHuwbO3M/XzcHfXDjT3b9Qdfv0F4W11PSHMGDyxWU/Bv7ziqjso8ULf9gdryVlFXr1ndq7atUgh5Sl34eMu//ShEDKrM2DkWnvNkduD6z5FjcZI62bTezR4OCCIwl/zVgrK3S+4l/Xlhf0RQ3Jxr3qhKvXDkuTGNohpIJbeaGPYMvtO5f/KnbHwBF0mS/K/8soZXHI4nuze//70F6y0JrJ5SSRy3HpabkMoaALCvuUdHNukMsUJKGzMl8KiFVlmEZwWybhGANjZDk+h4isrBQCfiJC0WFy3PpaL76mqkPZoRtWDcx6cu7IuT/+OHfg2IMnKpbJjto8fGXt+tO6OZPWwV8uP97055h7YQfO7T9wPuxiQpaBVT06M3Z4UKOwDv7/+UwCaSU1X1aJU2WpDASRfyKGZfQG/jOQtEDwLPoInFoMColcdvSeIWHdpD96H25Xgja1Et8OSk7YYKnl0lL/ZMARDQAAgIQA/7loc6reqYH82B9KJu7QmJlfHJxSJr/nC6c+P29HmOmbf8qtelm/F1eHtG85HwUZlcUk34/QEoHmbv+c8urOo+dSWMomoF33EtcvROo4gpRUHPZT8wZyU3F4/FYS84oVomzLlHagTyazaXEP0rmalh5F6ui966/FMoQ4qGbvhm7/WqlSXo1mDDt4evL9jDTlm6xtsBtlVatuSdG+G/qbhzeKjYTEv1IZoTNdwoO+GRd25M80lhB4hNZxK/ILaApLBZSTkIlq5uau4/cHdrd0NFKf/+v3KFPHIUWZEn4C2lC2mIRMyGPiT5xMHlfONA6ByD33XZkp2zM4RdsJUet9ggPoPTeM2ojYaKZWkHkVjVGX1x6I1RF08QZftnB+tHXbvXSOdKzSoEunTnU7dZqrTto+cFjvnWmMOv5BHKtKPrP+JP8JpWVbf9l2UJm2g/rqki6PaT5+xQPGEBn7mCGKICEoipcqRh+KYLSXrp5R1m1iOhXDPpg3qMrkCIPAb/y5lWPyAyrl1PH71dNKHX1yqcfu7LyL26fubbCpra0w0K+0mEzUMI/uxxsIO3PA4BJPH9p9M4+l7Gt1q1fRttCb4YwCAAAAEgK8bdVm12ZC5zUn11xQ6m7MH1n1Sv3OjX0djFl3T/y181SKhi/urct937+c5Nm1jP7Gqm79Fq4nNiYpfx87r7Jtz7YliXvbV/adeDGeofwHzv2WoiUSfvfQcbrwzSsu+jZUJBzfOXpv/lVM80dAEDRtLj2Z5ITITK2braRy+7r+q3Y81F6f1u9Xj5lNQmTJf0ybO2LHEy3p0GlLo76vt0+W7t/3u19/WBrBcG+wtqbmcKkdUkpw44Y6I1FNCCsGlpfz5XsJvnyPTk5P5ktX1+AvyhT9FfZJxxpfN7c5ujNbf2tr5+/EM/qWtU24NG/s/hg+INAuHXpUkhMk16heY7uLezINl3/+aZT9d12CmCtL1+zJZAlKUf+rYCvaunX7kj/fvKu5vav/RK9F/co6pF+fN3jhqhtqwrryklatCTJh74xVB5SEKCAib37H+j4yffL9G9F55mEB7iW8Kfrm1bnjDqWylMcZ1ZKxtYLsuIzw+w8zTP3+Bb5ePkXyoQV+7dsWW/xzlCH52NA+nnOHhDgmnp6w+JGBIIUB1b8MpArGIRAyO2spZdtyVKtyBzbe1GXvnbHjUrO+1Zyrd/hi9bGDqtgNi4aV+2FEQ2f11X3D+287ncFJQnqd7Wc+9USZz0MwaZGRSnUZK5kYN7EGAABAQoA3Jy7dfsuG9HY9997I1cedPjTr9LOXKOsSA9aP7f+KGyorqkya1+DMN2FR0SdHND05omA+u6pdV48rKyOI2m1quP4WlsRmhU0eFzaZf8XK38+ejsxg2MzoGA1XQU7SriX9RGSMlone39Ln1Dd7dq5o0HnhwCvtFj9OOba+9bH1BUW0pHTvH2a1sH7dy/JblflxSr3fuoYlsW+wtqYS0698HS/qhmlALeVQvqSpMrbyr1CC3nfTdEEiRc2QyuJ3kdOsW84c3uPmjA0Ruke/rer429PnZeUHj5gcauo0RDqE/jT7zOX+p+NzHizvO2J5/gSUS+Pe01qbTvyU6DNo7IFRk84rLy2cUm1hwQLEbu0XDu3hTZJE7eH9dp+Y+ygv4q8hzf8q9NbS8gO7tnMmpXXbjqh1dvRpZcLBNW0Ornn2utjz67HNShRNLBIEDxnyw9Exs6+pY/evab//6af07T+3XbDg+e/9haVbjWn9R+ftGcaIPyaua35ooEenmX33Xl9wMDl6Xd9B6wrmFrhUmrGyXWnTv0O0b6CHgIw0GCJn1mm754clV6eWxD9PAAAAHwQ9fvwEtMKnjFT4V+nWOdiN1CqzVSqNkRVZuZYIatyl07zVg3tXzL+lL/Po3KJdj7V8Cf1l+07lJeTTeQOrt61lo0lJT07PM4hti5cq137kkF9mNy1jukIOKQ2oUMcl91F0ZrZO4lOpSs+fJq5okLp+T5SGNTxKtOnQvbQ9JQsqZ590K/Jxqo6Uu9bt1ryet6R4vboNvZjUpIy0bL3AziWwSu3Bc0YvGVjK/oX5gEk4sPj4LQ1HWgV0Hlzdly4oO0uUUFw5cjhKzxG0d8PW3avwK/TqtbXsztbMnQM7b2k5Ulizd+8uwRKSssq7ut/8jKh2//7fVJC+OKVwyoub9v2VyBICt6YDG1aUv3iqlzQjQcq9m3as4kOq0jNyslVGysouoFqtftN/XDIgsOA2FaRt2Zpta1hr0rJSM/K0rMjRv0ybIUPW/VzX19KjX+hQvU31IDonMTkrS00o3L1Cmnw1ffXIMfUczE0i9Ar9ommAMC9HnavUaA0cbWXrU6HK1xNGrBhkvg8dbVe1de1ghV6Zk5er0ukYUmrvUqZu/ZGLRo2t9+qrGXGpZw78ciaL/ceHIpj4/YtO3NERAr+aQzr6mxpO7BzarnoApUxOzTZ9TIVTuYbNpqweObyaaTfjsu5uXH0tgSVtqzTp39CZJsV+geyxjdcTjIb427llutUq5RnQomWgVW5GUkqukhG7+PnX69ZjxZrerX0sA1ZIxzK+iujIW7E5Oloe2LRZt2p2OIkAAADwYepLjUaHVgAAAAAAAAt8SQcAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAAAASAgAAAAAAFCYAE0A8EIsy2Vm5qakZqpUGo7j0CDw8SNJUi6Xujjb29tbUxSJBgEAACQEgKKMB/EJqVqtvpi3i0JhhQaBT4VSqU5MSldrtJ4ezggJAACAhABQZDIzc/l4EFDCiyRNNVb+A8ot+Fg9PctlbW2lUMgiIuP4fdjR0QYtAwAASAgARSMlNbOYtwtpQpB/ywdICfAxIkmuICpw/L7q7uYYE5uMhAAAAEgIAEVGpdJYOheZgwFJUU9PICAhwEeaESzxwPwLx++9/D6MRgEAACQEgCJjGZpsSQWWeJCcnIlm4UVEPnmj6UPrlEejvc+cQJIcy5p2XQyvBwAAJAT4GKi2tm//7UF9fqlCCeUuXrU7fT1nQm1f8adbbz3raARv14JohPfe5ogHAACAhAAfDZYlrBr23T++rJAgOJ0q6uyBabN+6ixbcm6s/6e4q72iuDWcXBbS41gmmz8dLbLyCq4+aHqvzkGST+xDGm6OqjpPP3vtgPvjGs1+bHjuVVGFOZcmdHFElf/J7bfYZAAAgIQAHw3Kzr1CSKD5nAFXsWpJ0f0ePQ9defyjf0n6aUmq15IiySez65EvK7ZIm1pLD39bS2T6pPqM6K3jF4wd5lj+zw5B9PtbOSb2UK9+KX33f1NDWPhp46lJIzYFjFvT1em174lI+X03+WpnI8dvnxOr6s2UzfuzexXTMoXWDqg1P6twCwAAgIQARY6LWzas7DhmyrXFQ/1eWIaYxvVSltqaktkqhIRGo+GYW1P7tkvvubHEX0MX5Xb/a85gp7jtk5bP2nUnOk9arGroyFm9u5WWmmZSRW+etHr5wXsR2bJSTVr/PKd9TdMX2Np7O9ZPXHr+YkS20Lt022F9J3fxkRMEm3Zn2di1q8KikvVWJeo2mzqnW0MPijCkHpm7ctrmGw/SCafSlQf8NGhQdWuS0O/p1vKbx10unO1euogqeJIS2zjZOllKc0e7IQOrbekdcTuXC7J7j9WZQZORotL+YxvpsrPS85g3WhItlTuat4DeRkTSIlvHgo8GAAAASAgAL6FLTdTbucs5luNrUFP5aVAmZoncnV88yIAzqGPO7Jr1e7bDV6X8BMQjllMe3zDD0GzqtipV3POODBs74ESJ8UvnfuGcfWLh8u/baGwvjGpul7t/6JgfblWcsWxOFemTzaMXdRhkf31bfWr//BbDnjSZPmR/ZeusqwcnjBjVR7BySwfJgR8n/xTbeNnOoQFEzLph83pN8r+3tnru5nlfryWHLZm5ykt3ZfH8ob23VrrRr7qQLtmi08isso7UO2sePhcJJXKxKR7kPTg+Y9r+ozdSNA5+zfv3mtDZV04S2qizP0/Yue9mtsSndPM69OHLAVt2fiXdOqXO8bqX19W1NtXmFweG/FH+0PTeXuSLlsAkhG0bO+fE5RiNxKt0l4kDhpe+NaDTb+GZzKBaeRP3j+rkYkkmzNXZo4cfVKrCxjRKH3loTPG7m9dN33D9TrzeNqhy70nffhsiL7oEQ9v6BwSJkq/fy9IRAqegkj6GuOuPlEYcKwAAAEgI8P+Ayzg9MGTeBc9yNe1SGJY9MG70tvO3ntQYeX9bfftCJady50TbnQV/kCKvel1XT6ysMC9Aow8aPKtFIzlFZB9b+5uuxfIhg5va0iRXdrExvPLstX/0bdrg1PJ9gm67BvasI6UJ/ykzk58sTo/Vp15dfs6u3/w5PUqIKZIo1W/2w+stN55LblMpKlrjXLlqw0rF5YT3+NXy0Aw3mmATHycbPBu1rFcyUMyVnDrW+bLR07R6dFDbbmM4ki7C7/dZgypLmWX6op3VpEXtWHHVqtXgWlKCU16f3GtLQuchvy0qzt0PGztk5jjH+QtrxUz/euW1ev23zi8tizw2evDWJz4BL23qFy1hQaXrE4dfcP556vk6VvE7l3Qds6fO6W+Xb89s2SFx+NlB9Z59309XGvXz/ITvlpWe+Xsfl9yji7+bn9Zx/rQV5ah7v64Y0nu1W9iwL+2LqhWY7OgnaSHF/JxUjzh3X6vshzcQDwAAAJAQ4P8HVbzd0MbGfeeOXshiOOJSGFu6doOBLTyfKzafjlTmS1UrZ5dirnKpkOZLSdPffn7lFDRf5BsfRz80Fh9Q1VZIm+82YF+6Wilmwb14rcej+6R/r4oygembftKqWqfNlQgBefvXKP39y0PdFxUU0IyR8UtLIVy++qbK8uFjyl+o0KBOcGijGs1qesgIsky7ZlV/XRcacqle/eDaX1T7qmEpT/NuTtF00Z4/YHNO9694+mkYEnqFLlsQbEMSypN/HbRrtndAcHH+c9duPbbTmc7772YLrhxg6iwdW9M0ktmlzaQe55uffumSVS9agqYix7JMbnp2LuFattfYK11Ywb8fvtqze6/KO00cWs+D3yKhA7/p8seEvWc0X7aUFVkrMKroiOyQIL9yHJH2ICKbwXECAACAhAD/N0hb/3YjBoWWYb7oejiWIWjXqhNWDGnmLHjuW/lCI5Ut1wottASZRJb/p+lSjNTTgp2k+OKdZVjCyDAULXy6V1K0SEQQBqFYImywYMu2jlaF3oYW8+/cbdzlWvfDjlw7c/7c9A7rJzf+4a8NDbyC2+25Wu3C0csnzt3eNnr3pOlNtoQNbvIOhttSdvU3X7F8ec8Zcp7sHDV11OTzNVfUyIxPz3t4q33lP5++payaNiUpQ+1Rubgof1ZvXxfBSxMCm/aiJWjsa89Ymb1g1drWP6dw3kHNunce1dVf/i8hRpWaxnjWcclvUYGLrxd3LjWXJWRFGJaYnLQkjaMvmRiew+IwAQAAQEKA/6uIQJLp538cdiTBq8nqsfSsAQeHja5cZX1d139MVzBS+aVon2L+9LHL19R9mpuLftXDS/eoEi3dJf7F/AyHroQbW1c27ZmGa5safZcy5GSf4EDBnquP2W8qm6fWnp4+eYlVz62DRXtmnCLbd2vbp3Sr77qpTi6t2uVoWHr1sn9uP+ncbFjHNrXbtxqXcfKbiou3nevXpIXonTaN0Ma7bcug6fNinzA13e3lkvKd/9z5pYepFbi8hNgY1tkr/JogISFWT3iarobKxsemGYmg/Lm5/Dvhctk56aaLCZE2L1qCfU7yDUW1iZtbzWFU0RcOjBy4cGmZRaNfHREouZMjHR+baiSsTUHGmBabQDo4yIs2LYmc3D2EqhzK2dcp+16aAQcKAADAp45CE8AbFMJip4o1qw9f1rdzx++WD69es6Kz6K2KTdK+es9Wgj1j5i87ER157/qKwct3UzV7fWVP+9T9tr7ylyHLf70Y9/jO+Wk/7okuWb6S3PrL774QbV/cd/HFG5FxZ3+ZP3hxUrEQbyFJxx3fOWrszrB7KYlxkQf3hqc7e/oqxMaIkzNGrf3lXFx8YtLlvedvaN0DivN5g3mwb/ucDeHp7+xGUpRIQCnzcjnSrm7tmlH7J66/+yRbnXrn2MiO01aGs9LqNRvoT/00+9KjDFXCpf3TNkSb++uTVnZy8u71Y/EGJi/xwJwDl0y3m3vxEtj0SxM7z5l3PDFbT4lFFMcJJZbUY9Cq9f9cHU6j1nGEpHarSsrtm5aeScnOTj23csOW9JDWdayKMCGQIjt/X0laRPS9R7kKPw8nEY4SAACATx7OIcCblIO2QQNWT+AEQpoiao6dUJUQCN+u2KRsms2eMm/iqgU9Bo5VS7wr156947uWzhRBOndZNkU5Yf387oPidNalGnTeNKOeB00SDfvsWLRu9NzZ9acYbP1Kt1s8aUJtKUF59V00IObHnd/W26gW2fqUrzprY8/aUgHxw6hJySsXdOo/0iB18wtsuWz0kDJ8Etbf3blx2uPOzbqXcXw39yug3F3cMs8cuaquWT10zqqcyTOXfzU302jv07DP6ClN5BRZdeqq1AkzNraunkn5Vh/ao/L1k6a5rBp0mBC2ZEajbsO1lH+bRg3dHpsW5fKCJQjIpjPHPBk7dkT5NMK2WECzCd/3DaLpvBLVPH4fWnVGzrGxXV2fbgw6oGpQ1tTRdZXjj4//7pekddMmjl6VQjgHlR+w5tvmRXn7M6Gzv7tVWuzDXJYhkh5llSzhZ5tzP1uPQwUAAOCTLvk0Gh1aAYoKo9fpCaFU9IJzU6xBr+NoiejpsAWOMRgNDMtxJElRQqEgfxwxxxmNRoZhWVNvJVooNI1sNk9t1BtY09T8swKB0LIYljEYmPxlkKYRDKYhzvwSDAYja+q6U3hi07pxArH4tcYrX7x0t3q1MhRFmlbO9EgkJWUUYUPpjy4IWen3528tiuV/akalMkgVEvqj38QRkU/eaPq6oRVwXLw3pu5q5l5r/KFy9tztalVLo00AAOAt4BwCFCVaJJa+5CVKKPr7S6Sp/P/nPblIUsDHhX88T9IC8T/LZz4UiP+xDH4JIpHgTdbtI4jqtFxBY/8BAAAAJASAj5rpLARpHkRc1Cj3wPoVbCRoYng3+y0AAAASAsC7zglFfeCVabqoDJoW3sHeingAAABICADvwt/u42Cquki0yVvnK3hvjV3o8bl9GAAAAAkB4L+Ry6VKpdra2spyqwJzXyP4L2UrvJ8wZtph+f9yc/P4fRhtAgAASAgARcbF2T4xKV2hkJm/iOVYlnBxscd3sjxXV/s3LFuREN5bPMhvcF5CYhq/D6NZAAAACQGgyNjbW6s12ojIOHc3R4XCis8GBScT0DbwUcvNzePjgVgs4vdhtAYAACAhABQZiiI9PZwzM3NjYpNVKg2+CIdPAh9h5XKpi7M9Hw8oCnEWAACQEACKOiQ4OtrwP2gKAAAA+P+qgtAEAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAAnyEBmuBTxLJcZmZuSmqmSqXhOA4NAgAAAO8fSZJyudTF2d7e3pqiSDQIEgJ8yHgQn5Cq1eqLebsoFFZoEAAAAPhQlMq8xKQMtUbr6eGMkICEAB9MZmYuHw8CSnjxwd0c3y0ZHg0DAAAA70Ph7gsKhVVJhdXDiDi+PnF0tEHjICHAh5GSmlnM24U0Ici/5QOkBAAAAHjnSJIriAocX4SwLOfu5hgbl4yEgIQAH4xKpbF0LjIHA5Kinp5AQEIAAACA95ERLPHA/AsfEgiFQsbXJ2gXJAT4YCxDky2pwBIP0McIAAAA3n9OIEmOZfNrElw6BQkBPpLDsnA8QEwAAACA91+OIBsgIfx3uuSjSzbO23r1RozSKHMoHVpv+ORurUuI33xBnD5PYxRJZULy//aA/HtawM4MAAAAH6QgMfU1QlN8Tt7vHdOY5C3ffN9pTXrpHr3X756xeW7rSqmHvmk6e1fSm+9VbPKqlh06bMr6/94fSUtHQMQDAAAA+NAhAT4fRXMOwXhzXZXQnT7Ld+3uqnj5VFzKzmWjThebEja1X4CY4rMJV75hfQ9NnSkz1zxqPbHEG64Kx7CmOwO8VppgWJJ+2yv0cgaNTiCVvLP9/l0vHwAAAADgPSYELjc5g3BylLEsa7qTF/+MIS1RbeNuI3pBnZ62Z+M1q3ZTewZJn/YMoh0rDZvTJ8woMBAEs3ea1ySXP6/1qWxaKebW1D4N7neN3lZPbkg9MnfltM03HqQTTqUrD/hp0KAq2fPq95101UBc7ex6fmLc+po5p3eMnLD/SHgW4eTToNd3c34IcaMJw+nFZYYa+38VP3/R7SyRY8Vu/Vf00i4e8Mtv9zS2ZetOWzO0kz/Nf4Tsa3+Mn3Ig7FpijpVnaJfuM8fU9BUT+uMLSo2xXT2dXDzygHTspm0dZE/T0OkfundRDYlaVc30GdnU5c167fnql6MDXYi0O8vGrl0VFpWstypRt9nUOd0aelCvufzNQbtq1NpRcuO+za2E2CkBAAAA4JNNCGzy+q49J0cX+yKESmdZ/db5jedev5gXuvvO8AbSf0xseHT5NlmhR6C88NflpDCgaUs/guLXQ8dynDlp5C/b9CfHV9gJm+d9vZYctmTmKi/dlcXzh/beWulG36GHVlJfDgzrsHZ3L2dB5O6uHbbruvffucCHuHds4piJnQRL/xpenGA546Mjqx/323RhuPzalh4Df6pxqOL4xbPOO0Yt+HbOjwtDWy+tJIz+8+tWm7Rf91s7zUeaeHPJ2J++ypp8bmFlGcsxKScmLK3Se95PdSv/7cOYw9DTcxemIfzmUxl5B36c/FNs42U7hwYQMeuGzes1yf/e2hpWr7d8Sl225wjSMYDGHgkAAAAAn3JCIMRVunZov+fMn389yWS5zLOXdeVDvulayYN9waScJjdLJ3Kxlzz3PEnTr1wJNvFxssGzUct6JQPFXMmpY50vGz1JUiAWUqZ5hVIRd33zgWv+bU9Oa1hGRBLBxZcmhNdZd/jq4H4V+blFwUN//qqOB034NG44/dSVnn0G1S8mIjx7Nf91x520PI55svn3c6U7X5lYr7iQJMoWX2SIDO53+Pj0ys35Fc4RNpjwXfcQ8WvdQpzNiYrWOFeu2rBScTnhPX61PDTDjSaYO6+3fFJRvveYYJKmsEcCAAAAwKecECi7qj2+DqnrllVv/p/pBCF07/DTyKnV5YIXLZUUyxQCfXaO/rk3ZXLTolIpNz+Hl3Svocu0a1b113WhIZfq1Q+u/UW1rxqW8uQX8CyEaB/cS7WvVCZQQpnra1FAtUDH2TEPcjk+IZAyB08nganCF4glQsqzuKvY9Actk4pI06W5jI8ikjTnV1d0X1uQYxg9Vyox23yKQORdNlDyukU75fLVN1WWDx9T/kKFBnWCQxvVaFbTQ0boX3f5JCXAhWcBAAAA4JNPCHxhy6VsHLrqoNJ32Prm0WMWLxu8seGpQfVeeMttsW/5UuzK8w81HSoU6rXD3Jwzsv6+6kev9Q3+++RGI2PpyiMNbrfnarULRy+fOHd72+jdk6Y32RI2uInd0wlNlT5JPbucD2lKBCzDWP54/qqgf/8/JRYL7TqMvbekcqGBE5RQQrIPCUIisRL9awswBqNlNWnfbuMu17ofduTamfPnpndYP7nxD39tCP3PywcAAAAAeK/+e7cWiW+V4FbjfxjTpum8BS0b1vB3ftkiKfc2HUvn7Nyy9qHh2ZPK21v2JjmGhpQ2n0HgDEa9pd7mlA8eZJjPE6ivbNyw9JKoTsc2ExdOPHZ6WIOUsG3nCi2BkJYIdMq4ej/aEgkINvbygzRn7wDb17k6kCCoXHHNzYdRArFUyv+I8o6tbTPwaAz76rk4o86Y/27quPvR5qmN0Tun/3pUV6pNn6/nrZt7bnMj4uDRsHT6rZYPAAAAAPDpJgSBfb3R49cPLiGnBa7N+m1b1KiU4mWlOVX86/7jK0SNbz56xNLjYZceXjx8YES7Gb8oK40ZGmLFv+zs4JhyYe32R4kpSWdXL/opTGueS2SMODlj1NpfzsXFJyZd3nv+htY9oLjAfHaAzUhMzVSxIZ2blHu4s9/Ek1cjn1zb80u/BTGlejSu8lpfz5M+7b5qlLG377ADJ8IT7h3f2XfEYWXJgGKvGjBMubjaas8cXHMxNTXuwZZRa35LM9f7JB13fOeosTvD7qUkxkUe3Bue7uzpq6Bec/lc2u11c3fsj0B0AAAAAIAP7L93ficpgdBSjZO0QPTKi/GQMt8Bv851mbd52Yol6yeoOblj6VqN1xzo3M7XNJuwesdFwxLGTPi+ZH89XTx0XL+yc2JMa1jlh1GTklcu6NR/pEHq5hfYctnoIWUogrKv3qDEwrlDyyZMjl7VbuNmw5ipK5stzyacitfvO/7nYf5igjC8TkJy/2LZdtXYcdu7hC7nnLxDu47eOMRfSBD6l89Rss/ASXeWLmzZfXQe59rg68GNd5/ln6a9+i4aEPPjzm/rbVSLbH3KV521sWdt6esun0m6vmLazpL+bVoEYLAyAAAAAHxIpEaje7/vyDEGo5ExXyCUJCmKzxcCOv+sA8cajQYjo8lRGWQ2dhLCwNFSEUVwnNFgMLKW8QYULRAIzTOwRoPewBK0UCKiOJYxGMwLJU1jfoXmwcn8FFo9IZQIzLGFM2j1nFBsyTCsUa9jaYnItCB+XqOBYV4173OfwLw+jEGZpRM72EhJI0uJxALT2AeDeTkcvxySooUCAWX5VK+xfNao0zGkSCx6jeudXrx0t3q1MqYrIJnaj38kSNxUGQAAAN5zSceZH0wXqzf9nL9wp1rV0miWz8P7v4AOSQuF9IuvW2Q6HSHmf8QSy0ji/JUjSYFI9M8V5SeWCJ7OSYvE9D+nkDy7tioplIgLvSKSPntXWij+xxr9bd7nVtOyPiKJxMq8ngXv+8LlvObyKYFYKnjTw5IkOdzkHAAAAD50ToDPzUfZp+VTKXpJHJYAAADwf5wOUId8pnAR/k/P3/sU8QcnTiMAAADA+44HTx8tOQF9npEQ4EOSy6VKpdra2sqc3ElzXyMAAACA95gP8gchWM4jcLm5eXx9gmZBQoAPxsXZPjEpXaGQmcM6x7IE+fyN4QAAAADeaTyw/GJB8JUJX5+gZZAQ4IOxt7dWa7QRkXHubo4KhRWfDQpOJqBtAAAA4H3mBC43V52YlCaRiPj6BG2ChAAfDEWRnh7OmZm5MbHJKpUGo4QAAADggyBJUi6Xujjb8/GAovBVJRICfOiQ4Ohow/+gKQAAAACgiEtNNAEAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAAAADAf4CrnQIAAADAe8KybFaWMidHpVJpdXoDwzBok7dG07RYJJTLJTY2cjs7BUUV2Vf/SAgAAAAA8M4xDJuUlJGRmSMQ0NYKmaeno0gkomn0Z/lPTarX6/PytMkpmfEJaQ72Nm5uDkXSpEgIn2j+5pKS0tMzsrVaPW6pDAAAAB8ESRISicjRwdbNzfEV91Tm65acnLyEhFShSODl6SyVitF0RYIPA1KphP9xdLTVaHRp6dn378d4eDjb2Fj9x1tcIyF8kvHgcVSCXm8o5u1qYyM3JwQOOQEAAADeczzg5ebmJSSmqzU6P1+PF1alLMsmp2QmJqa7uzna2SnQbu8In7u8vVyyspSPo+Ld3R1dXez/S6cjJIRPT1JSOh8PSgUV51MBf9TxjxxnSQhICQAAAPBuc0HhhECSpEJhFRQov/8ghq9PPDyc/hEPOD4epKRk+vq4SaUSNN+7xmcwiUQYG5fC/+7q4vDWZxKQED496RnZxbxdLfHAFBA4yyMSAgAAALyvoGA+g8AXoCRJ8Y8e7o6xccn/TAg5OXmJiemIB+8T39TFvF2iopOkEomdnRwJ4f+FVqu3sZFb4gHDMAURAT2NAAAA4P3FA/6R4/h8wP9CKRRWfH3y3GQMwyYkpLq7ORZdPOBIIpEkX3H5I5LgbFni/70vE9/gfLPzjW9tLXu7gctICJ8ecxiw/JjOHfCHHx8QMBQBAAAA3lsxYskIfEKwRAX+z3/WIUlJGUKRoEjHHpyXCqaICOHLSx6WJLy1zAot9/9+iSS+2ZUqNb8JPD2dPquEoE1+fP58xMMnOSoDKbVz9C9ftk6Is+zNO1NxRqOeo8VC8r0fOzkXNh0ML97o21AHiok/sPRkuDY/3FJCqb27Z0it4AoekrddLc586oB72tEI8QAAAADeX5nDEZZUwNchNM39s6szX6BkZOZ4eToX6dsyJBGkYRbouUyCcOSITIqwZYk8ihCyptXREcRjCb0M/a4tnBxtn8Snurs7vMWQ5Y80Iejib2zbFcn5BVRuUMZOZMxJirt26vhOTcNutRzecI255HOHtucEf9/Cm37vxw7Lmf/L/53yrFE3tDhtyixq1ZN7907s+EvZoXGop+DtDkvL6ORCFzLCOQQAAAB43zmh4PH5KiQrSykQ0O/mwqaZQnqggN2gI8fLiCEq7qCc8lExYqngut7Y9I1W36hVqbV6I2OKOxQtEMkUMuGrimlWm5OVl9+ZSiCzt5EWTXVpyMtQcQo7uahom4lvfH4T8BvCwcHms0gITMaFww/0QTU71fOwokmKT6g+Hh7CE1su3Y2oWKeU9M0WZvqKneVeczfnLB3r3orRyPCb4eWvk2JbBw8Py7Z39irupDhw9PjJyHJdg+zI/3Bg5l/FiEA8AAAAgA8bFQrLyVFZK2Tv5t0c9MwOU53OLVea/iyZax6YkGeKBzdev7RldUqlhpPIbeUCimAZxmjg/u3KP5TE2l5sTgq5WfpPYbvwm4DfEJ9JQmDiH4XnOFRu42EtovM3FCVyLlO+PpVjZeQ4VeSONdE+3zSqaq6smZhLK/4kvuxX1YdmMh7cOnEhJj7LQCnsA6pWqlfOJvX4H9uuKhni7PyVaZ36VPJQxp/569ad2FwtJXUtEVSvXkl3Cb+IuL1L7lnXso87F5miF9h4l2zc0DP9zMULj5WslVNwg5p1/aT8O3F5KZdO3A6Py8w1iB19S9T5olRxOUkYYn5fFunVvmTOqeuRDlV6N3Z/VZY0D/bP/01sXbq81/m9cY9yAyvbkGzq7Q0b7zm0aN+yJI1/ZQAAAOATSgcvfFal0np6Or6bd8wQ0YME7Hod+YPlHILCcg6BvqFnmrz+apsigUAuEZqrTVpA0a9TFT8dpP1pbBsrK0l8fPpbzPgRJgQuJzFDa+PqaUMXbnxS7ly2oiPJP6fiTN3vn+6NbP7X6Fz6/T/+jLMJrdrBQ6SODT8SdtHWo0mV2k3ac4f35Jbt09Rbxqaf2X3mtizwi9ZVbIwZt07d3HVA0LOtnzXBskzG9Vs2DVo3dWOTTh+4+duGJwGhlTpWJ5+cO3/ixMMgn/KuXNaF3SdvSoPqflnelsyLunRj9y5jl+7BbgS/KrnXT0SVLF+1hZfjm1T3pNDV3oF4kpbBETYkKXUsWyVQaocbjwMAAMDnQKc3iESid7Nsez2zzkBIOW6eipBwRHElQ3MEqWbqccS91y5tSZqmCZ1GaxRKBdQL8oNerVZrDQxHUAKxVC6TCP49FHAGbV6eRm9k+YULJTIrKxFV6CV1nlZnNC9PJJbIpGJ+gUZ1dpYm/8pMORk60/8oiY2dVZG1G78J+A3xmSQEjUZPiMVS6vnMRpv78LysNw2bk5tDKcqVcHW1pgjHis1tsoUSghKKhBTJbyapRMBGRd7KcarRskyQHb9J7J0EuQm7I+5m+VY3nXgR+levUNZTTBHy0p53YnUBdYNdrGnStqzbhT9VuRzh9CTiepZrndalS1pRFOHgbKNP+CX8TmJZNzd+hXSyEuWrB1kL33AUCGk6bow6HWfOP64VarqQNIl/UAAAAOAzwDDM211n8zVkC6kJAm6enpwuIb5Vc8etKG81I5LQ4QamxusvhRLLZcZcdU6mVsDXZGKxRPw0BHCGPKXKKJLbyIU0Z9SoVDl5lL1c9Oo6jdEqc7WkTG5rIyBZgzpHpSRtbGTm4tWoyc3hX7KyVghIjjHqdTq1XmgtpgRSG0ep6d2yVITc1sryBkVZDfKbgN8Qn0dC4CtnIR889dxzTcSos/MMErn1yzazu09Zu9N/bfjzgY+bt5ern7+bi+nKR08DBadMy9HbuHraCc27Ky1xd3amotMyWMLGNEZAYS2mTV2ABEIBLRbLrQSmP4QiPl2amlWTmavRpR5ZvfPo02RpJAVKluATAiFxdFaI3vwY4IxGAyHI39tISoALzwIAAAD8O2sjN5DhxBzXQ0u6c1xTDSthCUrH+rJExhvUU6RAIrcXS/l6XafXKnM0Gpm1jdSUElidRktKbWUi08JIoUwm1ubq9JxI/Kri3aDRGIVWdlLz5TNpkUwmzNLoGZmU5hOAWsOI5HYyS9FH0QJhwfjtgk5L5uvHfkx9lz7GhGDjYiu6lB6v4lytnzUUp409uO4S17BNu+LPFdps/rV4JS61OzYr+SQp5kl6wo1LF05ZVWvfsLZHoY4/pshBPhuCYh4UwLFPt1DhVXh+C5mmtQlo262ca6EgQPP7DWs6SSUSvU1EZtMyMwhFMTucNwAAAIDPDU3TDMO+s9MIVP6jqQgs/PPmdSctkshEEqlMq8xSa/QSBR8DTDekZYw5WdrCn4flXvkGLP9pOUNedkZeoWVTfKFIm14iaPEH6Sli3gT0W7fvx0Xk5RNglXb1QpKmUHWfcy8qjnMo5inK3wr5lT2Xm55r7rXF5cVFnL+XZ+vvV7VOlVZdGtZ2yr5zP5MttJHkDgpRTkZSwXZjUtNTGLn963X9FzvbWedlphtEUqmY/5Ho44/vvRWl/S+fUhNxPU7t5Olni4QAAAAAnxuxSKjXv6Pr/eQKycViUkdR6yVUPEn+KaWuUMRNMbVX8NZ3QiBpgYAquEq96dt8WmZrZ+fw9MfeWvrqkpGkSJISy22fzWJnb28lNFfbFE0wphEIr/ROrkrJbwJ+Q7zFjB9l1xaJa40vfOIOnNmqC6oU5OIs57JjIs9eSLMODi1jS5IGiRWd+/D6k8AaTmTq47DL+f2EBPqMW6ceaSRVK3tKmYy4mEzKNlBqiZOsWp2rNdp4+5eSHz9zMNwq1NvOkHY1LFLtGVzakXydLUK7+Aa7RJ7/84Ys1M9dpLxz7Pojulx1KUG8Qc8uzqDMTU8XmO+HkBt7+/a5KEn51iUczbsbp069dTtNVqJUgAMCAwAAAHzy5HJJXp5WKpW8g2VbG7jhRk7McjPMX/z6qUz1WK6WDeCIlNcubVmdOo+h+PpZQFMEa9RpdCwtsXQLEYjEtFaj0lBWYqHgRVdANfU2YQx6RiwxvWrue0IKxCJCmZcnlMtMHdf/1jdFJBVrcvJUalImoUmONY1DMAqsFGKqIFxQFKfTG1iR5Qa/RdjbiN8E/Ib4XBICQSn8K7VrZX3xStSZA3fVDCW1dfCtUadGiKtpZIHIs2YDvyNnL264qWeEtmUq+zrdMkdVn+AmFa+ePXl8nYYTK2w8ylWrW1ZOEqSdl6vd7RtrN2m6fFe+Vouq5Kl7h369raOkzn6lW4aWMJ1CeJ0qn7YJ+bKm8eTtk7seammpU/Ggr0L9X3fegh0x7vShtafN91QWSGxd3Wu0KhtSLL9DG6dMunbmvoNdYIADrnYKAAAAnzwbG3lySqajo+07WHaOkJpFs8s0XCZNakylFefEEFck1G0DE/oG5SZF6vV5Sg3DsnyRTgsl1oqCO6AJpDYKQqVW5/AvcnwZKLWzlQn+VvNLZLq8vOwslXkwq4NpWCkltlJwarVGma1iTXecFivsrPPHNpNCmbU1mZenysljCYqmhfzshe/MRotlEr1KlZVuvnyNRGGnEBVRRshVql1d7N9iRlKj0X2cOxbHMkaDqUsXZ85WNG06+5NfTzNGPf+SQa/nRFYymjUSQon5zJDRaDCaLoRK8jMIaEvqMyU1PcPyjc9Pw7EGg5FhTHdG4xcpFJoHJxOsXmMk+Qxp3lSMXm8gBRLLH6xRq+eEEqF5HDrLL934ynmf+wRGnd5IiSSmPMjqzdfLehY9+RUU0s9iKR9ddQwpEoteIyBcvHS3cqUgvmmMJgxrud4rbpkGAAAA7xFpKmdImqYEAgH/eO36w2pVSz99lWXZO+FRXp7ORXpb5dNWgt1GZqHONPzASFO9FFSCuebqk8t0NPctvyGll3HsKi2Hr1wJvsh/Ep9atowvRb3xsIKP9wI6pjAnpl/Yc4qkBWJaQEjEUsuQEUHBHAKhWPDP5Qj4bPD0D6Hon72xKJH02XVnaVGhKp0SSCSFFiQSCV4573PvLBA/XR0+KLzy8DBdalfwVgcn9n8AAAD46PBVqYO9TVp6treXy7uqFdHKr8Q3Pr8J3iIefNQJAXvG68UD8h0NbQEAAAB4eRFCFqpGXlyUubk53L8fk5WltLNTFNHb0hxxX0o3L/j+tmAkNLleIdhk/o0lCS8tsgNB8M1u0Bvd/BzebnZchP+Tj0j8kYkeRgAAAPCe4wH/YBmjS7ykUwNNUx4ezo+j4iUSYRENWa6hMa7VkcwrSyNbhqP+zzeQRqNNTEr38/V866vNIiF8iodl/k/BIUqirxEAAAC892rkmZeFBBsbK3d3x9i4lGLeLkUREkiO8Gbwxei/xQO+wflm5xv/rReChPDpkUhEubkqudyKokiOs/zgNAIAAAC8z4SQj69GeLm5eXx98s/J+Fct19KJik5yd3Msuu5G8GJZWcrEpHQ+HvDNTlFv/xUyEsKnx9HBNiExI7Ck3HRUWi65xD7NBwgKAAAA8K7jQX5G4GtQiqL5x6TkDL4+eeHEfLHi6uIglUgSElKVKrWTo22RXt0I8mk0urT0bIPe6OfraWNj9V/iARLCJ8nNzVGt0T14GOvm6iCXy0y3/aNxsVMAAAB4zznBRKlUJ6dkiERCvj552ZR8tWpnJ7e2liUlZTyJTxUIaGuFzMpKIhKJ3rqjPPAYhtXr9Xl52lyl2mhkHOxt3PwciqRJkRA+Pfxh5ufrkZSU/iQ+RavVIxsAAADABwoJps7Pjg62fDz41y+t+crV09PJ3d0hK0uZk6OKj0/Xme5vxaAZ3xpN02KRUC6XuLrY29kp3u7CpkgIn1VI8PBw4n/QFAAAAPBJ1TCUg4MN/4Om+Kg3E5oAAAAAAACQEAAAAAAAAAkBAAAAAACQEAAAAAAAAAkBAAAAAACQEAAAAAAAAAkBAAAAAACQEAAAAAAAoIjhjmmfJJblMjNzU1IzVSoNh5sqw6eAJEm5XOribG9vb/2v990EAAAAJAR4s3gQn5Cq1eqLebsoFFZoEPhUKJXqxKR0tUbr6eGMkAAAAICEAEUmMzOXjwcBJbxI0lRj5T+g3IKP1dOzXNbWVgqFLCIyjt+HHR1t0DIAAABICFA0UlIzi3m7kCYE+bd8gJQAHyOS5AqiAsfvq+5ujjGxyUgIAAAASAhQZFQqjaVzkTkYkBT19AQCEgJ8pBnBEg/Mv3D83svvw2gUAAAAJAQoMpahyZZUYIkHycmZ73MFIiKfvNH0oXXKY6uBOdJyLGvadTG8HgAAAAnhPdJf7us3blMm+/zzlM03e3auaPg5fV6ycEejj3xFcaRBwc6AeAAAAICE8J4JS43+Y8l3Rr4EYaPWz+p7qtyKX770p02f1LEE/ZlVWi+lPtu73LyjxdofONKl7NMtzMTMbzZi3uOKi2+OaZW8p2XbJ0OuDGkowiEA73+/RWIEAABAQnivBYi8eLmSxUy/saLDYlJqH1ghMNj8KcnP8OqK5EuLLVJAxl0+/LBj2dL5uYh5fDUsmhSaf6dcQr6fXLIUupjBxxZuAQAAAAnhDWl2dm7T617rE9f6VH75ivNJgCxUh/B/UpY7R6tjt09aPmvXneg8abGqoSNn9e5WWvrcvFzmvaVjflkf9ihF5lHjq2alw1fd6bR1d6f0mbUGXx20bXdXhWmivBOdfDcHHlkzuTxN6JMP/Lx63u+37yZxruWrD5jat28VBclEv9n0BGG8s7FGrR0lN+7b3EpYRBvWs2aI+tiRJ8NKFzc3FRsddiW9YpmAG+Y2URRv1Bo7PwAAAAB8uglBn5OYI3V3IljWdMMw/oFRpqcRDq6K1/42klMdGTV2wIkS45fO/cI5+8TC5d+30dheGNXcvtAS2JQN346bGlt10rJeVWXxOyYvn3PZ0KiD+RXO/NYF03EcZ/5Tc3r86F7HSkyYMX2xhy5818bRrSYzp+YM9H3D6UtQlFPZniNIx4Ai7AclCGlSYfe2y4+GFA/kl8qkhB3LCm1d8eHNx6YVitnbqlXs4MtDGgpzL6xYPW3TrchsyrV8nR9nfdO8GE1onvw245cVRx4lUc4Vm7WZPLqWn/gVb0Tb+gcEiZKv38vSEQKnoJI+hrjrj5RGHFsAAAAASAjvjvrkmhodTsurVfRKZLism7M69btxIsZvyoajg1yp1wwIWRfW/qZrsXzI4Ka2NMmVXWwMrzx77R99v+xh+zQiMA+Orjxt+92Bof2qiikiqOzS9Iu1trxqoTkXV2zRddg4pH89K36ZpUoOiT/Tf9Ou2H4/vuH0Y31ol/K9xwSTNFWEjSYOqV53xZYjj9sFBlBs/JWjScEDK4ki/j6N7vSWgeuZ4RuXtHRVHZ00dfTcMvWWBP+PvbuAi5p94AC+7ZLuDgmbNCgRwcLubt/X7o6/vtZrvXZid3dLmKgYqBgIiIgCIt3Nwd3uv+MUEQuU1N/3g3i32227Z7vx/LY9z54tX7442Gn9ySmW4tebx62ftNvo/Fj9b2cXUWpYZELDGqYamaFiXRO51FdPEQ8AAAAAkBDKmdjQYeLwzHMXH96OEtHi0Gu++o5de3SzLsUFOaI3Ya+ERmPtlDmsgnsIqJrZ1xetC3ovJJQLp5ITEPpavv6iBny2pKJO8muZ2+qQYd+Z5rt3odmJl/v0OvwxZND5QhXzJBGhVsrxjVkkxS7zVcGr084l/T+v6PG19aKvPXzv2M1O5oteSmmxWJSbnJAlrKXfY51bexHFz3164iLRY2ev5pKrkxpNXT3ePelH5SzKDAtJbVjP1FJMJASHpIrwtQIAAABAQihncnUcJi63tOFN7bwhTECSyva9N7u51uCW6pC7pINFqvANJMW8mRZ91ikqLRSKCfKzcb56EZOIFkp7a+Rx+ew68++sHmf0aTySzeESEaUcv5xwbdpaJ65+GDbG6c7V2CbDzGTJ4gmB5zxo5+TjbisXbX0j0LK26TtxwPCaSbG5Go0MpOcMSIX69n1KEsDSEmJy1E3I6IA0Gl8qAAAAgGqNqh6LSZKZd/ePdwtX6jhh/zTTTM/tk/bHEaXpm4hlXKMmK+KhX/aH55mvfIOoWnV1iyYkvom+XkaQT8CHa2REES8fxRR23C7Oy/tQz88LDgstOEzOMjAxU3z/8HkuX4Ynw/ywI3cNm7fcR/BT45cLvq29c/xDT9/HV96at3Pgf1Fe4sz38USTvnsu7wh4vHplq4yd4w/f5iqpc5Lfx9AfRnhyZcWRkMwfZhENXT1OZhpX00SDgy8VAAAAABJCRUQEloZpk1adNqzt0H3m9PldrW1r8kv3flWHv7qyz/xvrdvNsNdBT7ZO2HKacvy7U9F2ygS3YeuB5nFbRq/ffftt0CPv+aNPPJPWkylFbU3y0ZGzN96mRAfcXjDzsrTGT8hYDxuseX3eiuXnXr56HXx81urFj5StzPilHp+piSf471l9/EJIWR+A59dv65R4fL57sK29o/xXXs++d3TgsH3ngtNySQ6PRYi5XL6MRTdXwfEVZ+9GZqZHPt+48PDtJJ7M98uWq1LThJ8QEhYUmq5gqqeBeywAAAAAVGfVprdThXquG4+0pjhsFmk6fvc/BLuU1+1TSu1XLlozf/u6IePmZPMNbZxWHh/eRfPzgMQ1nbzvf9lzjqwZMD6Opdd+yrARGW6hBfGi79IxvhMO9W90NEMoZze+e6+E2wVv4DWaNX8PvW3JtOmrMmUMGjZZevjvzhpkqccnCFHMk62LT9Sp2b1z7bLNbDz7ttYZJ30dplgoEMQX+YPU7P738hfbVvUYMUUoo2fWaOymfg48OWLh7OmL9s7pciZWrNqgy8hNo2p8t4sljmZNXbmEiFfptIiICU2pU8tUOe1lah6+WwAAAADVE5mTI/hdPxstzBOIKB6P/bHSLRblC/NFtFhMkhTFYcLGl7VxMZ2fLxLRtJggWWTkSudJfuOOnh2kQNAiyfD8nORMSkVNliUSkVwuh/owTaHkDZJpsjnsDzMr9fhCgYAZh8ctQX+nD3wDHezNKYqUTELym4iJSarIgg15HVmq8V2cG+CbBmJxwS9Jz79in7v+9nZmKBMAAICq6Xe+rS7F5sp89vlIFofD+v518iTF4VIfRhEVaehAsTg85oerI1dwJzYO6wfTLPX4bJ4MbnEMAAAAAFWgFo0i+DaOjnl9c53PQwZZukmUdvySkx6RxUqC6kWMbRYAAKDKw3Hrb2PpDd6yVMyu0p3zMPWt8gshAGW8tSIeAAAAICFUcySbWxXjAflZJmBqXVU9IqBeCB/Pd4m/tg0DAAAAEgL8Gnl5mYyMbEVFuYJDskxdq+pXwBER/vh88KGZsuRfenoWsw2jTAAAAJAQoMxoaapGxyQqKMgWHIgV0zShpaVakcdktbVVS1k7REJAPPiwJTCiohOYbRjFAgAAgIQAZUZVVTE7Jzfk9TtdHXUFBTkmG3w8mYCygSotPT2LiQc8HpfZhlEaAAAASAhQZiiK1NfTTE5OD4+IzczMwRF6qBaYCCsvL6OlqcrEA4pCnAUAAEBCgLIOCerqSswPigIAAAAAyriqiSIAAAAAAAAkBAAAAAAAQEIAAAAAAAAkBAAAAAAAQEIAAAAAAAAkBAAAAAAAQEIAAAAAAIAygfshVEs0LU5OTo+LT8Yd0wAAAKCy4G6YSAhQheLB+6j43Ny8GoZaCgpyKBAAAACoLBkZWdExSdk5ufp6mggJSAhQaZKT05l4ULuWARPcC+K7NMOjYAAAAKAiFL18QUFBro6C3KuQd0z9RF1dCYWDhACVIy4+uYahFilBkJ/lA6QEAAAAKHckKf4YFcRMJYSmxbo66hHvYpEQkBCg0mRm5kgvLioIBiRFFZ5AQEIAAACAisgI0nhQ8IAJCYSCgixTP0G5ICFApZE2TZamAmk8wDVGAAAAUPE5gSTFNP2hToKuU5AQoIp8LYvGA8QEAAAAqPjqCLIBEsLvQ5QSEnDrYXhEfFY+xVXU0K5va21fS/7bxSFOvO9x4H2dMb1MZT5/gX73aNt5YduxDias0i2BWCjME7N4HPKnv5CfpwVszAAAAFAJCUF6rRGK4nfyh94xLTf04dELb3L0zDr0at23m72tnsD/wlWvUMF3tm4xLRbT9JcjkApaVg10FEtdkOLYux5bPCJFv/atlF4IiHgAAAAAlR0S4PfxZ55DyH/7IiLXqHH7piYKLEnq1dFVk8nyuPg4wrlmbfnSfiuU9e3sCVbpvxe0JHIgcAMAAAAAEkIVwNTO6VyBiEVRVEHqpWSMHBy7ZMhwCUL06s6GW3J9hzfUlbwkjrtz+XCi+fhuNQrelxf14Jb3w5hMlryWcS2XFnV0+QQd6bfj41VG4qw435v+Ae+S0/N56ia1mjWvbyQviQ6i1Hd3bga+ikzLYikYWVq3ctRJ97549HGGiPBZuy2h78jGeon++/YHqXXu1aUOCxslAAAAAFSiP/MqI45RfQPZ2GcH9t70vPv6dXSmgCZ4KpqmBgpcSXoQE0WO7dOiT0f66fcB1yOVHbs07+piwA73O+URnilNG2Kx5GIhUcr9095PcrSadGjRt5u1SW7I6ZP+MUKCyI+/depeMGHo0q1lrxZ6uc/uXPDL0nFq26uRAreWw5ih1noUQcqoW9jWNVWhsEUCAAAAQOX6Q88hyNW26yerHfgyKizw6Yu7vgRPybBubUen2vqy330bS9Pe1byOAkWK1dWI9H2er1+l12jw8UVRZMiTFO1m3czqyFEUoaaplBe1O+BFtIVqdrB/jm6rVnVryVGEWKV5VuadzAwRR4dDkQTJkuGzJbFAXruBoxbJwjV8AAAAAICEUBlIFkfZwMRet4aNSJSbnvLuTfjTx37H44VDBpipfOddahqGCiyWpEbPUqihpUm8SEj+1JAgJzk9RxDvtePElQ8DxCIhyc4QpSSmCtVqGcixCq5oYmtb23cVU9zik6bY6HgWAAAAAJAQKocw4aFXGN/OxlKdw+ZweDzt+qoaxir0vkvvXqfWt/18XFpMF3lGUYVH+SnJrQgklX668DWKVKrdY6CldpFrhVhcdsItMTMi6+NAks0uiAdoowwAAAAAVdEfeeE7JU5//8YvOPVDT6MkyWKzORQhJjncgrsTiEX0x05IBUmJOYV1eXFyQnTuxxei4hNIJY0iLQd4miqKWcmJ+VwZGR7zw897f+Pc87e5pLKaApWUFJv3YRopT25uP/M6DQEBAAAAAJAQqsyHVrNqqJHue+vsnTdvo5LjYhPeBj47dzWCVVvS1ykpJyOTHfUsMDkjKzPyycO74cLC94lzo7w9At/GpcW+Cbx87R1Z67O+UVlaJlZaqfcuPw18n5YS//7O5SehlJKmDCHLjMZ6d90rJCIxIzH85bX78XJ6GgqkpN9gOjs7PVdIM1POjn/2IDAkCbkBAAAAACrZn3nxO0u9gWNPbpDv84BLj7NyRSwZJWVDc4ceNobyTMVdv15rmwxv7ytbPYSkkmETaw3fdOm7SNlaZg24kZ5H/AU8BR2Thl2dDGTJIlcLsZQadnAUevt7n3yVy5LRMKrXybmmiqSfIv0WXRrd8Qm5fPhJHlfBwNy+XQMlZrCKgbaK/9NdB3L6D2+okxHjd+elmkrd2mro7RQAAAAAKhOZkyP4Mz85LRIKhbSkq1LJdUYUxWZx2NJWBmJaKMwX0vmCPBGHL8ch8sUsGS5FC/PyaBaboIUiWvIGFovNkTQuEIX7brsgch3XpBar4K35QqFILJZMkcVhRpC2W6BpyWBJr6mSJsnSGYklU2SmxeLx2czUBQIRyeVxSxAQHvgGOtibUxQpmYnkN0HipsoAAABQsSRVKOaXWCy5zRQtvnf/hb2dGYrl9/DndqBDsdjfqI4zlXgOj03weDzpHcSlZUSxuXzJ/6zPi4zOSskSULKswrdyuV8pU4ricLmcL2bDZIOPI7B5MujMCAAAAACQEKqyHx+XF8fdcd/vK9C1raeDi4MAAAAAAAkBGULDttXYRhSHy+aiMAAAAAAACQEoHl8epQAAAAAAv1MVF0UAAAAAAABICAAAAAAAgIQAAAAAAABICL8laSfEKAcAAACo7AoJICEAvpYAAAAAktuloRB+T+jLqPr5/A7KzJcTN1QGAACAio4Hhb+lOeHz+gkgIUDFkpeXycjIVlSUK0juzPcR+R0AAAAqNh9Io4FYeh5BnJ6exdRPUCxICFBptDRVo2MSFRRkC8K6mKaZlEAgtwMAAEAFxgPpAymCqZkw9ROUDBICVBpVVcXsnNyQ1+90ddQVFOSYbPDxZALKBgAAACoyJ4jT07OjYxL4fC5TP0GZICGUTvvQdyjrsheTIPkBACg385MyUAgA8C0kScrLy2hpqjLxgKJwqBIJAQAA/gD2dmYoBACAPw16OwUAAAAAACQEAAAAAABAQgAAAAAAACQEAAAAAAAoqUprqexe0xClDwBQpaDfOQAAIHAOAQAAAAAAikJvp9WSUCgKCgp/7h8aG5ssEolQIABQciwWS1tb1cqyZv36Rmw2CwUCAABICL9DPLh161l6Rparq20NQy0UCACUVsS7uHv3XiQkpDo7WyMkAABAMbjKqPoJCgpn4kG/vq0QDwDg5zB7D2YfwuxJmP0JSgMAAJAQqr3n/qFNmligHADgFzF7EmZ/gnIAAAAkhGovNjYZZw8A4NcxexJmf4JyAAAAJIRqD02TAQD7EwAAQEIAAAAAAICKUHl9GYmi3d1u+ueIiw8neVY9e7QzKWl0EeXn0ywO57PR8wJOn74U+uWBMUrNvs0wZ7UyTUXimFuXjiRbTOhmxP3WKLQoT0hwuCwSmxsAAAAAICF8E0vNrkdrC5pJCOKUF75ekRpt2pqqSCrvlJx6ievw4swnJy69NevS21qmSP2bY+zccoCtJHvQccHnvTPrd2xcR04SPtgKSmV+0oRmPgIt/l6GCX+03YvVZZSNIU7YAAAAAAASwrfxVHU0VAqq+ZwwFsmW0dDT1CqoQ5OlqEmLabqgjv4ZUlZNQ6ZgGC0Mp0iBoraGnqIkQZDkD47ji8XiH47zMxlCTImxrQEAAAAAEsL3kdSHyrj0P+YpJc0GoszX954+CI5LyCTktfQbuzRsoEu9v+lx6r3xwP7mGixCGPPs4ImY2n3sWVc9b0WLiJhz66OcJnYyKLzrD0l+rOd/mrL0uTAx6Ln3o/dRybksJY26tg2bmStzCXH8XfcTSTUa57/2eZNNyCrXcXJoIhPmdT00OpetamLRoUNtLXbusxPng7Us5SOC3yTlUQoqxpbWLWw0ZT9LE6KU4OfX74e9SxLQXDmdWvVbtayl/u7eprNhuTRxbF1SsyFtHVSyvvhoXGYadLz/vv1Bap17damDWxcBAAAAQGWqghe+CN9537gYTNRu1qxfH0d77XSfE7f8kll6tg3q5QRdfZpOi1IfXQshrBo20lRu3KuNkw7boHmH0W30SlKzzg7xPX4lTs6iUY8+zds2kI28dt09SNISQkyLs4NfhWs17j+0TfvaxKsrXkcekQ26uA5ob8R688QnJK/gZIUo4mFAsq5Fpx7OruYy0T7el55nFj0zIE4OueQeLq5r23tAmz5tTblvH195nkEZ24zoZCSrYNpjdEsbVdHXPppkGqSMuoVtXelVVgAAAAAAlYhd5ZZI8P7xC2G9jjaNjHksUqypzs+I9PR/mdaoiW5TZ4NDXo9upYteCE272GnyKZLgcVgkQbI4fG4J6tbirKDHkfwGLVpYqXOY92ops5PiTvlHZtarJYlKGjVd7PS02KSmpf6DF2EGjua1tTmUVq26mq9fpuWKCQ4zDkurbptmJhpsUqyrzEn3PPMsLNnKvEjaUqzrZGNsrafKZiYuV8c/4F56rpilwGeeEhRHhsvOD//6R3NUJuW1GzhqkWjMDAAAAABICMWr8WlpKfk5oefOBn6sLYtFNF8zmyaV5WpaNgvxuujHadTL3ECm9JVpcUZSiigx+vqmxx8H0LRYJStLLLkWiZSXV5bkBoLFYbNIWSUVDkvyjMNhS1onFIxOyutqqnMLroSi+PqGaqyA1EQRIf9x8qSSjkXNxPCAl0HJmSlJCRERIq6KuEQfjVBmkRSbja0RAAAAAJAQvsRisShVxwHNGyp9ygAkmyO5iIgi8nJFTL0+PYv+qYPtFItNGbXo1Lkep+gwHkUkFB1L2nThqzMo0oqZJWnZICzao2pelP/RU68JI+PaBup1TIx1qRt+Jf9oAAAAAABVQ5W78J1UVNbgZcQmEXwZngzzw8sO8PTxjaIJQpwe+OhOin7LpiqRt56EZP/EZ1XUVKMS49LZ0inLsBL87ro/Syvx+8WZMYlpH84KiGLfJwmVFFU/lR/93v91qkGDHu2t7ayMa9VQ4opL/tEAAAAAAJAQvoWjZWUuG+59796rxKTkpKDr9+9E8zTU2eKMsGveyUZOlg0aN7BVfH/jVnTux4p7TkZ2bp6oBJPm17IypF4+uvwoKjY5PfKZr+fDDEUtxZIXgSgm0P32u5jElIinDz2e5ehYGGt8ejPJl+WJkhOjM4R52Wlvfe/ffyfKZ5ZLmhPyczKy8oXsr380yWfIjn/2IDAkCX2iAgAAAAASwhcRQdehabv6ZPDVa3v33/RJVGnWuWEd2eyga0+jda2a1pZjcVUautThBz++E5FPkDK6RipZj69svxpToohg2rBLS+2cZ/cO7fU475dr3KppU0NOyctK3crSKNn/5AGv84/S1Gwc2zdQKnKBEKnd2KaJetK1g+d2Hn0QIDR2ddajQu6ffZpFamgbycR67Lz+OJn9lY8mV5ByMmL87rwISsT5BAAAAACoZGROjqACZtM+9F2xIe41DQsf08I8gYji8dgf84pYlC8UimhaTJIUxeaw2ZRYlJefT7B53IL7GtAiQZ6I4nI5FPPe/Lx8mvhWd0a0MFcgZvM57E+Ng4XM+LRYzEyZxWZzCroPkiwAzeJzC56IRYJc5on0LWIhMycWl8fOfXLs/HN914G28iKRmJAsFovDliwMnZ/HzEGGmbuYWRZmsT+8yiaYRaZJDpfHEucJ8kVikllENvnlR/uwnAKBiOTyuCVolPDfikMLF/yNbRcAft3CRXtmzxpYwn01AAD8IapES2WKzZX5bEFIFofD4nw+hFuk8kyxeHzWx/dy+OzvTZov83kkYrF5rK8tQJExeDKf7r3GZoLLp5eYEbnFTjpQnI/vLXi1yLJQHxeM5PJ53/5oH5aAJ4POjAAAAACgClTOUQQlQ8ooKSnLotshAAAAAPjN4bh1CfFrt2plSrJxSzMAAAAAQEIACcnVQVVkSVg4lQEA2J8AAEB5wVVG1Y+2tmrEuziUAwD8ImZPwuxPUA4AAICEUO1ZWda8d+8FygEAfhGzJ2H2JygHAABAQqj26tc3UlSQO3rsGs4kAMDPYfYezD6E2ZMw+xOUBgAAFIN2CNXPY7/gDh0cUA4A8NNqGGoxP8wD71tP7e3MUCAAAFAUziEAAAAAAAASAgAAAAAAICEAAAAAAMD3oR1CtSeOv9TOaIWXoOgwTtudZ93/Viqn+7tlHPmf/l67l1e66v76DITBcxrOS994dLMLNkUAAAAAJAQos9VoMstzzZQ6hWeESJ6SIm7/DAAAAABICH/uepRXU9XSKs01Y+J8QT6Hxy14TNM0RZXRBWe0QCDm8XCXVgAAAAAkBKhqciIOz9648nxQaKpMnVadV2wa3FqHoiNPt3YJG7ZWbtf0+9a75qnMWPSqtUXAVo8AgaL10Ck7ekTMG3vCO4ZTr/vYIzvb1GYT2YGeMyYfOPEgNkdG3bJ9/82buzaU/9q8hK/n2/0nmtc7ccXOgM6rb89UuPHfxvkH/ALiOTWbd1q2cUg7fZbg8rIaq3nDVfx334wWqBq7jhq3cbqV5of3590Y328oPStkS2M+E15iLraz8HD13TzVFO1kAAAAAJAQ4CcIQ+ZZOs/7+IzbYlrYlXZv580Zf9dmx4X/OStFn5i6uM9fyn7uXWsw9e+UO+suDt/qs7OhetRSUbT7A9dLwVct4k51dlrYImDwhVvnjiec6eKyZ+uDluuaJO6euOG+9YIHxy1UUgOW9Jo/97iz+zCVry8DHbt/w8u1u/ZsrC8fumFi/xOG647ubaOV7LVwaf/eXJ/bA2syOcDH/fyw2R4BjRRDvCYO+d8gpT0ewz4scpMeDtSwO/cFjZvz6KgLNx5at9xujHgAAAAAgIQAP7kaP2uHQPLk1PMDl57K7rFtdC9LPkGoj13X56TFtYuRncdThFio2X1ah8ZaFCFiRpVpO6F3E00OoWrjbHJAY0L/ZlpcQt2uucnh0DQxQan02bWnj7aOpgydLVBUUyCTkzJp4hsJQZxnPnBILzNFUvj6yP53bf5dNbChDEFoDFw96IzJsXOv+k9n5qbSbOGK1tZKBKHXZ9NUH4tjPpF/mUvfzXdwbi9eee5hfnPH5PMnQ2z7zDVAQAAAAABAQoCfXo/F2yFkpcSmqjc2krYzIChtPVPZ1Og4MaFDECyNGvqFY3JkZQraDJAUi+IpKki3B+bxh6yR6ndu9pq7gZk8DQM9uSTx91o/k/IGBvKSEUQJ4ZEZ50f21Rn78SVZjXrpNPM/S1ffRO7DEunV1ZfbkRBLfxyHb96trWjsueAVBq9OvjAfekQNAQEAAAAACQHKDkdFWznpTUQeUZfPPKPjY8KylSw0pDX8krZKpiMujh75tIn7lpP2iiwi/8Lgbsu+Nzr5IVdQihrqqgM2H93WqiCfiNJCnqYqW7GJK4QoJio8m2igKJl27OuoLHVTjU9Lwmva3U4w6dZprZcvm3XrpIGumAAAAAAqBw7U/qa4Zn178E/P33n2ZVpKdOD2qcee27XsUqOUq5sWCWkWj8+mRNmhHvvXeWVnZ+WKfxxO6vTqIX/6n+2nXiSnp0Z5zJvdbJx3bEGFX5x8e+Ec76CE9Mg7pyaseWPXx9GoyBLJNHVul3Vl2rrIlv0c1BAQAAAAACoJziH8rnhOi5dumLVpQdu+4blK9ZzbH9vX1YQi6FLFR6MOK+Y/H9W+xzqWmnXHXpPnOoz9Z84UlyPLfhQR7OYtcRNsWtp54NBUnmmzdtuPDbBkEwJma7NoN0j+ci/r/2K4ei1HLT0yWo8SBxeJCFbd27L2XLTp11oO6w8AAACgspA5OYIKmE370HfFhrjXNETp/5wHvoEuzg2q3WILLi8zWGx46+7Aet+8WUL+3emD+2VMCd5uK4vVDFAhvG89tbczw74aAACKwlVGUDXkpEc+d19zXNx9oDXiAQAAAEAlwlVGUEFYRo2H9VJW/UYDg7z7e5y639QaPGOTIxdlBQAAAICEAH/Apmbmutzsm69yW0wOT52MUgIAAACodLjKCAAAAAAAkBAAAAAAAAAJAQAAAAAAkBAAAAAAAAAJAQAAAAAAkBAAAAAAAAAJAQAAAAAAkBBAKu/hSL0OQy/nf3MEOuHMmL81NSasD6XLbSHyvUZ2a/DvG1FZTIsOP+GkMv+UAKsWAAAAoBLgjmm/P3GS786jCvNfrBtvgEAIAAAAAD+AKuPvGQroImcLxLmCXFJJW/PH61osyMv7+Jimy+6EgzhfkIeVAgAAAFA94BzC70ToPXHAfIX+jW5sd/PLUzC1GrNx7mLHwBFOO+9l5j+vPT3m+soJepGHZ29ceT4oNFWmTqvOKzYNbq1DZZ+Yp3fS9kQjnwlb5Jffsdja1Ne6T9rezYEZCobd//vf+JwTo5fefUtru/4z7/CE2jKEMPz8znHzPW+9zuJq1mgxZsL2mdZq5FeWho483dolbNhauV3T71vv2bPGLHjjtG3bvV5HijUdBwzduKRlbb7wwcyh4xKd6gV4uQfnyJpaDV06ZUF7LdaHCeTdGD9gKD0rZEtjPpMyYi62s/Bw9d081RSxFgAAAKAcobL1u4WEh9s8uQv3pGaevtQ7a9PMs/5cp513RjSRd9wRsnpCzXyfeXPG3zX458LBsOcL/xZf7vPXhbCCUwV5d07uZfW/+nJuVy5BJz2+Tgx5knIlaKXhjTETxoS4Xnx76cUqowf/Hr+SQ4hTbk0fcVvzfxvCYs89P9QscfWWHcHfPNsgTrmz7qL+Sp+dqx1TDw2fuzG75c77x19fG2l+b22Xef7ZklFEzw9fzx/277PX+06Nkz3Rf85/zwvbMnCb9HCgPO/clzRIoKMu3Hho3bKHMbZYAAAAACQEKAVSocOA+W20ZblKNl0bG6WmJhWtvecFHj2V3WPJ6F6W6po1LMeu62Nx/9rFSMkYpLzN2MlWBnIF2wPXctQMWwMZnpFr4/oyFqNm2deQPLYxF2ak5IhJOZs19zZv6mOkIc/hKykpcTKSUr6dEISa3ad1aKzFI6Ju7fGuOXtDV8caytpmTksWuWScufm4oHE1v/mA9SPNDbW07IdNmt8i5vipN8KPb+c7OLcXPzj3MJ+gE86fDLHt44yWFAAAAADlDVcZ/W6RT0NPjffhIVW8Op2fEpuq3tiI++F1bT1T2dToODHzmKWvpc8qTBlcWRnJZUMkRVKUjKIC9dnUqNyXx7YuOfEqmaOoZ6yYLCJqfWdxWBo19CXvE72PfZ/jP7tR1/mFM5F1yqQJVYJUMdb7cJESKV+7jmpCdJFQwzfv1lY09lzwCoNXJ1+YDz2ihoAAAAAAgIQApUOS336No6KtnPQmIo+oy2ee0fExYdlKFhokEc7U+1klq3yLU85sGnhU+cD1A+212UT+i2kWy7+fWKTBglJTVpOz+zdoST+lgqmkRj99z6nHI54zEwyLThYT2sxii7PevE5Rra1MEZEf385r2t1OMOnWaa2XL5t166RBYv0CAAAAlDcck/2TcM369uCfnr/z7Mu0lOjA7VOPPbdr2aVGKbcBoUhIcfgcis6Ov7XpyMnw3KycH/d6xDJ16mP+bPFk90dRWWmRz1cNGN93d5T0pdybh6fufRWbnOS3f+PCq5q9e9YqGltlmjq3y7oybV1ky34OaggIAAAAAOUP5xD+KDynxUs3zNq0oG3f8Fyles7tj+3rakIR2aWYAqnSffhqr+WDa3cQqhu5jhqwYGDYpP7LWobMVfhBRDCccOif1Ml7+jZcn0Bp2vUafXaptQwhZDKqYZ8O9T1X2syIFulbDDm0fG5DtuScxqeIYNW9LWvPRZt+reWw/gAAAAAqAJmTUxG3rm0f+q7YEPeahij9n/PAN9DFucFv8VGED2YOGSic9XKtJeeb4+TfnT64X8aU4O22slj3AGXN+9ZTezsz7KsBAKAonEOAKiwnPTLk5prj4u5HrBEPAMpJ4MvgT084st97FQDgR0iS5HF5ykqKamqqKA0kBICfQGk7th5Mq3+rJUTe/T1O3W9qDZ6xyZGLwgIoJ40aWH56EhD6vVcBAH6EpsW5gtzo6Lg3b8MN9PW4XA7KBAkBoHQJwajL0PnffpnbYnJ46mQUEwAAQLX5006RsjIyJsY1EhITI99HmZoYoUyq5XpEEQAAAABA2eYEDXV1Ho+blJSM0qiOKu0cwpft4aCk1BT+/eJKAAAA7E8AoEqFBF1drbCwSDRIqJarD0UAAAAAAGWOz+ML8gQoByQEAAAAAICCWiZFisVilAMSAgAAAAAAICEAAABAFeD31B+fFwCQEAAAAAAAoCxVUF9G7jUNf6NCyws4ffpSqOjLuKVm32aYs1oJU5dYKMwTs3gcsrSzD3wZjHsYwR/L76k/tn+UJwAA/A4J4ffCMXZuOcBW0vKGjgs+751Zv2PjOnLMM5KtoFTikzLi2Lsex9KsJnY2ZKFEAQAAAAAJoTojZdU0ZAqa5tPCcIoUKGpr6ClKTgWQZClOCNC0WEyjgT/8pNTUDGVlBZTDt8TGJm12O3P37ouSdKNhbm48elRXc3MTlBtAmfPx8RcKRaqqipaWpigNACSE3zoikB+zQMFvkiIpSvpcmBj03PvR+6jkXJaSRl3bhs3MlYWv7+3zyG0ypLm1EikWRHvtu5tm69okxfvY4wwR4bN2W0LfkY31Ev337Q9S69yrSx2cUQBiwcLdt249a9fWftasAV8dYd78nTt3Xrx+bYOZmXGlLOGqVUcuu993crJc/O+IxMTUnr3mFRuhbl3DbVtnVGIZjh239uy52yUc+dbtZxcv3o0IP125693d/f7KVUe+s96rghs3/JYuOyAS0V++VL++0d9/dWjcuG7ZzvHhw6AtW88ymxOfzy320uLF+wwNtYYMaVcen3TU6FWvXhW/syeLRZ0/95+8vEzZzisnR3DggOeJkzeYgmX+urRu1XjUqC5qakq/xw6tY6eZaelZbVxtPT3WVG5QCX3zvuTjKyrKdevarFQH/ipxdsuXH/S68rDk4+vraxzY/w9FoTEqICFUiOwQ3+NX0kyaNeqhzc2Ne3vn2nV3qn3nOpZOhl7eNyJqdtVP8fF7pWDW11xRg2jbS+x5Jt1iZDtDWYogZdQtbOvKqJTDd1Xg3Vt13sncD8mGxVM0sm02c824EQ3lyKpUdILLy/Rnq3s8Hdn4j98k09OzVqw4LMjLf/o0ZMKEHrKy/GIjTJm6cf2Gk8yDpk5jb1zf0KBB7QpeQqY2s2z5wdS0zPv3AyZP6q2urswElcDAsCpVjM+evf5yYIf2DtOn9fO64vvfisPFXnoXGR8VlaCnp1GJy8zEgwcPAv38Xn11vVcRa9Yeu3HzybeC1tZt5w7u/2fgwDZlOMdr1x7vP+D576LhTBgo9tLuPZfq1q1RTgmhmZOVjo4ak4ju+Eh6y+nerZmFhSmLor4MKr8oPDymieOYmNikwiHet54yX7F9e+f07Nm8PD5aSEjkylWHVVQUZs0cwHx/y3ubSU3xNDLuiRoCABLCn0qcFfQ4kt+gRQsrdQ5FElrK7KS4U/6RWfVq1Wtm+erIk2t34pMDeba9a2tySJLgSsYhWTJ8tiQWyGs3cNQiWeVTaacUe+3estyJWdd0VvSrw/PXj+/NreU/ubnsDz6PIFfI43N+apYigYDk8XBw4mfs2HGBiQcTxvfYtPn04cNXRozoXGwELU3VQQPbHDzkNXly79zcvIpfQmapmHgwbmw3ty1nd+++NHPmALfNU6taMdL0Vw5yM/UhO7v6jRvX3bjxVHaO4Iu3VOZVf0FB4UwNe/fO2aNGrzp06MrIkZ2r5vaZlSU93kC0a2tna1v/w8GR7Nzz531CXkcyj0ePWd29u3OVTTglN2CAK/N78KC2prX6NHdpcPrU0nKaEVNiTDxgNs5OHR2trGq+fh0ZFZU4bfrm/gMWOTlZaWmplvkch/619P6DQOYBswPZtHGKJJN4P/138d7vfAXK9pBzBc9OqmlTS+anwrafCp7d//43iPnBH1BAQqiaCSEjKUWUGH190+OPA5j9n0pWlphUUDFp3iTy4LW3qo6tG2mxv5IDSIpdjquCVNTRNTUtqOubGtRfF+HR5OaVQFFz8/eHZ29YevLF23SOZj3rvxZPWdBWgxJFLG86I3LGDN29690Uhocdtg3YvmnqWp/H7wVyuqauY8dunGKpxnyAzNDtE9esvPgmXcdu6kjlw9tkdz8bY5t8qV1d336XrD3GHUoZucNjaPbRL6YvvLa65lxihNWbPeffJLG1GnfsvXZNJ2v5D5Hk1cGVY+dfDchStOo2fM+WdvV4f95GJBZv3HTK0EBz3doJJ0/eXL/h5JcJYfbsgf/+u5d5MGJ4J11d9YpfyA0bT2ppqqxfN+nq1cduW87MmNGfJMkxY1e/fBlROI6lpenGDZOrVNnWNNVj6lvDR/y3Y/vMgQPb7Nh54cvCr8TFY0pSW0t16NB2nl6+TAlX2YRQqF1b+wkTPh0Y/nfRcF29rimpGVnZua9evav4U1vlJDRUcqFI505Ny2n68fEpXlcerloxdvr0ftIhTNExP05OlteuPZaTkymPmWZm5kgfJCWlSx8IBHl37vgLRaJvvcWmTC8ey8vL//7sGjeqgzoFABLCb4NisSmjFp061+MUHVZwJJ2kBXkiQpSVIaAr/eIeyQKIhCI6fPea0ZfV1p8/2EFP4L9tZZ8xh5uHTHahJFHn0sJjXabPuuFam/3s8N+zgpvuXn/ESSnl3qGBQ9a7td413zz91KgZC5O7H/CZrxd6eczQg6/U+n6YeH7A0gUyk9es6WKj8m734i+n34QZ5enFdZw+OzznmqU//Hfkhq7Ttfy32TJZQPTmwuKrEw74jtEPPz+oy8b5bZqd7C33p21D7u73I9/HM9UFFos1YkSnxUv2+/j4V+SBqB+6fz8gIDDsn7mD2WzW6FFdpk7ffPny/Y4dm5ia6G3bfr5wtNgil0xUEZMn9WaWau9e9/btHCZO6PllQqhE2dm5+/a5z5o5gKIoplRbtp58585zJs9Uo02Xz+fq6qoxCYEoZZ8NVZz0kioXlwblt+qJr53yUlKS79HDpZxmun/f3F695+npaaxbO0E6pE0bu/w87worVVdX24qcXVEPHgQaG+tqaamU61y8vHydnRuU+QVp38HkSZ+737t5nJKi3PjxPTgc1PoACaESAoKiphr1Ki6d3VC3ICII3/ncfsSx6manRie+8noksm5V//3tx3fN2rc0qOBiF2fGx0VESK4yyo4NOTz33EsNp1VmLK6o49a9DfrbaDChQL17Q4MNEYl0wT30xHns5oNWDbbkM7X2HKspu5t06lFTnST0OzRzVL0bn0SLY+/svKwy1mdA6zoUUWfIymE3nM99nBWd33jMxDEt5EmCjm7wtekzWMYT3Ub1tGIRhP621S/r/nXZa6Wt5Hgp23Lqmk62OiSh06GfzYG971NpQq5KXaj08GGQjU29YrWfuLhkgSD/yyukf86WrWd5XM5ff7VnHo8d023p0gNuW878dEIojwXe7HaaIskRwyVrbNiwjv+bs51ZQiYhTJ/er/AgaBUpzKJkZXhMqa5Zc4wWi7fvOO/lubaJg/m9+wFVZANgcktubp70vEGLFo1qmuoxW0KpEkIFl+eXzp27HRgUzjzQ01W3sPh9eoW6ccNPRVnByqpmOU3fyEinmZPVvPm7NDSU//qrQ8V8qAYNaoe+Pl7B+VxdvZIbXmdl5TJbaWjo+759W5V3Qnj67HVAQFj37s2YNFIxn27rtrNnzn6vbwZFBdnu3Z1r1NCuLrsUQEL4nfBrWRnevfjosnpje1OF/HcvPB9mGHdXpOi0R14vcuo3dbBST0yLOnU1oN4gayZDkJIKe3Z6rlCJzyaz45/7J8jWql9brRyOvdHpx4f2K/hrQFI8+Ro2zTadHuuqQJGOzV3u39m2PCQwOOKpz+MAoUNh1qllYcj7UJlv1Fv89Nzmfc+C3gU9fnojmhzGRJ/Xb4I5JuNqSWvvnPrWxpzChMDSNq8rW/AZKN1vTJ9UrmtX70OXTYq2lpZ5Z15G0EzNiKVjbKYu7RyK8xM3kitvAQFv7RxGDR/Wccf2mYU7zffv452ajVNTU3r8aNevzyIyMt7D48GAAa7SPky0tdWYmvepU96bN6X9RK8m5bHA8fEpx4/f6NDBQfoXQlFRrm/flvsPeIaFRTN/CG/fflbYhrVuHUPmz3AlFmYxgwe35fO5TLWbeXz16qN37+KYAFaqhFCuy7xu/fFu3Zoxa1z6lFm2mbO2lny9V3x5MjZuOnX6zC3p49jYpFchkkYIaqqKp04uYbF+kz7ZMjNzHj8O7tLFqVzPily6uHLI0KXM9+h16HumJq2pqUL8diZP7l25CxAcHHHhgk9OQesj6dpMS8t89ixUTHzz2kIlRblfuVguMzP7wAFPOzuzVq0as9ms8p5d2baTqZRdCiAh/NYRwbRhl5bPbj28d+g2zVdWr9OqaVNDdvKTh3czDTp00ZZlUfq21mavfa48NBzkqKpioK3i/3TXgZz+wxvqZMT43XmpplK3tlo5/GWllIa5n93Vplib4/wnyye22ihsO7Rly04NB/YzGt836uNLpIwsv2CXIE676da0xw2V7h16ODm3HeqoP3CrZKhIJCqyl6Mo6tNfT5InK/vD6ROf/thSJEXQHybH4/Kq8LUJ5uYmc+cMXrrsAE2Ld++aLa0VMbtLptLMVInKqMp1kimI0aO6Fg5hHl+4eHfr1nP//DOkKizw7t2XRDRdbAmZmo3blrOrV42Tk5NZVNBAglHDUOs7CaECCrOY8eN6uLs/iI1LlmzABcfbFv87YtLkDUnJ6ZW+AXh7P33zNnr7tk+dw0pPzmzZcnbevKFVZOP8UuibKOan2MAePVx0dNTK+K8UW7JXzM8XfvlSWlqW9NVycuOGH7O1uDiXyyVGJMup2JBbt58t/+/QV0cWi+7gL+xPEwpF58/75OZ+1jlBaGiUt/eT77xLVpZvaVmTxfqlM9m+voEGBppmZsYVM7tq9PcOkBB+c5Rho+FjxWz+h4otSfF0zBt1r9OAFotJimKx2RyK5Fu7jDYnuQXNESg53RaDu9FsLvM3jW/ScOAoK5qQNFSgNMwGjq9LcivwwFt+yLED4c3XnTzSV9JMWPjkee5XDm0IfQ56pvZZ8HCrjaS5nODhiYKR2CY1TPM8/EPpzmbMhxIGPQ/LE+uWfPri1Fe+waK2lpIPm/k44AVLf1ANioiqBqt7yeIRaWmZm93O8Hic+fOGMrvL2NhkL881jcqiUZ1AkLdjxwWz+kaOjhaFA9u2tTM00HTbcmbOnEE/0a1H2S4wTdNbtp5lqv7t2tkXDrS3N7O0MN279/LSJSOYyXrf2CRt71u3rmElFmYxTR0tmL/Qs2ZvLRyyc+dFJiEMH95pxcrDlb4BMOuX+d3KdUqx4Uxpz507uITrvSLLU6qwLyORSBQYGP7kyauId3E7dl44fvz6ndtuFhZldm8saRe0z5+HmprqFR3+9m10alpmzZp65ZgQbvoxv5s3b1geE0elv+IqOmzW+PHdva48fOH/pnAg89XQ1FQRfbu1tKqq4i/W11VUFDt3djQy0qmA2cXFJRftK+KHdHXVa9c2qFK7FEBC+M0iApsvU+ywEJv3eT2fZHP4n4qZ4vB5H+MEm1f4AvNYpmLXBUtJS13o6RsU1cmS88Z3zdTzr/LrJKfSxGdd41AaWsoZ9wKfJ1iY5YWdXbz9aJygU4qAauYyvNWB2bOON93QSu/N5flH4sV8gizh9CVx4e3GCbsbuHWun/548fTrVPeF7ZSrTbvGTRun0LSYqbodOXI1MzPn4oUVzZpZl8mUmQmmZ2Snpma6NJ/weXLIj4tPOX/ep1u3Zp82KrKk9/AuwwVmluF9VIKWpkrzFhOLDk9KSktOyWCm/9dfHZydratCYRYzdkx3ouBaji+Gd1u58rC4UjeAmJikc+fuzJjer307h6LDmYl36jKr2HqvIuX5MSF81pcRY/yEtW5bzqalZy1bfvDokYVlNaPWrW14XM7cf3YwW1fhZVfBwRHde8zlctjSlVteCeHGExVlhYq/E/D583fWrT/h4tJg4YK/8We2TMjJyXTv5mxtVevCRZ/CHaeBgWZ5Va1YLHtnaycn66KV/vKbHaNHz3/u3ntRiioAReXm3Pj+KbgK3qUAEgJUkWyjN2LNCN8xS+vp0trWDuMWzpoxfdnU9vts7rUsug+xmTJlcsC6TjWPsg3q9Zg2bhuxauTfc92erh27a3nihHWD7I7INmq/eKrd/b18fsmmb72MYBm1ndclZl7rQW8JrUYdxp1d20SFJATVp+Q2b5oiEOTt2XP5yOEFRY+m/+pk3c7IyfJr1tQvNrxu3RppaVluW86UvKZYTgvMLANTUWOWp9hwZpmZJWSW/yfaWZZTYRalqaHcs6fLihWHPTwfFB2up6d++NCC9u0dLrvfL5q7KniZt+84z8x27pzBSkryxV5q2aLRZrfTpVrvFVCe3zF4UFsmIRAF3aqU5RrUVNm9a/Zffy/TN+ju6mrDbIFMPPDweCAS0Xv3zPn+cdBfkZKS8SLgbfef/d79io4dm0ybvnnHjgvllxAiI+Pl5WVUVBTK+7MwNUsm3T1/HsoEnnn/DKncNiomJrqTJ1VEi4hSddtQJk6fWlLacwgluUKvcncpgIQA5YnnciLD5WsvkIq2vU/4FdlX+nksL/i/ge+VTyNpNlp48dDCwud/He2/jSCEUVcOxjtt3DlF0q6aDl0zVqzXRI/FjNzRM63j96efd201QcrbTJgw+fNbbPE6zEn4VL2UH3Teq8re+oWpR+7aOZv5KcNp+voGPXkaMnVKnzWrx3/56oiRK3btvvTmTVThVRbSK3lK2H9/mSwwM/frN/z+/quD9JrUYmbMdFu95tjDh0GFt9CqxMIsZvjwTjRNL//vYFp6VrGXJk3sNWZ018KEUJHlKSUUirZvP9+rV/Mv44G0wj3kr6VF13tVKM9CX5bWgwdB0gdl3snjgAGu9vZmhw9f8bnrz3xZeDzO3LlDevdqXq+eUfl9wKtXHxHl1gihSKEF1qihXazxBlON1tfXfPw4uJxmumTJ/nkLdnHYrBPH/+3aVRKB8vLymSX5zi3MfnhRyrcsXbZ/46ZTw/7usOjfvcZGOtIbYJff7P5YWlqq5XFzvYrcpQASAlR/ZP7TnatOvpQ/t8BC5u3txTvf2U9tqEKiXH7e1m2SI69jx3T76qsTxvdkEsKmzafWr5vEPPXx+XCnoYCAt2w2q2J6PmH+xjO/p03t+60lXLPmmNuWM6VNCOWNIslRI7scPXrty3hASI7fX9i1c5ahgea7yPhKWbyzZ2/HxiVLu479Uu/eLUaNXrVh48mqdu+5D6HxbZS391NpsgoJiXz0+OWRI1elL/Xo4Vzms2Ni0vz5f1XkB7xZ0K60XG/9lpMjaNtumqws38N9ddEOVf38XjF5u1u5nb7YuUtyM5B8oWj3nsvShLBu3YnZc7Z9r67AYmVlXuVyOaWdV8MGdRYvGj5lSu8zZ26/DYuWDly//sSs//1gdhnpVyryfgIAgIQAv4xlNGX/jPgpmx2M4nMU9ZwHzN3xl1YJG1hR6iatmnNVKRTiJ0lJaUwVtl1bu28dKra0NHVsYrFvn8eypaOYysTCRXvuFVxv2q37nN27Zn+ny6CyIr2fl4O9Wf36Rl8dwdBQq21bu+PHb6xdM+EnOmYtPx07NmGWreit3Io6fPjK2jXjx47p/v26Ufnp1au5uNc3m6sy1aOc7OtVbXOVkeEVhkZpbiymmZPVksUjq+/3kUk70dGJycnp0sCzfsMJoVDE4bCLdiFQhoV57+62Dh1nODYd079/a11d9YyM7MePg2/fea6irDB/Xnklonr1jKSpuF69DxcN9u3bUiDIo799Gs3QQOsn4oF0I5eExp5zmd1I714tpAP79GmZm/uD2ZV5PDhx4sbLl+ElH19BUXbypN4/0UVEpcyOKeEf3g/B//n+kt8PAQAJAX4Gt1bzNZear/mJDc66+77tKL/P7Np1KS9fOG7s9xpcjh7VZdCQJYcOXRk5svPlSys7dJx569aziokHjIMHvdIzsr+/hEw928PTd/fuSzNnDqgKpcr8IYx4F3fh4t0v+5QsJMjLV1Zt96E6zuOWeTed33f/foDXlYclGbN+PaPevVtUkc11+rS+sbFJz56HfvmSuZlx/36tZ87sX1bXmm/bdk7aQW1J/G/2QB6vDOqUDk1GJadkFD49feYW88OiqNQUT3l5mTIvTyZ1B7w4sHLVETe3M9K+d5UU5WbO6D9qZBcTk/K62dbRIws3bTrFfJxJk3oVfl/K7xTNqlVHzp69feH8CjMz4wqY3bc0blxXszQ3SmNWxE/X1yt+dmNGd/t+B2LM9JkIij+4UHKk9AYiUI0Evgxu1MAS5fAny88X+voG/fS9lqs1v6f+Jdn+79174dpmalZ2bkmmSZHktq3TR4zoXJEfxKX5hFu3n5UokHPYgtyblVuelcK6wdDnRbqn/L60FE9FRTnsHKraCr19+1nzFhOlpwsmTui5Yf2kP2cDhsJ1ZFavLsqh2sE5BIDqh8Nh/5nxoOSaNLHIzLhalZdw4YK/Fy/ZJxLRPxxz4ADXP3MlPnu6D1tyddesmbVIeBvlAICEAAAAP+bi0oD5QTkAAEAVhBajAAAAAACAhAAAAAAAAEgIAAAAAACAhAAAvw/0W4LyBKxQbMAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAAAAAAAASAgAAAAAAICEAACE31N/FAJKFQAAAAkBAAAAAABAgo0iAIAqYtu2c2PGrfn+OA72Zh7uq5WU5FFcAAAASAgAVULbdtO8rjws7bvMzYyfP9tHURV61u7168jDR66WfPwmDuaurraVXsKjRnbW1lb76kuxsUnbd1xo4jjGy3ONvr4mtkYAAAAkBCgDHh4Ptmw9m52da2Sk49zMesCA1iwWC8VScleuPNTRVqtd26Dkb3n3Li4gMCwmJklPT6PCljMiIraxzfD0jOySv4UkCPfLq9u2tavcEh49qqu1da1vverU1GrwkCU2tiOuXV1vZmaMDRIAAAAJAX5eUlJa127/87n7wtREV0dH7cSJG3v2Xl64aM8Vr7U1a+pXx08UEhJ57/6LkoxpbVXrO5XOUhETROfOjtu2zij5W5YtOzB33k6RiK7gJFOqeCD9aEeOXq30hPB9Awa4qqoqdu8x16HJKC/PtQ4O5vhqAwAAICHAz8jLy3dpPiE0NMpt09TRo7tQFEXT9MmTN0eNXsUMf/pkr4aGchnOLigo/OAhT00NlSlT+hQdnpubd/To1Rs3n6xcMZZJKb84l4cPgyIi4moYakmOfheIikoU5gtrGGkXjhMTk5QnyHdtXaEXz6xceXj5f4f09NR37/qfnV19kpQsn/R3hfm5QCIUiqr+xtyunf3tW5vbtZ/ObLqnTy3t2LHJl58++sbxOUsue/rFpBJyBhYN+88Y+b8uenzsCAAAAJAQoNCChbsDAsNOHPu3V6/m0iFMSOjTpyVTTXduPmHmrC1798wpkxlFRMQOG/7fkych06b2HTDAtehLmzadmr9gN1Njnjqlz6/HA0Z8QkqP7s7m5ibSp/n5wv9WHNLQUBk6pH3hOI8fB78IeKOrq15hRX3x4t1Z/9vGPEhNy+zVe967iNOVuN4bNawjLy8jfRwa+p7DYdeo8SE+paZmvHkT3ahRncKRfXz8KzbFFKeoKLd+7URLS9MfjmljU+/+vW216/b38HzwZULIe7K/Q9dL2tMnX9hRV5dMe+F+bNrgKdFHd+1or/izn08syBXy+BzsSQAAAAkBfh8HD3qNG9utMB4UatbMunu3ZidP3ty5Yxab/asNEpKT01u2mhQREed9c5Ojo0WxeDBx8ob27ewvXlhRVg12p07pWyyc0CLayFi76MDGjesyPxVZ1OHhMYWPo6ISRKLKPCq/a+eswsurJk3eoKqquGD+X9KnN274TZ/hxqypTxV0JVexuDK30v79W5d8ZBMTXUnN/StLLHp58fYrs57H5zarLdmiNfUnzKQC+/U7+GR9exc5Ij/swp4J/7h7v8mWM7YatGjy0h76PCLfa2SvKerL/ZfVk+wTBd69tY40fLBtdq3I5U1nRM6Yobt3vZvC8LAjTaPO7pq6/KbPmzwda7uRy8ZPsFMgCTrO++i0BR7XnieI9er3mjn+vyGm6GgJAACqNdwP4U/x/Nm+TRunSB8HBoatXHm4sGrVuFHdrOxcpi5bBjW8AYvevI1e/O/wYvHg7t0XTPVUXU3p2NFF5defDzNr5rexkU7lFnXbtnZysh+uZ/n77w5oCF5a27ef58u02LxZcu5l3z53Nsd5zZpjpZkAqaalQoXc3X8tOvPDlVa8NtvOJB9l4gGR9+RA94HXuMMW+AXtOTFa5szQOQt98783MXHGpYXH4nrNurHWgfDd223YPfWxCx89W7e0Qdi8PtuuZBKi4JO9el7M6z319ov9XktqP50xY9SZVDHWIgAAVGc4h/D7c3M7M3Cgq5qakvRpTo6ge4+5kZFxEyb0lJHhMUNSUjOY33Jyv3qR9sWLd72uPFRVUZg0qVexlyZOWs/UmaZN7augIFt+n/TNmyiCJI2NdSu3wGvVMrjlvfnS5XuNG9Vp396BGWJhYcrllOi79vBhkI1NvWItFuLikgWCfENDrUrflsp78TIzc4YNX37i5E3HJhZduzoRkkbhTVseuzZ9ptuNm36HDs5XUVEoHFkavdTUFL888KE/eMKGR8vnduu3TsXI3sna2aVR+y4ONjocghDe3+8Z7vK3x8SG2iRRZ9zURdcHzDnwYpGdxbcTQh67+aBVgy35RJ7nvMvxHaevHVqf+S6Z/Dt2VpR3YkK+374LQS1HXhjXUNKOx2DEWl+fNocfpXVvrYxdDwAAICFA1XTkyNXxE9cpKckNHNhGOmT6DLeQ15FbNk+VxgOhUHT69K3atQzU1X+1SnP8xHXmt4ODuXTKRSvuT56GMA9at7Ypv0+alZWbEJ+io6vO53MrsoTz8vI3bz49enRXWdlPEatRozpFr+/v2LGJ//P9P8xgAQFv7RxGDR/Wccf2mYW18Pfv452ajWMC3uNHu35i8Ro0+rvYkIWL9hR9SrKcSjip8li8ooKDI9p3mPHuXdziRcPnzBkkPdekqqro5bl23brjs2ZvtbAcfPnSKiurmtLxRSLRnP8NWvzviK9MS9Zk2O6dQ9bGPPF5etPb7+qmFUunKXTfuvrQINmQkFQjxzoa0sUnlRrZ6KR4v0sUfzshEFQtC0PJBk0nBL7MrtOn1oeMIms956g1QeQeC41L9VhhrLZKOpjOy8m1SkqiCWWcoAUAACQEqIKioxPHjF1dcNODDy2G3d3vb9l6tn07+zFjukmHMLXbt2HRa1eP//XZvS24yCchIbWwDsrUI+f9M+T16/fSpydO3rh46a70cXOXhs7O1mX4YUNDJXMxNq7QS4xomu7R859Ll+8dPXaNqcgy1dliI+Tn57u5nR01qnOdOoY/nJq5ucncOYOXLjtA0+Ldu2YTBTcIY+rf8fEpp04u+bklfOq35/vtEJ74fQoMikquFbx4Rd258zwsPKZxozrSvraKvvT33x3OX/C5dfsZswEXJgQWi7V0ycjk5PSoqAQLiyKNm8VZAV4P4ms6taipY9uB+Wk/a2Xmg3lTWsw6fK3XiGLX/5DMjMRftGUQFm07QsrI8iWBQkwzQ6ni14xRPB7HZPzqwBVmaMUMAABICFANbNp8KiMje9fOWdIjvnFxyUOGLlVXUyrstigxMfWfeTubOlpMntz712eXnZ3L/H746CXzUzhw0sSeubkC6eOVq44UDk9NzSjbhPDmbRTz26RiLzEaNvw/Jh4wDx77vbK1G+F9c1OxG/3aO4x68vT1mrXHIt+dKckElywekZaWudntDFPvnD9vKFP/jo1N9vJcU/SMRCUq18Xr16+1u8eDc+fvmJkPOnJ4QcuWjaXD79170bvP/KjoRNfWNiNGdCr6lqysnFatJ/v7vzl5YnG3bs0Kc9kjtxVLTdX811t/uKaNlLewN5LfmpNFK9SupRT+OCRRbKJFStoYPH0crVTTQF2SR8T5eSJpUhC+Dn8tJIqf8GJp1K7J2/AkNJvQkDREzvWb3mwnf93GgZYGsV7BUbSZkWQiAp+lC91URhwca4J9KwAAVF84Ef478/T0dXAwL7wb2sRJ6xOT0g7s/0dTU0U6hM/n9evX6tjRReXXVb9AkP/V7nHy8oRlO6O3b6IpijIy0q6w4p08ZcO+/R5FIkq0je2IwMCwwiFDhy5l4gHz4H1UQqtWk0qa6zZOGTum29Zt5+rWGxAWFnPm9NJmzayrzkZVfosnLy9z+tSSrW7TUlMzW7lOOXHiBjPw1q1nTZ3GMjlk5X9jvDzXFr0WjskqzKbFvEtE0z17/fNpQqRStwltyL3L+y+5fts/MjTk7d2zh4dM81YZ0Km1LKfJ4LaGN/ZM2Or/Njrm3o5186+oDR5qySMoHT2VKHf3i2+z0iOfrJx5LvArmye/1bBWsqe3TT/yOjLmvefiXXtSajlbcGv36djEf/fAucysEvxPuo1fE2lorY94AAAA1Rr+kP3OYmKSmja1LHxqaqr378Jh7drZF62T7dwx6zf4pHFxKVlZOTVqaBftOIj5+NraqtLwEx+foqqq+OvduRZatuzAho2nig2MjUtevGQfk7iYxxs3ntp/wIOQRi+x+PrNJ9Onb1q9ekJJJr550xSBIG/PnstHDi8our5+wvARK4rdD+HmzSfSp9L7Ibg0/7RI2dmCkkTFMly8L40e3dXR0WLGzC2FrVlatGi0bOlIW9v6RUdj4kHLVpMtLEzcL69u32G6tOfTwoig7Drx2snj8//b22d1dKKArWZcu/WQf69MbyS5G0LjIWf2502Y94/FTKFmPYuee5cttJM0XLEYN3H247WjLNsnCWQajenRO/zxVzKMy+jzm7ZNWTnLYkyemlXT5cdGt1IkSMWOB05nTJ63rfWWJNLAvO/WpQubcLHzAQAAJASoonR11cPDYz9VapeOKnz8+HEwUzUMCjxUFXrI+XWSXowkjRA+VRNzc/N27Dhfv75xz54uL19GnDrt3dylgZOTVZnMzt39QeT7+C+HcznsNQUtOu7ceTZ5ygbmgbmZcUBgWM8eLmfO3l6z9riNTb0+fVr9cPpMqtm1czbzUwYV7lFdCk8ibXY7ragoN3hQW+nTp09Dtm47t3DBp6bMHTrOKMk0y3DxvlyPzEq0sDD19FgjHeLsbO3svL7YaEw8aO06xe/JK+ZHJKIvX1olK8v7fBRODdeB+10Hfm0mHNNuY927jS3+odQbzr94aD6dl5ZOKyjzKULaALrG/3yvFBmLX3/gZK+Bkz9/K6XpPODI7QHY4QAAABICVAOdOjn+u3jfjRt+LVo0KjqcqT33H7BIVVVRUVH2N/iYQqEo+FUE80BT89MlKHw+t159o6CgsH37syMjE+Rk+UxaKKs5fjUeEAX38NLT0yioas8UE8Sgga4qKopMQqhZU+/I4fl9+y0cOGhJSRJCGWrcuG5hS+Wz524zK93FpYH0KU3T8vIyhU8JSdtfqnLvmHb9ut/BQ8s83FczSeZb42Rm5rRoOUnaO5b0U8jJ8cvsJhsUVwndlAIA/L+9+/+Nur4DON5Pr4Vrj9pWKGkRJ0Uo4viiIROxfk222ZAAySAaUSPJsmmCUf4AQsBkW7afZvhF0ERFjZqwxGAy5w8mMwQBAyIbMkQRkRbGOlZie+3V693HTy3emlppgbbclccjl+bucxcufZU27+fdfT4frnr2QxjPnly7clKi7IEHN+zbdyS3sa2t/eFHNn32efO2l9dXVVWM4NPF4wNexy0KiorKyiYOOPhpn9xHXy7fq6+9e/KrM9GVd/62p//2VSvvq5857asTZ4qLgzVrlg524PyRb5W+K413zL/n7lu2bduQuysKg2f/vG6Mz+5ciD7YfajvoFg/lgc//8W6XB6sWnlv9N949M7BBwBXJ+8hjGc1NVVvvrHpodUbf7b4N9GatbFxfmdnauvWHZlMdttL6/u/eDwi9uzeMuj2pqbFYWbn6H2bax5bOuj2lpbW5ubWqFtSqe59+4/c/8vbRuTpSkti6Z7MoHd9fqwlirEoA975/kMyfc3Q9/Wpp1ZFlzH76U+c2Hv4zee2vFVbO7lvy969h6Nayx3a8/jxU6dPn+1/eoTu7vSgOZcn+vJg74eHc3nwxusb5QEAKAQuztKlS058uf2Pf3ptx45dmzdvv/nm+rVrf/X4b1cM5/D8+ezUqf8+/8LbRYN9JiZWElv3dO/BW1959d3KykTUDzt3Htyz+1Bd7eQFC268/Kf+y/bf7f/o0x+7d9eufy5aNGf0jg01fE1Nt1dXVWzZumPA9r+/f6D/zU3PvJi7PqG05NHvz6yXb6K4/WEexGIxv+MAoBC4aFVVFX/4/RPRZTx9U9OmTcmd+WtQYRjed++tCxfOKi+PNzUtnjKlcqT2yV62rDG6DPPBNTW9n2q//PNVX4K6usn/O/vXQvzhDjgP9OFDr8ydO+O99/bLAwBQCHDpgiBYsmRe7uaV2gFg48ZfNzRMX736fj+RYYbfPT84u0Ii0bvLSjab7bu5fFmjPAAAhQAFTB4M3/Lld0aXQe9aseKuUd2bBQDIsZMfAACgEAAAAIUAQ1p06wJDMFUAUAgAAAAKoWBls6EhAACWKygEcr9yWUMAACxXUAic19OT0eUAQB7nQRgtV8xBITCm0ukekQAA5GceRAsVcyhczphWqMIw/OabdElJrLhXYCAAQD60QTab9e6BQuAK+ORfRwwBAACFwHmOLg8A5L/9B/5hCIXIfggAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAIBCAAAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAIBCAAAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAIBCAAAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAIBCAAAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAUAgAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAQCEAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhQAAACgEAABAIQAAAAoBAABQCAAAgEIAAAAUAgAAoBAAAACFAAAAKAQAAEAhAAAACgEAAFAIAACAQgAAABQCAACgEAAAAIUAAAAoBAAAQCEAAAAKAQAAQCEAAAAKAQAAUAgAAIBCAAAAFAIAAKAQAAAAhXC1CYLAEAAAixYUAueVxeMdyaQ5AAD5LFquRIsWc1AIjIWqymtaW8+aAwCQz6LlSrRoMQeFwFiorq5OpbrP/KfVKACA/BQtVKLlSrRoMYpCVGIEhWj6ddc1t7R0dnbV1EyelEgYCNBfe3vn0c9ORl9H9VkqKsobZl8ffTVwoL+OZLK19WyUB9FyxTQUAmOntLSkfsYNbW1tJ0+e6kqlwjA0EyCnM5nNZIbxZyEMs0VB8fndCMNs2O96Nige6j3mqEA+Pni0POG9aOD/giAoi8erKq+pq601DYXAFVD9HXMABtiz95OhH5T++uiB46fT5fULZ/0k3nHs4y+aU/Eb5s+eManry4PHTiQnTJ83+8bq2IX/jahDfjr3JgMHGGe89gMw3iQSZUM+Jkx1nOvKhunOc+09YXfnuWQ27Olqa0/3bunIhJlU29fpcCSeCICC4z0EgPFmZn3dF8dPJ5NdF3hMUDF1zqywNV1eN7U0iE1paMicScVraycGJdfOmtPz7+SEqdPiwVB5ED2RaQMoBADyXbR2nz9vpjkAcGl8yggAAFAIAACAQgAAAC7sW8jjqTIKZW5kc3RyZWFtCmVuZG9iago0OCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDExMTM+PgpzdHJlYW0KeNq1V0uPGzcMvvdX6A9YK0oUNQIMH4ImQXsL6lvRg9ce55JFkVP+fki9ZY837qH7wIxGfPMjRanvCpThX1DB8p9R5zdefeb/r3fP70rHSE794NUuaiSv3hTSUhff1F/qi/pwVC+fQEUdyZI6XhVap9EFtbNBL9Gr4+XvvTEWjPGGf9CYExnzuhrj+NspHv45/plEAGqHZEXGDpjd6QhQ2IVc2E8xszlIbB+Ps5VktaVQzSyryc5BCVqrITAdGNJUFJ39IYo+EFMPnl8xNnUvn9zg6K4J8EGHBYsE9hAcHXZub+B0OSA/YDUQ42FnF+AVOgNEvAlCYMyV1/41/ad3/pZoOD1CZ+1JOLFwskhe2bqCuoqUOZJUyLvmKlLFITahqi82BVs/vPrMkUlE1miZWAohv7MPVjgg3AgTBwmzEd0NCV/aylZ230ebq0yxnYNe6AeeJEx2alzOlxoJAxessthG+VqimXwWkS6MYmLsYkRkC85jG4XcrUN0kiAWC5Uz5fKSAMIQBNDRF9T3VPdYiAmOulf8zdpr4w46OluQhMsBsPiR4BOWW4OCGOEor3DfASRJbelqlGPuk7DzWsVzMJaKNRixlhg71sy+YGK9z9cyhDllZlupsI22uWZ3AVPjfAaHJShP4zDRJ2hQ9ScjKbM17RbX1KreQSi3tWVCHZgGO+a/Vm0rFehBrV8z4qxEqaV1RFLpS6MXGw7i5GAt4TnOFayVoqt3d6iqGZGiEnUT7ZyCnr9HML6sVXQW4kzNQKReQbVUpGATRcn6uHqvC2Sp73SBQmBaY23QqqqfMeFxB0m144ASobDEYs+In5iEhbIjX85TVKoJEpnUly91Zy2xqgqbRyIA2xEy2Uod0tjtL4aGYtLqemPajkCRvAnLpyrU/scKtWOFNnjOFeqeqtAq7SEuapna/ejEVAMT6A6wvzO6O+lo7NabdVWO2unsySo25MUlw0C+5md13a0DlnNg7uoyy1hzPsO+Hwp2JkgnED/PLPbayphnqz4J8syl0RNimh4tEE9WkUiFRQeeJHdIpJ0DGSdf/ngD9fu/PHJV9jR6jZMTRm29Y65l0RZjO+5ykCUp9tqsY6ssh9ORQFj67W099QyP9ZSDvVVPeWejnrZyiP8ryO/76sZgUbHwFNCn3rT03t/lsGHZIChH/l26f/WcRm7vjPaxjtxllUfuTqcxyiZ5HRJtWTOxifaOGilob+zI0D894DGZ2hI0U8oyU05YHK8rgUd4hqJH1OSWNsOnPEowx4OXNobzuHEz8PwKC+trl5fWA9DQkxNbprzt7pgODxnsM03otiVJ08ifoZkFyYack3kl1SL7eRJN5KKfOcu1pdBVgGZFYzNLXx5CduS+uQbdjr9C7G/qrguf/P7lEIDtaN0eAtJ8dsqXuV3J0jyxPzsfjJPQO3eK7W6qXVx8ubEKxB22K2tZPrpby5WWB6sdBb5cLwWucDW3Or789hNS74pvCmVuZHN0cmVhbQplbmRvYmoKNTEgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxNDExPj4Kc3RyZWFtCnjazVjLrts2EN33K/QDZsnhSwQELQq0AbpL613RxbUsddMs0k1/vzMcviTLttx7ixSJ41jicB7nzIPsvnaqk/hHdR7wr+ymL/jrE37+KN8/nLvvf1JdEMGB684LPoRemKC78/W3Qco3J1UII8AgFW6hlMTPLNWbos9oDK654G+j+Z3teW1cc6V3owKZHjiDm+GG9iLlomnBaIeyH8DbeAIfSGsYTXphL6Ni+fGkhySn+Df09Gae4gdgwe9L+l7G388/dz+eu6+d0KG33d/kmRFe+u5LZ1yff/zZ/dp9vgmLFArDIQU4jf9qp7pfPu08/KsEUBmhjQOO4EmBsDaFUM1zsmnKNn2kNtDCWLdWKS+qIKAuloK+VR030ivcTwa3CHkHlNZzCrskMBC4GPyEcsZC+xEKPnEhUcE5Vk7UUZk6fjwpwpssqjzKYrS8aqR1tAmtmcqTyLorK45vPf8/qyEVWuq4W2HQXda1mq9pUdEOZq7sV/vsT7rQCnI6bo50DWmx9rjJQtiPJ2N7jFcPbDZxmhRfTTXhubltsOL+bhs6o/Mae+sWEYCoqUSwNlET/UmxpMwjX+SSUiv+IqTeEpcotvzUrCTCkxiBh6Eyh4wi+Sl9s5F5r7uR5BoQiwRGUzu9oSiL6wSgyXUi0z/TY07mlEgltXPEJcpQAJLq6jWkyKwtpfc6isXlpAklmX3R0BxyL4LOqUkcCK4GwkPVjZA33OCCqBXcJIc76CvzoAWZZTPI/OuJ95VwuHUW8TWE/fBA1A6Zf434UzIku++nVUwpBwP3F8WvklzZPWcEekoeTHtpX7MmRzuVuurKbdvhGFS3GAyOEOXvbqq1CFa2klBCPfs3zbWE6sI+rnylSEQGkc3haWHHXtFLg9ZIwC7iclOaCkMfCWOTDNgk18LSM+kjMzN2aKodbgpsMp4NJ4jig0O1leuGN6Xa53ajQlMpE3ljxpmlTe9aoW5CzxTxvEOOdaJBbltKNYlVE7WtZ6tUi8+egwHCeE3dGht7CBmM62tgtMKl19dBKSdXDf+WeodqdmSibmY7XeQxSXNRuNi6vFYjhqQCsMY/FYic9EeiFoxCx3UvQMNqrjoetVZYWtuguROhnIVkZcu5EtXIYWlG8FxbMimMrq07lcQyvzJ1jhFfq1U5XXMdB6mQ+iGTXg8tQXdJ3+5GowPkPvVW2+BIzlx1HfZ4yFq7fKCRS5zMU+1GU4e7zdwsR7C3PWWMdQKjkLFfXsO+FZaguOg2Z5bEgychjAHQiqtwoW9beAhDmrkILkKf6/v+4LSTlg0rprk1Sj8rZu8Yrf6H2e4sIe6NkMEnxBf5GuKt8LdDnI8wKa0wYGF4GKlbSjT9LU4XBdCSjPQ0Qx99K2l+vCGW4KQxY6OCK1Pu8/VgVo4E0vSc5zxvVSP8K3nuPSBwAYTMR+dFvQZ6IxsxZyf3MKdhtJ5xokNyb/19VlwOnEW5lJcZ9cAdSIXsvj1MM66ixKo6kTRHGl+bilnNKtGyIx3XYccFSc8KHPASHCthilczNG4mxO2Mnsm+ntLTSHxkyApYQAC86EMewDE+LxnfCmM/G0++mb2bCsoZ+a/mrO110PsuncB59Ntvb52u/8mtkxUBzEZnTLl0nlUzY9UP5Viq4O5Evbnz0/XEWC4Tc4qmm4wP8Seez0r4ApIA7E34Pv7yrqqFXgQcSde6Sxgb9/GgFz8P7lrfzabVXaAGnJi8b84Yj2vd4ZvexpNUwUw9S9/mxN49pbZS9No0qdkntUQ6V/d6rd3tDFob2zYH99pDjl7f7VWg9oL65JwVHl3jK+ryky+p93ByHstU35d+GXfXPdCe+H7VChkyt7KJfQj1OHVylsa6ya5vd+oZaGv/5+/+AaC8dP8KZW5kc3RyZWFtCmVuZG9iago1NiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU3OD4+CnN0cmVhbQp42rVVy27bMBC89yv4A2Z3uXwChg4F2gC9pfWt6MGKpFySQ3Lp73eWolRbtoE+UttriqQ0s7MP0bwYNoQvm+TwI/PwjNkd7PFifDG2lCjmB2a7Yn0M5tn4mJfJk/lq7s2Hg3n/iU2xJbpoDpPxTqyXZHYu2VyCOQzf9kSOiQLh44mOkagfiQRrx9J9P3yuEOyt+OgUI9iUGAhiC3ND8LkrGLIjegjrgx8P535GZ11Mi6NtdubpCY1nKAnO7JiijY1HPQTHStSPC9EaIMuQSoAW/Etk8+XuyuLr4xVKuMhp3q90PE7k3ITx4YLmDehcxH1+w6nJYCSfYyQ+DkSTECMXuL7pQxsrg5xkG3oQJyulNGzkJexneECzjICGldKhIKQlsGe1ZcUXuOKJadIaueXCVWpIZZ8aNepJcaocDws9QruWCWLFGjEvRSOW8xzG7eLrFSYhG0PY0K3SQAPT4lTVLh8X9WsgIKxuaZ7VseT+Ks5nDTWMHfv97AFNbyQU5RKIN1RVqOZSrWjJsNKRk1BtzfUfSv23LnKx2CR520XDf+mibENxG04ahs7JfinvGpYmWTtr68e1jIp2TvTri6fWUB9+dY5CAVqTu5Moc3v5m+3lfqe95lUkbtlXHe6mjhNyvKOqzZHu2zhdIro8NyFaYC7R5lyFlNhuU6cd75cm6pjavQpRH+e61xxQpHGoxHWcUIXet/nUrnX9ouJwQEjJoR0QEYeL+PWEaNNbhxlOEBF0REzoiLyU2yXH/bufUfKb1wplbmRzdHJlYW0KZW5kb2JqCjEyNyAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQ5Mj4+CnN0cmVhbQp42l2U3Y6bMBCF73kKX25VrcAG7ESKkABDFbXd/mRXVS8JOCnqxiBDLvL2hTnOqlqkIH14mDlnMkNY7vXe9jMLv7uhPZiZnXrbOTMNV9cadjTn3gZcsK5vZ090by/NGITl12Z8ai6GhV8+//r96enjj2vf/p0a2z0Ww2v3+PJcc8k6c0Lo8200THje68Ntms1lb08D2+0CxsKfS+Zpdjf2kHfD0XxYn31znXG9PbOHl/JATw7XcXw1F2NnFgVZRuk4tLVDZ6axaY1r7NkEu2i5MrarlysLjO3enScJXjue2j+No/BkCV/uPFtJRCAB4qAYtAElRLE/S4kSfyZBW5AiSn3ODSgFbYmUr65BElQRbQSoJspxtiQjQr0UqnPUS6G6gLIUqosKBNUlqqdQrTUIqrWPhOoKylLorGMiSfV4VIOoHufwJ2OQAiUg5JRUj8fwICXIRyqQj6Qu8cTXo+o8hVtZgApQSSShU2qQr0Ad5AodlNRBvsWZikDIqeBoiw4qOMrRQQVHObqk4KhABxUclVCt4EFDi4Lq6u4WPpZh9FPH7zN4n1lekSVeQ28c+Wg/s+9GVgiIjfOMKCcSJQh/jaAGiASChP6//LoV6y6/rXJ7dW7ZLVp42tp1wXpr3r4J4zCub9HvHzwCCkoKZW5kc3RyZWFtCmVuZG9iagoxMjggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA1MTk+PgpzdHJlYW0KeNpdlMuOozAQRfd8hZc9GrXABmyQIiSeUhY9r9CLWRJwMmg6gAws8vcDdd3pUSOBdFzlct2LbTc/FsehX5j7w4ztSS/s0g+d0fO4mlazs772g8MF6/p2sUTf9tZMjpu/NNO35qaZ+7uuy5f668+1b//OzdA9/9LX9a0xz691xSXr9AXZ9X3STFg+Fqf7vOjbcbiM7HBwGHO3af28mDt7SrvxrL/sY99Np00/XNnTa36ikdM6TW/6poeFeU6SUDmO9tqx0/PUtNo0w1U7B297Enaotidx9NB9igcBpp0v7Z/GUHqwpW9fnuwkPJAAcZAPikABkW9jIVFgYxIUgxRRaGtGoBAUEym7egGSoJIoEqCKKEVsK0aEFUL0maGXEH1mJQh9FgUInRU2hs4qn0iSdu5VIKrJObqWPkiBAhCqSNLOfXQmJchmKpDNJO08sOuRdh7CM5mBMlBOJOGLLEB2BfKFK/giyRceI6Y8EGoqKIrhkoKiFC4pKErhi4KiDH9FQVFuY1CUQ4OCogIaFBQV6FNBUWn1yYcbpfwYiWlD2p3H3/fh+77lJRnA7T/xPZuNOPc+7VshoM1PE6KUSOQg/ElBfgkf2kQFghoRgWwm9S8CqBEFaM8UHkdmUIGQGWG9wPtf037c9nvicU20qzHboaXLhK6D/eT2g37cN9M47bPo/QcCgx1GCmVuZHN0cmVhbQplbmRvYmoKMTMxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/08d8AMAXstIMQplbmRzdHJlYW0KZW5kb2JqCjEzMiAwIG9iago8PC9MZW5ndGgxIDE4MjM5L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggODY4OT4+CnN0cmVhbQp42t18C3Abx5Vgdw8wAEESIP5/YIDBhx/wCxKkJEoCCf5ESjL1J2RLJEVStK2v9bOk2JIjJ7GjOMluRets1kmcTaLEm9p1hrJiO7b8TeLyXq7W561sbpNUbq98rj17y1tb2b2zN5cIvPd6BiBIUbLldXxVhxZmXne/6X7/ft0DilBCSCW5jwik5ZYtzW354T/vgJYr8J2YOnFM6l4lTBBCA1D/072HZw+cmD57GuqXCal2ze4/tffC1u++QYj5PxOS/KPbZyan6aHJxwjJ3Ab4mduhwbBa7AXwAtRjtx84dvLcQdN3oP40IcZ39h+amvzbw79+k5C13yZE99CByZOHhYfNmwjpawF86eDkgZkTuvWTUB8lhA0fPjJzeEVm4yFCBr4K/d8iOtbJrhA99J1nY9Ayot7pbtJGkQtiJOpHIsQCN6pVyeje/mnyDUJ+x4S35kWY+1HaLBH6JexjArvCHxHI+31OQjlIDiI+e5NVEzLfpXu08Dp7Zf5dqEfm31XrRTzy3fkVi9pfWFIvjvcz8sNF46n1Ep5CUpJCto315yVp5Gli3jSiiFt2jintfqU2P7FXOr9tTGHxyR8agf+pKXmPPxJRSF4hObnvEsggN9HbqNCUIk3sbVRYSpqWlBdHFV1i56Vaasr1T/UrYv9YRBHi+c23jkXkiP/8mKSMjkJTNu+XlC6EuvJ5aU7FnpxWaqFJq0lKC/a3IOaLo2MSUHN+UlJMo2MT0CJhnwmhDEKZCf9EPp/3K7Qhn5cVMjo2k883KkJKgnF08UmgTJ8bHVP0cq8iyr3AR16hE42KLiUDXdL0nH5Pr4Q9SLFfpQCvijDRP6UI9RHozEnnpfMwwVyLPg5MbhqbGPVPbs6PyflIXlKyW8agz4+safM3KvqUYsg1XCJMlZQIVblXBonLvZMK27NXoVNAhaKvb1QMKQlJrcxNPa0jeyQcQclO5BFloo+TakxdMlSSXH9vfaQk+4rUYl2Y1FFoA5CQA74npP7z8iTqhcuL+FGmiuQHIotUgnbkyT51isrrPK7E4CniX2Ct/KGqFGfoUqVJAGX75Ui+PtKoVKfmGOtXpif7GhVzChAlSanKDePjAMi9eaUaa5uhVg21RsUCw9RwkUgggSmYVzHnJqTzE5JiBqE1KjWpka1jc7rpvnxMqZ6RTzYq1tTIprGRLWqjPwLtdt5uS80RS27b2JzFklPoZK9iaUCbBUvunavCSzVcFOoCTQjx0bE5FB5w23se9IvT1kdkeKwI+9V+fARcAVvywMkg0D8IrYtVdR0FzhFil0FaOYWsuUQp5bqyp8gcYf1bxxSL3Cv1K5VgfCYZDK5XmoDpf2C1UmImvb3nJ+ZsYoPy2QZ/FMTkAN7sDY2KMzVH8e4COePdnZoT8O5Jzenw7k3N6fHuS82JePen5gx4D6TmjHgPpuYq8F6XkotyV8QJkLAsNSl0FzpIo1Jf1ukqdd6ldjaUdSZKnUfUzlCKKNUNH4K/MPAXArok4A/vEeAP71HgD+8y8If3GPCH9zjwh/cE8If3JPCH91rgD++plNTNzbQxBdNaJ6Qc6HYix1UJrpdCW21KKY0NSiN4YTM4wKB0HS3Kk10yRsQbYviR+5aSaqlLaa6f01Nn/xgEMmSwtVwy13a3paQOTm8a8Gj/tZOAdy47ObYT12W+mvStkbvm2qgTmWsHAQDFyxMMXjHZ1ah0pJrc3Y1K5v1QwYKnAL0TdEJccalJGkTPB1muO39+UB6EUDEGSwREVggHGUqdDhBpF4Qol1IDaDqImnGOplTkGmbON8mS1H0exluxGEVqUsdSdNACmJIygUEju2nsCSYJkv8JlhB8+V4MpEaIyTLHlgfAhXNL/XECg5m6brDcxDRYX25yGrpZbtIP8AQGsqXPTAJZEN7lAVCmDDMMAH9w47PAeMtMIqshUwdRApSgB8vSXzMqjIgcxTkRcB1VQ+XCXKD7lUU5SNCqT2hykLtBRKtKXYqR9w/Igzgpaq+7JD5kRpMw2TrWJHXDkovUa40S0lVUgRiH2rry1V1V3nJmrWlKRtteXUZJrqiqCUwBlrJcVO8aCBRNKMUBpSY3NuqHJVPqzjfNNVEHOOjaRb2b/aOLerPLPnujJ3pSSlfDjSbsTSkrGs4DbWhfwNR1UUGhTUoTPJHjLKNtFnWCZimDszSBn6mj9kHcgSWkiHgTRjz4UdktcoEhqluGKFRmIZG8RmM/xNauhqIcBqC2oiEia5LQOCkxPQhMO1UHh/QCfNnepLSDPw9dp30dDEcddqUD4OGU0gm3EZRbPwhYGoC1tCip9Sk0YWUEwA2pSxCsANgIAEXgltQlyltGAeAtmxCnH4DNiIPAFsRBYCviILAt9QREvR6AtgNEObQj9QRV28YAUtvyiEcR2ol4HLoV8Th0G+JxaBfOmQNgN86JwDjOicAEzonAJOIMALAHcRCYQhwEphEHgRlOVy9AezldCM1yuhC6ndOF0B2cLoTu5HQhtI/ThdB+ThdCB0DGK0sKPMhryhoAD6ngWgAPo9B5LQu1u2AZ1XCOqCDiHOU4VMM5Bg+vKo16nNf4EydUEJ+4WwUR/SSMoyGcUkFEOK2CiPAJwO0ujXcPr3H0e1UQ0c+oIKKfhSc1hPtUEBE+qYKIcA5wV5fGu5/XOPqnVBDRP62CiP4ZeFJDeEAFEeFBFUSEz6aeqNCxYrLa26AYZxQhNnqyuA43gs4EUgs7MQn2Y5XERSLE9FTIXVMlEqGlwZaOtDmtDjkS7bBmRDd1ZTqs7XKEQXMmSROi01or00uyXNgotzNGv8F0+sIer55+TWCsMMl07Ip89bwssxN6Hbv6FwLVse36q/fpGNsB8NXv4d5yJVBwiblJNakdURKjY9lKMAr3CLQ6yXo/r5FxtZa/HI8wg6shI8rRBBCSSbe5nNZLUZ8vil9Zln30az64FqYwM6Dzo2xs/m/YazB2Yk6c7sv6CY62A/vGGUD0FgCrSVVcMDgb5kTSxxIdHeqwTocoXwiEInIgKLMxV8AecMEl6MStLjHN/44dZy8THwmSeDYapDqBDhMdcKOje4kgOEYY5RQ7PLJd1hu8DTEcL5pIJiMGkVPf3mnPZNxtLrc9nk6y41GXLWhsL/y83RC0+vzCb42SwxY2vFu449WZnkpfxGU/ddruDHgqTGy7w8Wc9qtPvvxPhOsOJMVmQXd2EiBx0pFts6vUCESnF3QzBNSyC7h2jIhUrye7VEkGg8F4MJaMAB0GoI64kLyiUNNtUDMkErLsTLdlOlimo53DLJZ7cPdvUb6/f76htrkufvGxUGNNx5rGv7pMD23vu3u37GO9PvlSY7/jK3VfrY0Wzra1rIq9BFKphZ39NvYSSZKWLFgcFSgRzhCBUYHdA7Tpx4le7xgBUnXjRKcL6tYnktF4NCYafA3E6TCAwJIJOSqKTocr3dYJ+nEjwdieAA4y2MC2Wmq8VmvrioHbu87Orm60mX02S41l49ieb+/Z9e3Z/Hp2XnY6nBXuVfv6T5x2G112V43PkNzyzaN7v3lrEnSKcvwWyLGGeEkqW8flpqMoOD0VhKLgrFZCrF6rx+0ERHNGBLshLiSmTHw2VWDWNP27BwYHH9j9LyiyfxndeWv+4kV2Zdeje/Y8uksV1dWnPr1376cL9egHOL8D5pdIczZ1Y+3xc5ZwLBJTtRfj2oto00fa1KozrQKyM0J/gz4xh2TQW3xy1F/4zRt4e4Najspur6QSE/F5w9/Dyw9JkR4T0OMnddkEtjBCZ/RUpxN2cQsH0pwMSfETX4cci4gGT4N9YVJHyUc1gl79e5z/7+PeAJLRjxW2Ton4XNG3kRaVAleUz4328jn2Cmkma7KrElSnB3tmgigw8YyBikSvE/UzQAQdB9EERsBkeIQIcsk0k0Y5AXaRMKL1oCMvshOurDJ7AoPKdHZwjwTVsTui4T3Hpx7bs+exqal1FkvEY7FlVmb3r127PxvIenYj1d+mp2Xfz2T76smLe/ZcnKw1+izeuNHdc7AH/pmM5zAUafL7FMgvTJLZmBYbZkQ9K4sOQG2YhOxx2R7XvNCqiq0jUiY/DEYRpI7ticYC3ljhpYTXLyNE1ya87ErUf/V5pOvtt7lMe/H6j//ok1UayKtAQzWxZ2u4GakGtFwYfbU4qlwa5erzGh9vsecgtiSycsRmNukIo8M6CPDMMUJLjMRJLN4U1xvcZWxYIdYlxURSsJZz47ZD5EuzH8WjgYB80eQzV/tMFyWfV4r7LCHjL/+70W9mz8Hkz6FZ0C/9vspCqaWK6gvT/ihQlvPGLFWFOXpLlaVkpxeAxyCJZSNeE1uWuiAJxBOLqUvSxVRRvLMTIdln9ouFPw57PQBagga6P+xhVyTP1R/65Aoj/dvCNo8kedigT64yFVro4x6JH39ym30NbNYCOg1nA+i5mnlC9NDME6wyqgM/iYllJgkW2cTKrBEi7mtjj0xOPrJjB17HzmUmulePd3SMr+6eyPzu4sTExakpfs0dyK49mMsdXJs9kFNpQFmkQRYOoAEirUh1ICEdQV9hu/QUZYJpLF3vhHXMGXaGgn7AtckJA5hDKY6V2R7EMgxmPPzTR2/r6rot/TiqSva9aY+73XH744+zK6tnV3ffvvo5rh2wm4IipQOBdPjXRbl0CVUglwwZIMPZwToP04t02Ej1Inix7gyoC0PLGSLCTaSzxGAQxoHeBbf2ogZzPatWwBAdjalYLF4BzqJTiQU9JtCVS6tqZxMriRUQgDGXW3XyNSxNNAG3J1T3Z2/FcpOJ7EjCK7mqaqqrXVaPLE9tPNmrSj53auNqd9Ibbgp6Y1bR4zBd/a+qFlSNBGKuYIfkdVmqcZ64O1kdt85c2K4qZ/uFGatbqDFbayxmvd1EO7maVJWpupqfZw+BrmpJmmSy6Qgsg3EUxTBEejBrPZ0hpVirxYu6urp0XVtrc4cch4Dh4YFfXRzVFXpRzOUrJPDuBAGwBS2yey1VlrDHMdScejboCTZALJbab+vMNKwVBZ3R/GzU5YrafvWrnT6zzWKrrDsTq3+5qNiuPavbxgOp4RpL2G+guuiKSKA58D+K8boRdMw5IYKO6ATQKJoevQe4YOPgDYERvtLjOhbUo0+mSZucqEfb8za4EkkegNtUXQGxyaJ3uIsBG1UGLuIOMa75Nw+3+qMeu6V2fXvXptEdv+o9MrD2UDwYdVuqfLvia/sH12+fbR880WeKNXiCbrkqEmqLN6arpb9cu6s1EXaH3HKFU25ONKTMluZNubXjaeAjBIrZCjqBLDgbQqELkALwxY57DRDtIg5ZjmmBBBe6YhDRVpAIa4tG/V9LBAKxr6Hc6BWIHT5f+Or/4sG5Cp2HqHELcsgTEFfDOBcELB6dGSvmuuraAAFjIWipMaMYr4vBgoet7dLAmU2bzg7EAp5Y/WBdw0hjyMeeg4X+4S33DQ3dt4XeydPih1tGamtHWuidfnWdRX4fZC+AiwENTrA+OgyRc2Gd4N7nSSZ1PDyAsQlARAICuqqsYiifiovvVUg2a9D4nr7WaQ0Z//ppY8jKno96qs1Xn7c7qN3G+kwWf8RhLyTpL2wOnLsGpPsozF1HNjwVD1YJBJLWESUIGwA7bBZ4qBKEcDGG+7MuyBchCSBntF6tI5+tBirrSC1YTBJzkCKdBggNwnL0ujMa3cKJOuEnYshmkyq+8EWg3xYSfyLUeR2S+CfnjCG7PWj8xAUx4mAvxAMVlVevWB2w5ae5wnPAkMPK+iorAnGnrdBNu2xOMA9b4af0JZuTyxWSRNbP5RrM+uwmoBoky+iCYGO1sOUAvRqEotNqJLrdnVy9rL/y9ajHK/8XW5074FQuOoOeGDtgLfwdtyPKqMPj9smBf/tNKOZT46wMPtjEIpCOJcnnsiY37LUqIIwwEKobhOrlfijiwhgeMWAyOV4UrbrtCpYjIJUci69hQQryD0FGynQ7OIJqpIsQ8vmsIxAgJJAMJKISJoWJWNy4aMFdtOi5eUbDM2Xu1mlWhZu4CPVua+4/3JM9lGvZGoz6Prt5c09286YeFgFjzkNG4AvWDZ4ZHT07KPsprDW58aGhiYmhoXEugx6QwXr2JuyEasnerMkLOyGTJgOVRcZcuK4IEIbQuBbkEEQT80Mrz7tnOeKiXmAvGASoNpiUIzCBPx5PqOyVFqIlORuwaSvjjz6icrUtUNyverY3twJrPcAii6hMJQMiT4aPoZZfDzUWcsgb8sjtCnRM/xl0nCTTKkfx5TZTGGLD5bspf1ZegldcY2bLsPJZM0ySJIk4LLGxhW0h6KwUfGH3BctoW5FlVZn07O0+Z43DXmFKVo1s255r9YhOW7U32HVb+4bj2dzJ9SzSkXJFKix6vXHXyNB4lWAxSl5PvXfo7MZNZwZLtvsmt90L19puELXFFcdXkuXtN7IUaRkbDsNcaMWzGu7HbcRvQq7+8GIj/jHsAu9bMGJVFhHQsQSymFVZS0AzhUTpDH9pryczsAkSudrCuDLxfCkoAH+xEqIOUGCbNFt8ogwtn7VEIhHY+zsTiVg0wrdJsF9UlxM1+jgMSxLUmCHSATbApJin8GTV9kxdk19vq3GGAoHdLVvv7Rs6kes9PlD4opOKuuFmWFdW5SxWoSLk8Lvc0sAnNmw/1z90evCRA4b67uK6QxXQdz35/IjiBw5DRgMTRX4O4BoRKB756EC7bm2X6S9au2ggBpGcMVKD4frIYO0aHjRDP8hktuwJFQtUDSsQUFDnkGHLE5MrDH6Qg7O0g12ysKe1cyHVChIylQK34kbgVvTkDEKZ2cl4Z8ChrxQ9Nex00t0c9njCha/zeL0H4aaR3aGwB/IKUdVzF+sCPTeQTvKZrDkJovNSwVAJ+hO0eFUPTssEyiA5BnUbwXBB4RVUy5CDpXTBi8GrtoiMeCAAUP7yqPmsK5UiJNWZyrS1wPT1ibhcGzeVb0Ax+erMLKRjHe9j9a7ol4+F7nC1CmLQaqrQ3RofXufKpweO9vbc1Z8e80d9D23blstt3ZrjYTx3+rjD5IwbKlxugcqrMi3hNtUb6kOVS0I6nm+DsCrAVqJk4w/ClOqoJhw34S4MLeN4KhEuJsn+rFNP1e32LEdh5YlClETi8NEShdIOkHNivSZ+0+fWo3obMl1ri0HbvyXNIqf2zROuV9K5NpdWYcZTrF/H0vPzoFFCfsBeI1H+2xkBtP0/S3tVK/ASIT3ZCsltNOjUrAf5saqLkyC4F3KeUlsp2OWfhHVH5ntINS1OGhYvO9aiBxvczJp0+WyXW4uk/9zudcmeL39/m9cbdTzfeMcC1YUvvGaP2z3Ozz1PinSSHwGdxXMD1w3ODX4k+7xR/i0Nd/VhVW9CHuy7g9yTrWyEdYkOt4GvrlNDugv9Vj9uNIiCXu8egZSuPJb7CDYiijjOI0N4ASPrwRboI7hbxHWg2KW5dAdpj6sf7tLX1fJ1dN7mxtSwepHilxjAGdm9a9XyVrAI5mfRNbH0wfq+BVu2g0yi5E60Za57lIadh2dIbFH7bNGy5uYW8b5mTsaLZv6h7PwnG5G1pq6VvSU2d7Rfh0POlTXWrq1V4NP8zKNbpddZPPgIlx98+JFFguFptqw1/+QHPRDJDd07sv6eoaF71o/cO3Syrr++vr9OvT57dmDgLAaPwbOjrRvq6ze0tq6vr1/fquWDXZAPRng+CHmFB/IKU3lesZDyurWcAglDaXtpKa8g2HtN0liOmA2XEsfyTk0QXjWv+Fiyxx/z7HEGNaRblD2q601xf/BdlX9NIBQE4ucVQa3krxFPuCxNGtFWnLK0y70kN1uMuJB2lfXhY6UV6dq0K7447Vq6AmWWS7uipayrdWtAiHhKaZcb0q5HUCavBLS8K+Z3hwobyhYa7pv06zzv+s6IYhsd+0EQk4dhP9zRUfO8MWvHOFxy1VJ2ou6wwAgIPYwRf2Ipgrr90BB4DyG6CdWji2mLX+tHvyawhqOrcKHydEX1a4mEIf7Hihvd0sGI6LzWfujxOsllsQvOKl9LuGg27u2tsAi7w2FIEKWexn9ecOnqugaUgxf2GC+AHDJkl0p27DoHOuGR4quboB6ojy5FA50LoPMypHy2IiUnG2T+YieDKYaaYfDzntK5nbt0qgWMYQgonviAk3h9ZovTHupp2tjRtXJdR2e+Lb03WG0321xm24rY+kBDMjPUtvLWlt4jsXGbz1ZhD4eErmDIUiP1dLYMJhPxGofbUml2+TpdfkulRerNtK5LpFqRbwtc9rPzpK6Uk8JeSbhfD4sQg/wSgwBfiooHNKWcFLEgvaQiNYhnytFJGTLkpIvwAANQDQyC9wKWtoDVkVo7T0ljuIDFXM7lM9GyTFV9K0Y3uVfF12xrwmS0CVfkQYQGXXajuaryLr/LH+/YTh2Sxx3Oor6zCBV+47Tr9Nz+IZabmBu8b43KmY0fSrlLqSMP47yR0fvLGvPZKvUtEKw32mGVRnHpVaqaREKNvhW9++DBEzxnhr1G1MfckH3sP316f4HnIatXrVoNEN8jzM+zN4CeWrLlqRieD+mLmZKH6MHS9OSMQYSMGPIEhn6jronYpNfdD9se/f2ldtjxAIW1JBlPWh1Wt/ZiSD3NSiYghRIN/LSodErEcyi3mx9uvRTRfUUM24xR67ZN1qjRFha/oov4HUFx/y01SafbuGGfGHIBG/4Kc2Ha5qQs9u67MUadNvrVyipv3G4v/OrncZv9dSrZ7aqcu7ic28hdWZOPCnrM+IsnFLFiEq+xBn6zXK4fK7JZ3B8sh6Zy3UZa44lYrDaucb00wQ8xNcFfcraIjVZVYQ8djw4WU3uDnHQO5toPto+mUIedHe0rNB3uOHd3ZYWW1AvmitXDpp7WHV00hmqdJ2s7V6+gkD5Aboxnjtsxn6cZIE+G8PDnao7MHiy9R1nD36P4tfewnKEAfw1Lx/GVLOzUa8BRavw1PpcDEM0JfA/rKssfMFxkyhaIfzi1Zs2prVv5NbtuXRa/pp3f2rfvWzvV68nTJ06cxi9fC9AhIvwcuDYbhzWR0WF8SQEp1hlBfYtSPB51EWc8rh2PLrz1Uj21E8yIzEfxLHiNxeqVreYvW33sCr5X41H3l4mKhLsmYNxZgXM2w+X/AN91pCnbAFNBhNCdKW7bkXudruz9L8SIpFzfLmpvAdTXv+0wo8Z0iYaSQAyGNP0lxIPCX/pCtl/GG7L1wVUeW8AVdzgS002905mezrN/cxBjguT12t+u3RRt7E1KnqjTEnYkmrr2rFn9yVUPcL98l74BsmknZ0YUM9hsIwQ1vaA3CBDUBKoXIPRjcGP3gFWKuyC8ORaHkHQJH1YMyJlgQaF63Y2fUgNjO2kH5uJgqWpmv/AKSHt3oL3cKee/s3gwr26K6Pi2pt6To7Ehfzzqcbgb2sNdck+TIyT4rC6fqeqRVzBk0raQ5PkMfaZ7snPdgZU2iyPqqbVEwqsSmW4jNYbdZlf1X6CgIn6P5wLa7E64HAOZBCAPBu2F+S8w9OCj+HJLXcgX3iGEgpgAJiDAG0qrePHdTYeqRqq6YTqS7mBbgaB6jOaF37sSFtptD3uj9YUr36QpJOGTaEmflD0uG73fA274V6/y39SAjq4CPRkykM2lqWDAX6cIVNBRsCiMGPeADkD6BgGXH/2u4s8vyl6jZ0hHrDMWh1V4qayXE3bx5Vum9LpfNmAGsm3f6vVn1iW3+Kpqwl6bv16qG2oYTrtjXpuzMhmhYV3ETSMo8n+321f66M9X39mTO5LzOE2xGlvQ7ktk45m+qqoKY33QpPt3px85/uNKczFO0N+zF3hun8mmIZKCl4IBAVtMmNV+M7Hwy4DF6XftojeeWmKp7ZyRHcOS7HvHTHbtndn+/SvTDxyrqvRFg561+7xt2XBvb3NLT08LfWXtvjXwb8O9g+u+/9WI4A+6IgbbbdmGwtcH2tsH8MvjSvf872D/j3EF3xBDXNl1TThxxBfettDST4UimhHTf0qKhd8aQjZvXHy78C431tvYlYiv2nz1WRvYqbmaFlBK6jsBnPWnrIbvz9Zr+0kd1X5QxVd2SGUhrDrx8NAJGal6WFbens/aeKwN1wQ9ThiougNjrU1d3Is/lJLZkvpMOBysDi6+0AfCQStCcCmcWoBBLoH5u8kvyBGI+IGs18rfQwH18G9KdZpkfRRfl7g0eaCquHIMpZDv/EU0E3T5auy6gNNqrayqDqWcqTbLQLvdWVMtMou30mrQ19Q4ZGdnWt2Lr4TvC+Q8sOTNuoq/CNPe8iGb+JOwzBK28gvMLKK/jbxHd9KDpJqEtN+YbcMRd/HfmG3gvzGrbNcG1MbD4baB7z6ODvz4e1H1ECVCtL+30v6KatzS/b8heLyF8H969kt/hPefDX72x4Vo4XV9i+5RwDWgpIj2nPp3Wfothej8U/qWhb/cUj+slQ2Bt7yDv7mbH+UtZ4mJfIwf9kUywo7i7w2v0/9TfvZ04zG63x/nQ9PXBvQ9fQP6Xrt2bmr/w9Hzfh8hrc7N/uHmaGDvXZ/H/xcfdqvGx7+RWvb9G/PCtt087ewI5p3X6XvpD6s/9h0SEr6P77uX6duK74o/5LiHIHv+OHV0iPQw4fpz3oge1veHpRX2ECF26gbzD+P5zpLPO/yc/qOV0YoFW6Lm97cr4c9UusAOem5qnr0fr+4/iG0UbYBeujEv9A3Ynd6Mbr/C/wr5+nOP3JzsPlScJcvHj49qbvb5a8cHHdfS/UTPPKSZmcC+f0x2shxZyWIQI1eQbvL/6YdayQDFX7Mv/fyWrKQPfeBh2uC7huwnfwrlv324QlvouUXl5aWFmW6qDLHvLSrvFItg/g+V3VC+eZ3y5kdTdE1QntFLS8qnrlueWVR+f3NFXCk+VlbeuFExTH/I8jNjdlF5pbxUdN1keca0cVF5rFQuf9BSaeSl/ppyufJyVeA6Zf9HVP616l+rz5nFJeXc8sXClpThmy5PLpSazAcoA6XyYM3LVpf1G9a3bDttl23vfJzFnrWfLpVvfODyKu7EWD+5HXZrf0JE2LHVk1XkcxChHqx24S+f+X+6sReWGarDw0AbX3IQpsQGNRVmxEhjGiyQNprSYB0J0N0arCc+elqDRWi/oMFm0k4VkiOHyGFyCnbad5BZoOYYkSBOtpBWKBLZCi0zcN9EjkP/FNlHjpJJcpBMQ9soPHOI3An9U/ypHsA5BviHoP0o1Gv5aMdg9KOwu2yGMgtjIMZxsoc0wVOHyAFoVcc7AuPcTRoBexLw9gPmQYDu5r3Ny8w/APcD0LYfaK8jKZjvbm10iWyGsY7C9wg5AVekdQDmOsip3MifA56kwLWjSkGg69q5euHp/XBPQ28LL6uA+72kH9pWLYPfWHpiObkV+7ZzCo9CP9ImlY1+oxGLMlUlehSwUHOHoe0oPH+US6SJ62AW+m8BzvH0YuRp8urmsTlKv5BXqPoHz4fniKH38mA6LJB6BJ9aaUwYbUbBqNb6xBYxIPKaqfeK+cWKF3UvguFUQL269wrJ8sLrAumbi9EHN40p2QfH5oTpvrkE1p4x3gdmln1wausYouTh81S3sdboMApV9U/T+U8rus/PMdL3hH5aJH19/xdd+jK4CmVuZHN0cmVhbQplbmRvYmoKMTM1IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/09l8AAAFatREAplbmRzdHJlYW0KZW5kb2JqCjEzNiAwIG9iago8PC9MZW5ndGgxIDE5MDc1L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTI0Nz4+CnN0cmVhbQp42t18CXQbx5VgVXWjG2g0TgLgAR4AGwdJALwB8BIFAjxEgiIpUQchiSIhkZJsnZFl2ZJj2bGc2GKOSTI7mWTWseNjcr6ZNOV47I09iZ4n8WZ2vXGSSZzEmVxvPI5fsn4b7yQZ5yC4v6oBENTlYzzJe4sy0b+qflf9q/7/VQUZYYSQEd2JONQ6Od3SPlNxfxRanoK/+f2nT3l6PkdEhHA11D964MTBo6cX7jgL9S8gZHIdPHLmwNnR//lnCJmfRahx4dBidgF/Lfu/EOpqBfzYIWgQ/1K4DeqHoO47dPTUrff+k+lJqL8PIcMTR47vz55cuv0bCCUHEdJVHM3eeoJ7yTyF0MgewPccyx5dvPWeyXuh/k6EyL4TJxdPdMcmjiM0+hPofxjxxIM/iHTQt0RmoCWtPfFe1I5boE672MeDkAUeOF9FUweGFtAlhH5PuJdXBYT4B3CLB+E/p334d+Qp9gqHXu/TB6ULdVF88i8Exlnt4h/IfZM8s/obqBtXf6PVC3jo2GoXeRHaf5tvv2u1bV29MN6r6P+sG0+rF8dTUdijou0zQxmPJ/0EMm9Jq8L0rhm10602ZOYPeJa2z6jEn/1veqRH+/cr+9xer4oyKkopgxdBBqn5ZETFYdUzfyCikrBnwaNemlL5wK6LDVhKDe0fUoWhGa/K+TNbd894Fa97acajTk1BUyLj9qhdFOrKZDzLGnZ2QW2ApnzNo7bS/laKeWlqxgPULGU9qjQ1Mw8tHtonUShGodi8ez6TybhVHMpkFBVNzSxmMhGVC3tgHN6fBcp0qakZVackVUFJAh8ZFc9HVD6sAF2ehWXdvqSH9lCK3RoF9Fvl5of2q1yTFzpTniXPEkyw3KrzA5NbZuan3NmtmRkl48141MT0DPS5KWv5+SOqLqyKqdBFRDRJCVBVkgpIXElmVbLvgIr3AxWqrimiimEPJdWY2v8Ej/Z56AhqYj5DUeYHGan68EXRiFJDySZvUfaG8HpdSNooOAQkpIDvec/QkpKlemHyQm4qU9XjBiILVIJ2lOygNoXxGq+rPngLuddYK31JDjOGLholDpTtVryZJm9ENYWXCRlSF7KDEdUcBkSPR5VTY/R1AJRkRjXR2laomaAWUS0wjJWJxAMS2A/zqubUvGdp3qOaQWgR1RpOb5tZ5hcGMz7VtKjcGlFt4fSWmfS01uj2QnsZa7eHl5EltX1m2WJJqTibVC0harNgycllmX6Z4EvFLtAE55+aWabCA26TS6BfOm2TV4HXCrBb66evwFKgLRngZAToH4HW9aq6hgKXESpTQFopFfVfxBgzXZWF0TIiQ9tmVIuS9AypRjA+SQGDS3rmYfrHbDaMzCiZXJpftgsh9ULIXQ9icgBvZaGI6gwvY/p0gZzpszy8zNFnRXiZp8/K8LKOPqvCywJ9usPLIn1Wh5f19FkTXjbQZ2NYKchdFeZBwoqnWcWzdIFE1KaSTlex8x1aZ6ikM1DsPKl11oaRagq9Bf7qgL9aoMsD/NGnF/ijz3rgjz4V4I8+fcAfffqBP/oMAH/0GQT+6LMB+KPPcNjTx8w0EoZpbfOeFOh2PsVUCUsvTG21OaxGQmoEVmELLIARzzW0qGS7FOoRr4vhpty3FlWLXWpL07IOO4dmwJFRBttKJXNld3vYE2X0dgAeHrpyElidV52ctiPXF1g0GexXupbbsZMy1wkCAIqvTjCsimxXRI2Gm8v7Imrs9VDBgvcDehx0glx+T7NnhK58kOXo0tKIMgKuYgZCBHhWcAcxjJ0OEGkXuCiXagU0Hrymn6GphlRocalZ8Xj6lmC87vUonmZtLJWHFsD0qPPUaSS2zDxKPJzH/SgJcFWZJHWkevDJCsNWhmEJpy5fj/PUmWlxg6TmF8D6UtkF6CaprBvgeerILn8nC2SBe1eGQZkKzDAM/MGDzQLjXWUSRXOZPHgJUIIOLEt3xagwIuXIz4iA7ynNVa7NBbrvKcjBA626QF4OSh+IqLfYpepZ/7AyQiel2usrio8yk5cw2jbT7OmDkEupzzd6KF0FFQh+qI2WRndNeVcz67ymFGrbG0ooSRVUNU9TgMtZLqi3HxxFM5XisGpNzUy5IWR6+jLNy83YAQt047rere6pdb2Jq757vTcGwmpX6HoTJsNqd2gJaKP2BUxdExUU2qw2wxspxjK1zYJOqFkqsFiaYZ1pow6C34EQUkB8E0Y88nbZLeWCuqg+BbxQiYV4M3kah8C3doUKchiGWnfIq+QlkeekyPQIMO3UFjikF7CWy5rVTljPm67RPgrDYUeZGgV4LKzG4ZGmchsCAXuGIZYWJDUepiaspgHcHL4IzgqACQAwBSbDFzFrmQKAtWyhOEMAbKU4FJimOBTYRnEosD38KHi9AYB2AIQZtDP8KNbaZgDS2jIUD1NoF8Vj0G6Kx6A9FI9Bs3TOFAB76ZwUmKNzUmCezkmBLMUZBmAfxaHAfopDgQWKQ4FFRlcSoAOMLgodZHRR6BCji0I3MLoodCOji0KHGV0UOsLootBRkHFPUYHHWE3tB/C4Bm4E8AQVOqsloPYOCKN5nJMaSHFuYjg4j3MKXu4tjnozq7E3TmsgfeMWDaTot8I4eYQzGkgRzmogRbgNcPuK472T1Rj67RpI0c9pIEW/A97MI9ypgRThXRpIEe4C3A3F8c6zGkO/WwMp+rs1kKK/B97MI9yjgRThXg2kCBfCjxp4UkhWkyFVv6hyvqlbC3E4AjrjUAPsxDywHzMiF/Ii6fHacqssIK41ZO/wtjttDsVbH7XFhHLsikVtnYqXQHMsiAOC09ag4IuKkptQOgnBnyC8LrevUoc/zhGSyxKePKWsLCkKOa3jycpnOMyTHbqVO3lCdgK88lm6t9wMFFwgemRCZQkr2EN5GhqcaNzvJaIrFBOU+gDMGetodzltF2wmk439wTd+lsK5ToRXbyPjq18nn0AyCiwLC4MJNwyM0U66LZ0jAOFJAGVk9HOiM7QsoEESiEbpmE6nQ1COu8odDU4HGS+zS/YyP/yBOFDN6iq5kXwZVaJq1JgIVGOes8BIZAzxQDWPDyCOc6QJZsQ6gvVlik6sDPnogPWBYNArsme0M44p7eXY7+XIjXZZsvDp3JNj+jKzGQxdr3dBAxZzE9j1Pg9vshoNjz/uMMucwJH3OIyGldt/iHcgpqO9QNQe0JED1aAAiibaHUARHoMeXsfxiwjEPwtcO9IC1unQrCbE2traQK0/6AU6RKAOuSh53rxEve20KsYCiuLsiMWiJBbtBNjWQazjZ3bl/o2KFxu2zXW2+gZ6fvzj2FDL9PbUSy/jxV2b9mVtJnKnybZnKrqt7Osbf4cHN+ZaBweHk7lfUp22wk7+CPkqakStCbAwzGHEnUMcwRx5J9Com0M6XXUaSObnEM/X8OOBYH1AAVqqQsjpoJILBpR6QXA6XK6O9jgIsNxF26lIA6A4JlFyRDSY9fqpuS3n0+Pnp+Ym9QazQTQHT8bmHpzb+4ls1+EQucNqMBp10fELOzMX0p06WW+06quU3Y/csPjXs54aRPVM5foAyNWKqlA40cjkyGMqSB3muIIgbTaEbFW2ygoXIJpjAtgRclHxlYjTTuXHBIh/cH5g4Pz8KqYiRKvHTrcf3vLtb5On5h6Y33//rCa6lTsevGvL+cmVL4K8KA0GoMGDWhLh62uUnbHU+bw+TaO+q2hU8ToLgM2LX6OL5ENMl8fZgrmIvez5YzzRa5dNVo0cWFXW39MvqkGUp0kAmtzU+qFOOEwWoYef1WGed6TB/J0cJceNKhWgRxArCva1Nr2juHy9+Nd00kexh03+E5vJTEk6Qp6ymWTb76105m/RLkpMwYZuI8+gVtSf6A1iXge2Tui6EM6JWEA6XtAtAg14DkQEtsTzaA6IqWESakXNSgBMJainFuVyXmE7jLx1RhaLRympQGkHudFmiRzrPvDI3r2PHIjuD5ptRkmf3rb9nvHxe7aHdtbfb7LbTV/GsARetUl19YAEqFUVBqvJrmucuLB9+4WJCucz1E0V5HgS5FiHmhMhmSNAbsGFLAo6UuJEgPA6VFvmV8r8+cVqEzT5eQtA3g96KUCyNmw3mey5G+FhttnNJjv+SJkJBGpeuQvqJtyUe95kt5nJOVrLvYSrTPaibtHHgSYTqky4TJiRRA3t2p73vsIU9uKAK3cV7eSH5EtIofx5bBKHqVfCHIJFfw7c/noGFaQ4/QF/3lgK9sEJQdAGV2Iu1GPiWDl5FiYy238hmYgs/YKap80kWnksYFjJ1HRWmOmSQO4+E5bxgZXvaSYk20Uhdwu+YCFFGs8Cv9XIl/BWSAQRPMZDiCKONC6SVo3c/qBTJ5avURbEpSSVYyb2wxa7STTxuWmbUbbaZKsef94qk6es8sqdFpvAk+TKc0ar1UjOm63GlSdJp2xlfoba89fBni2g5LpENV3dedMFL5M33UAgUM+DaHzrrNXlbCYlhgqO+us7PprNfnSH9p0Yum1y8rYh7fvfH5mdfeTgoUf27Hnk0M4L4+D4tG9U9HWN+RgCnlnAPEiHR3QdEVjWVB40zcXjTidIpcZZ7a4EXLsSEMEgCv5OKZFJh70QM/AnZtraZuLPaRH6lZ5Nm3qee4481bG7u3tvLPebwsrOfXLbxv6J3E/X6AEPAPlHO4olOuohNGAWY8Hjgdp0eBHWNTdbGmkbGxvbG9vbWqJKAFZJBQ24bG0HqbgC64jztjOKRResd1c51080BHKE5816Sayun4j9yGoyO8ANmbt3daRi4S6MLbZvKH2+zf0vhy06vajnrZsmh7u1WEjpb9sRS2Ttti09/e0SDnMNg+HuNOUGIx/ol4B+o5QTxPGI59A5Jl78TuCCzIHGq9Ms+lF/XqOjNhdFnUogUh+g690VCDL/A7EOtExDSbCZXO6wqMcCOyivJUwX/3S8Uy6TZWni5k1zLeO9iZ2x7oOpDYc9Focsie5dbaN7ZraO7OruvSEltXZIZtkh7RiMh7p9ZWXNm3ujW1saAzbZWCZ6Gga6evqrnOEtyY7pVs1H1INuekA3kBEmaqnwOQiLVBGahQCOCzkUxZdfMI4Sw8g7Ui9pBKk9Rz3Hcyz+/DOsEpPJsvJfmTQXrSa2NGAuBea6hfw9qkD1iToHYT4SlueaS4LvClQeDPLMDkHlWNDWZ15iZWUgJrJo53K/5q0Gg4XP/YazG52GV1/RWfTk721GUb9yl8EoGcjtgmSyulYukaTByOauBc4+Df7Lh9oTLTRD8VZJ4LwgzwNfTTjmw9Y7Ch/4sKAvkPdhIsfMj+MYQZxGkItSVB5jjw7uI3byQ85iKBf/5m8MToMFKk5ZsnJf+bShDLK/Tz2td5EvWc3gywxSGf5cbnsZ0HmnIJhtkmHlK/hhB8ZGQ26W9LG8NAJ2JhMjuKswOvR34Mx0PB5LqxVTM4kaARRUni5YW11apInDXJ5yd8J7eT8VLkNirqgGj2cSjhpIi2rCNSG/Qj1iwO/Xl3rEaHR9IKXckpiW+BRcFP49y9ErF3pThzf0Hx7oW6i0me6bbmmZ7uycbmmejuJVCEf91AhSkf7hs+PjZwZ7WvohkrXEs3098/HYXF9fNg68TgKvEfIveV4rC7zWU16BARdlhZujXJXyWsN4vbyfmm0eSXO2V/Dq9wc0XjU/B9p0OtYFQWDZfjmvdx/ZsOFwsjtbW9iauPf1tDBeo9uaW6ajxDh4Zjx923B3S5KmDeQzLP35fltfTunK9vbNxaLzjFlmi6Bb/CPQbYT5kKvkzdRz1JUmzvBaBIX9EDjyOYMrvwEJBAPrshsojAlHif7w7i1tFqNk0ptkS1t1fHdne6bbF3KKNr0syubWbR2jJzcmTqWJ0elzGu16vUkQDV3zPX3zcdnIm0XRItuC1UNnx0fPbNL8uWabL17TNl2vY5uut9U2bdexzf19ycP9YJu9C1Ultgnf5EVIKmaokoabE8Bb+uxQbwv2Q74+Fsv29c7H4/O9IIAiv3gV9OWBnU5XIgotkCfjc+xuVYcWqZdiimLWx81BHKvhxr1eb6O3wUV3Cl6Wn0KiXFAS09D6XNVVDqm1NwopACwbOfeett39rePlRkmySp5sbPPp5MCRDX03JHHuR/vNeLuuPd2Abba+uXhDncEqGaVge/KWia23DXQdGfvCVFofSSlAI4gRbyM/AaoPpNVa0I4fCSISBXROj0WRbc9caQ42QQh8PkLl1OKcBLSkFPCgGfqB38WSNzSsTIJ69UbU4FN8EB8Ug+gO2QWnU7O+K6JEh+YwCwn5T5UTRpvNeIJqaVS2WuXR0Q3VrVbJYHKZyOea/AetsmzNZVk8ecBmNFkObhyylclWncD00UVqQB9h1IdGE8MNVUTQ2YBMMibCngXY0OmYFurSelANM7QaqhrmEirReAQ2q5G+SG+0A4YIBfyRgKGYqDKd0AjNtqNajH4DzpDItoF3jCqb47xo4AXB5uyPZRYrj/QOHU8kjg9uvAFc40M729p2xmP0O4ZXbebc5MTxHnu1RTRIAicaKhZ39Mc2aKa4MZygbjKa3bBhPlqwRIwm4evnsO4UFEk0ebR8nq0mjPk5HWO9NAWvhwz88hS8UyPZdoXHwx+eobroTzalm4s+br6dcO/I5P6VqcE9sKUhFdQq5NPMv/0gFEerq2gApvsv5AHIJWB2LIKGnoFWwzLGT6yuqh0hSvt2+HoFaPfS3NxTrhd5RDcQzHvTaJX3EOCcFV7L96ihBMXLfLM/v3bEcvyK02Ay/DBdIBZ7DbLRbvz690NQMf488ZcldHb9ViozysbPv6z5X6AFfQhoKZxFua6zI/pQ6VmUNtzKjKYLLgl5Qxc683fRFpbKaBHLRReUbk4vCpxOV56GrEJzfWm1DXqrEG2kKAKgEEEowUhUrWtH1HEWOjPacutCcZAQ1StdbtfR69XU7NTMl6ZQr2ynLG0sKLsv0TgaKWp9T0fPNrvzRDfhju/O674iOd0w1JB7+QpDwJfod09jrCsWThZs9FewNhU09Zhmohrj5UzLRUutK1iqG3rWGtkmKd+TSZjenBlT/vDHd9plk21gMLS5tcjQIoTno7tyLzCCFY36H65RD5nyWlwLAu2X7d3q3sreLZg8NTJyKql997VnYrGZjo6ZWCzT/tjZoaGz6fTZ4eGz6T4aaGi4ic33aTRMgm+LgF3R2Nqb6MonQyxeCnQrW16S3FBxVuLx10tvrpTSNdKbnmxNQWZV+3qL6U3ztijhUreMpW8ZjDfnXmPr6n00yxlsieWao3t7e2ajnbO9vXujed98rbx1jYu6kpCf1pzyVfLWK3BePzewvfG89dq5AbabVk4x+zCvJQcD4JEjl+cGmr2fBH5r0bnH3DRS5pktL3q1om1rwVVbDrAdwWDn5Nzly6IQgtcQ1q0OJhkafbXVUYtq/IF6x9qhXL3Gp/NylcfxVo/VqKsx+UdbCjoun91IjFYr7D+6dzX/+9p6mOlOY8ZbE+Q9nwHeOtj57tX3unXpwkkvbHVDSjBU76Pnu7F8AM3vcYPrzuTEtT2uK7/HhYYmkyDJUu++1pFk7/Te5sn20M46gyQaJX1FMtCSIkOpzsHQoc1nN+01mERBmoiEmposztRA44DP6xNNskHQu6vD4YYmm8nT0zqweTfjgR7OdZAlSFSyaTXCJK/jdefBx3IcPyuwoEm1VBCsG5IkilA42lqHiNbwiukP5D4+X30Z9cdlNgflt5DmBK7MfgrZ0aPV5YJdZzB5XO6m4Khss8mjVCMLRptVxl/NLQfcOotkLpPaQW80E2JHusftRtnCbG71t/gX+A/Ijfo1a7LzsHnALH8r+Cm31kjw+ZLGTEJmJ7lVfr9ft37d5MMdY4DV8Au2Y9n5o5Ss8aHhzWAcf4BI+tK+G27Yh6tYVH1pUzq9icLaucgqxHcJVdFzBBcubu3r1rb2VaiqYW1rT/fTAuykO0u20rFy/AM7/xXeopes/Fc5qwW2+J/9HG+RiMFsNOhznXojliT8LNHzsg02y4fxXxiMmq3C/ORZmD9Q2N8rNfKV+/u6kv19APn9wUBFYe1QgoJ0a18grIQu7eihgzxp4/5KZzUYzPz5mymRNu5+zm4yWLh33wKJiv7284KLSFYzlnOdQJdkwJ25Z4FkowE/K4gmSvE7cKisLPdd/H4HPXtZ/QN+mvAQ4zyJmvpKK+REBMSGqZfP0+lr8q3Ph5i2OuPxwiFSeXwtI3raLpuNH/uYwWK0i498SiiTLYb7PiJZTBbxoUf8klxmfua/yxbZqP/Wd/WSbDf94z+aLEaj/jvf0WyqC3JLPWpHicSGSqzjZbAdQk946Y3AOVEgpZl1TdHUKpks21EbmFR9QyB/Ep9PpLU8uugHosKVtpY3tu/b+o8NNY1WOAln1gtComc6W7k3vnMXS1NSjWnITogebG5k8kSP3WKyEr0kccqhXUpTx6EM7mD2+PymscZUADeZbJB9Qpggj8Hepx7H6L0ajuEsQlo7/nWxHXZJtJ3mrCTIclZSzFkJikM+UM3Oct35OyPGcjW7MsJz9PoINqxWcARWt7XK5QBEc4DeGblKEgMqCRaBtCO9jheOxGNHJyePxuNHJ3fMzu7YPju7Xdr78MFDD+2dffjQwYf39j94YenBB5cuPMjsmv5I95fkS8iFKhJOq0TwJmiERZ3PlmnCal9bxXnziMXjsfKfWsrMJvvtomgC5/QZyQzWK+fP0UfHeIcsmvkDAqFzTACzEvDZgDoTbVWgd5qYYx4T/lxhQ0t55vmS26kGFAwqTZ109axdToFdFlgtUlI4jxBFL/4tOLrcBbNd/7Ou2NbRts1lRovRoReqDvUvnuwbegJ39NhkE0Qko7TaN9c8ONHSardKglUf6zuWid80/lz+7ORb5CmISSe1fDtYMFHYofKYwyJ3EKxUmEWC4FjvECMQvzDHw8Yd0xfeCS9AULsWvubgO1B7p99LL5m0hLuYVJWc4RbSi/zK9OaPRbVV2YFj2d6BE4OhqWqzXZZNTWOtW1vbJsNyQCdbpC/nfk6dP56yWqTHBfxk58Lg4I291dWSWXYaI+Gp9viYIsIakL5NT1HpEfCzYJf0zJawew5221THboh1sEIhYYDgfBCVnt/W1rBECcKUWMwSlHx+ENWUhrX12OHtsOFXgZyUnV7TvSDbRZyERWdL5f7s/2IrjUNfpObzRaBDj/9ahiV3EidAJ/HVHP4x0BNDY4mRDsyJPqCI3qBfQ9yCoJsFma+JWzOpGIr64opfCV4h64KwC9Jes684PREu3EOKdAOw4WDvwKmxpuk6QbTJRmPVhrruTNu+rXVRb4VoKcMhAuKOUKHnXq6vGvHjb3YfTAwf76+u4i2iVGZwuCDdHZ+1W+Qyk47DVslCLy6fM9k1f4BfI98EeYbQnscqmdi1pKJKB6kfxxNgjt710Gxhze6qaCZ3vohR2plJlLGENlTT5KunempYdweTz2TXDoxElryvT2cX5qLdC/3pQx2blub0OpO9Yur9VbXb27p2+YdbOyeaGsY78JOJG3t7D/YPn0xu/4eHfcRqceq9n9qrNOZunh2NTLS2TLaGxyJaPtu3uoJfYvcBjYkAeAJi1H4NAdAsp10dFfTlQg7/5Uf11JoKCwB/18LlXuGtBrkMDCH3ZWbpJ+gVms6wcofBaJUhudrNrgc4NLj6Gn5Vu4dGcbQh0eM2UXsGR4R4HeEPCjh/CexYd7rb1FRd3RRvirW1VDdWN4TDhe3AmvTi63wxbK2LezSwo3Wy7MAXN3bv7+3d193f2hCL7o7FdnfGGx4eD2z0+Tb6x/sGdzSNNDYON20fxOOZruiuzs5d0Z4dFc7pjujO9vad0c4pF64b6w1uqK/fEOwdW/n85r5gwu9PBPs2a3s7umW4G3IRur+EeELjB+ODJW7cHI0qTk6LJ3XWmgonIJqiNJ7Ytd+xsAySLl9yWX3UbreJtvVf+EGH3Wl3wn92R27OYXfZHeyL5UoX0H1oABKy3sfs+T26BFZsY7+nOV7Y94L7cFMniNHdJU2Zx/yheg6k7MornNqntijFfMrkvK8m7DRaJKfObJElq1H2Oau8ld1+I+TyAie6rUazQTLb3d4azeY64ftdaB+wW5lwFX7Nk799oiKgP+dpv4zl4SKjjEPGKx1Lv3oO/46rg7y/JlHFfhQ0RpvP0xFPwXg2ZA1yLEQzx5dfWdR4K6w8flS0GCH1zG0WzdJdNrBPbtZktMgGwx8ekiVGa3Q1gXeTpyHvKWMBojq/Ca9toKGY13zV2oKll3jMOeEe/dnz7z4jijDcodOnbpTN8iW+/9UPLP1iE2+TzIa+F87c9s/dgtWYvyurWh3AA+QfYB5NJtVpykElk0klqqgt8hDT9lcFD0ltXFAaLaZDp2++AdJBvXj27vfcKuq/vH4SfuMvP7D0v0d4NlcP+hnejOuRCdXmf1NFT8jwLBMftV0TMnbSCWOBgg6oCsasVhO7iP/ez+iVvb14z1dLZPQRoL0KVScq7ZoO6Ik5WWD37+N5A7IXryo0QXW0x/Mbp2htqQGZTcyAyIFu33oLsjELAnuG+e5j813dnsF3sWvZEnteayras/0N2nOBnBuuTg6s84bVvdzHIZ+ahNX9b9rJu9WDJeJ3mzheSmJB5MbcrIkrbcpoqK1IRAIShXNGSMEwgk3BIajrBf1+iJmGORkbDGB0kkTm2E5BokcKHniv8w29x44b6MtIezcRhw2SRDjp3BueVnszk6F2uWfX9mngcyLoCwQafGCHJrGmJHzRfGj9iQxdGmyz5XSU5k5Fr3y1X4HZo51FH01RyN/ev6X/6EAoirn6xVhTKjBwLNk+bJZ4txu3YLe9eUvr2D27LvzojqEPHevYHA0LgiwQ+8YDY3d+euIDv/pIKNERm26ONzbv6cfkmW0fmNn6wEJzwKCr7E2E082Je3fFIgl3pcjnvq0zVFbuuDAycSZ17Ln3bvvwLovLxZkFzmyo8x76VPaj/3pb7m5z58b08Y5Yf2KxM/9v6PL/Mm7O0vdrkDY7cv4fT/75B+nz2yMXvpK7Z7VB5+ePQpWelGsfeu/O/q2dbhr6v6Hzr/1rPO1DtpBNkHM/T39HuXoba7kH1aA/4oe8F+0l70et1+x/jv3e6PpjdL0+zlumLwb0PX4d+r5xlbl/959Hz+t9uF5tbvK9N0cDyV2bxz/Fh2xbo5/cf31eSDvyvenx99D9zp+It48hhXuG/nbkbR53F4r8UfnYhSZhqxV5K/SQ8H8urTiLasiR68zfRc/YL/s8z+4c314ZlbOsR/u8VAJfa/1+UKOLJK9C3/Xmmf7j6v6N2EbBBvC7rs8L/g5qelO6nabn79eZu/vNye5N82aD3PCXV/oc/CKqv6pdvdFxn16LvSR+ZRwGHcchcdZB3wTRowisoXriR3FSCX8C6iNRNIj+f/w8CXvcp6/i4x9je7wr5Sgh/eva0GkUhb+qK9rfA/uWN/J5Gvw30MQ9+yeRSAP89aN5tATlW2+t4AZ8bl25dHmBBP7NlDHyt+vKa4XC1f6HygkoF69RfvX2FL6PlYfWF510zZL4D5VzuuffaBHG32L5iuhbV+5bV157c0W/oP9JaTGEi6X/DZe7Wfnk5UVqh/LBa5RvvT3F2A7ls3LFZeXsNcqL64up+U2WY6avFYrZbD593XIXKx8tlhcssmWf5UVr2PoJm902Ybv0xyt23j5eLCdLykNXlOfL5GLpvEo5UvaFP0Vx0P+/B91T3gi74A8j+qu+JtSL3gve8sMmF9Tp/lePDsBuGvMG8PZ2trOmMEZ2qGkwQWbsy8Mc6sLteZhH9fjGPKxDVfh9eViA9k/mYTPqxF9DKXQcnUBn0El0AzqIDqFTyIPaYYfVBsWDtkHLIjy3oJuhfz86jG5CWXQMLUDbFLxzHOhfhHb61gDgnAL849B+E9Qb2GinYPSbIFK1QDkIY1CMm9E+1AxvHUdHoVUb7ySMcwtkhiegfhAdAcxjAN3CeluuMv8wPI9C2xGgvRGFYb5b8qN70FYY6yb4O4lOwzeldRjmOsaonGDvAU+e6itH9dQAXVfORcc7CK1HoH4SdQBOKyu9IIMDaAgweq/yVuSy964mw/UYOxjNNwEWpdZTMtPrj16QtSbpmwCXavQEtN0Eo9zEJNXMdHMQ+idBIvQkNf0E+trWmWWMP5BRsfY/DTixjMTkF0Y66jjURMHHe/QBvV3P6bXaoNAqVAusJiWfMl8yXOIvgUEZoG5KPoUSrLA6hwaXffjeLTNq4t6ZZW5hcDlAa1/U3wnml7h3/7YZipKBz+N9+ga9Q8/JTU/g1Xer/PuXCRp8VLcgoMHB/weq9tIECmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKPDwvVHlwZS9PYmpTdG0vTiAxMTQvRmlyc3QgOTI0L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzE3OT4+CnN0cmVhbQp42u1aW3PbNhZ+31+Bt1rtmMT90slo1onr1tPcNnE37bJ6kC3a0VYWPRLdTf79fgcgJcoiFWfXM/uyGSsQiINz+c7BwSGEwDgTinnDBP4UOpZJrZkITBnPJGfaoRHMBDSSOQxI0CsNMhaMYRLzuENrmRCBM+nARwgmAxNaSYY/YbgBO7TWM+UhQwuGP+G4ZiTMOcc06L3mzIA+KMsMJHAeGIkQWjLjIN8GZqGgQh9fpYZSTkIF/BdVMJw5PHfSMw9VPKzx6Ht0AlThKkBnpgSUxlQloafgpGOA1lwxpWGfgFZKB4gmEDDFcrTWMSvQYr7FDAsULCZYI5gFvYVcC9aOg86hhb3OogWRp34QzIGPhwAHPh52O8z3sMNhvg+aAXAVMO6p1YoBFRUAmaN+gClAjQN2L9ECJ6/QwjQPFAX35EUtAB28oIExC4Qy7A6gk3Clt2i1ZxClJZQDS604QQBCRQ7jmKmANODQCuwAggZLBiW0Jo/BkVrDBXA5vlDYwEXaYp4QFCvoCYCqPYUBVIKHaEgxIxwFCPxKThSINqNjyMBsA98JQS6ONB7AixhNQF6AjyDo8VhwC+w1UEZDsgG90iCQ5APyJTlFE38NZ8BSBLS1UEXhuQ1EgMBxCCmgZD2mkXc94UYBRSEIeB2HvpACVyIGEFGIYwxYhBqsNvCLlPQAFArBI4CsU0AIMagxCj87JeJich6QC0UeU445OACBKSR5mBSBo+B6GAan0+pT8BTcBXMDrZBnz/Jf31z+s7yq8e38FksDi/XdeJyfVUt6dAarmydvV9XV+7Iu8renZ/lF+akG/fSmfJGa56k5n4zHf8G8ryK++HxX5ifLZVXn7+8va+q9nC//yJ9Xq1m5KjgU4JP8p/w8f1GI1DnBtPf5j9VFlZ8eXX2c3tXlKhMjqPkOthRYq0b5TCCKhRYZgDCGZ1aZJ5YodyQKm0lLYIcMrjDSZ064J5K4hpB5tcxkx0pvs4AlbrjOFC0KazKV1HBWPrlc+VCuDjJTSKHCuAxxRWp4/vT2qj25nmeKtgruM+TQqIc38oldq7qu1cZnGqkRyQUqCEpCWVD6iW1V+75FIswM5TAVMo5FTYoEF55c8L5zlc7idgin0s6pHeTrJ8ZY72AsZGYptwmTIV0jXZoM2fiJTdU9GHOkBtqcNbAVpAgcYcSTC97DWHlkCE0pymVxI+MiE6G1+EEGzs8UZe3/IBf/l6n8/3o8Xo/uXkpZ4n9q59dELgooJtrI/eXdOX2ObqfzRV19/7FcLKq/VnV1WWXzahPEKGqxXlFjcZWhVKVKO6PK0mD9oih+KiU+1vXd+vs835MffGaoqMRua4WO4qnQNVCLW/fUYL6c387rdXF0Wl0dv6+nq3p0dF6Xt5kbTfLX09tyZwhFNkQkAjFCib/pyZHl254aWbHt6RFQ3PTMCFX9pmdHKCw2PTeysU57oFsc86M2vX4L2RvlmjEbje9SWN/DaVtRdUqdDa/tqONddqBx4gA3Nepk/j1uauTUDjc9crqH2/X85n5Vxs3y6A4e6mrWGXPR4YkCPbftQUt/AL0Nz5/ns3Vho/PoDTA2JjWhZ36cBxObhP9tV69mzIutFnrk5bZnRl5te3bk9bbnRt5se/OR71g2RzeZ1hHr+8zrFpA7Vd1GyS5F4F2mkS6Ig1y3lkf4e7iqUVA7XIku6ANcqS7Z2bn3uBJFsDtciS64A1x15Hp/SX8taGqfNZGFtHS3lCQQ/Oklth3Y4UKvuV/Cfl9yjLSQQiykEAvRh/HkYMsvRWQ0l84eYhMaOtXSFSaO5L/+9g8KW6sUFXLL+8VisjeGVI280jtmgsPry8CYCxnWUP+YFZkf4qkVtoiBMZR7YYgnKn2+4alNd0w7zJPtmOrMw0sy3kywWtox1Z2HF+3NQBgY2JXUGTCDrIaeP2ZgT2F7YCwMj2l5YMwMj5kD4Bn1OF0oOFBO+4ExvCMK0T+mlUUd0Y4J/Tg9d93CdyNDZ1oOjPGQiYFVQYp40e9q41SmB8a0w/r2fQZ0lcQyPi3X9ToeAcZCJJZJ83pRPrsur68513ghsYZzp9Dig7ncBrQcH52+W9DZcnzgHOTtdFUu63ieRXq8Rn0TT8v6RdpGDBKbnTXiXRITn1+ODx5HbIT5jjDB+4WBdxJE9l02311r8/jg+cMDQW9X5Z/xeLAjVQxIJeR8gySZhL6cJVRJA3pG6DqMS96gTyjb5rnb0lkzPnha0avlIBwqCSWBrnE9+SAqIRtYSLDpKG+2frJlo6AaHzikOpuv1vUGqpfT9Qaq/EV1D2WP1cOQacB1XXDlsA1RT530dHx88IijlZT4tcz1AYB0Eydl8tzGE7rxbANI9OZVM948V9P0MY13I01vrD3cmbuamoGVozqr5IGwuFDbII/o9AjcqSu2jhK26yjbdZTYKqUPKxXRso0irnGN7KATtnQUbqYNLdsoLLchFg0x44MHSK3upqu7GdBddteGGnB9mwY3KWJ84LSuFa+64nVXvByI8Z205b4M6iYcVZ9Xd4+aNgbvLKQwYHAH+Wj4UK5/cKz0QEiD6lC2J81lE7d9cblzPtei6ruohkeg2k0WbfpxXSauw0QnunflurpfXZVrliTE44O3eNPZiJBt0lrW6K+L7rvOdnYTA1+eLrr19YZ83Wi1tUymEiFW4CqV3JtKv0gxztIyZQkclmawJJB+14xNmit1atI8mebJ9NKya4gcxEHuGiITEOmsZR1/ptqgv2Wn5CPZKdGLqzKPna8P4ap6cU1rlaUaninVr4Ef0kA/0MD1ztfikfM175+vHztffT0CqeJnqTBmWvZrMBgS5oEG/WvDyEfON9sIN8k1xvSEqHGP5WcfhKjt5KfHAZReX1gq2Jk5CLEQTVg1S7CJ0dZTrX6T/FU5m0+fV5/iaaRFRnCh/TXpxaqc1tXq6OX0ovyV/Wtef2QfIWe1Kq9He0Wta3KqVdsCnj79tcCXC5dYoNzXH6tVK6RN2m0t2+wUtHfrplKiT+y7pkRER/t42jm7vypXR59mf87vZte3n9jvR5JLScXl76NRMhVbyum0Lo9Ov8eQ5Vo6YQVezb/j6hvOvxklVN7clcuTuP80L7xn83oSsX9Vzcr8l3X55r5ezJdwBT18Ob0sF2vMe31/uy543GlOx2MZv6zGY90+AejpFCZeAiDGLZ/t1kIO3sRE9PmLaT1dVDcUprqwKkyULOhg2ko30bxwwkx0KIyTEycRg/QrvJ14GggTbwrpzAQVVuHRxS5XOIW+wrBB39rCcoUWz4mldxPhXGEC2sALKy1aVzhuJlKKwjq6+aDw3YPGTiRJhHzpbWE8nyjBC01XDZTCd9B4C21VIRVaraEdtNcOOoHW2CJIiTbxUg7yhIZJAbkFrXBY4XKiJfo8TLSCXtBPW1k469H61IdsaxQwEDSfKauxcOiSBAIdlY+hGwhIFSTbGOjiFCNMjAmF1HgGqBTkTyK82iV4BYs8E4oELyRGeC3gNRFeySO8hid44Y0Ir/QJXmsjvGSasAHQ8QStlQlarhOk1rBgWyh1gtLYCKUydEuDJyihQIQSNBFKuDFCqRooRQOl8xFKAy0JSuVNghLmE5RKNVBS34rCYAd2BjBbghvQEbReweU2Qmusi9DSpR1FP4Nb+umfI1XS/SJAS1cB6L6JNRFe4R0qBB3hFV5M8Bwy5MQ4jS0L7nG6gZxPDHAAbaTHWi8CYniyyXX028bmR5UX56fUpwGZP5+uyzj68ucPv/34+ru/3c+v/lhPl7Pj59ViFieeluur1fwOuS1eFol5+vz0/ed1Xd6eL6+rmOFv5ut69fnoZFZdlqP8Df1iM1/eHJ3PkJfn9ecRpN/dLcpbStMca/f0A9yh8g/xYkrD8qL68fz01fQub2d1svWuIvnJ+ipVkZzTGUnsHCN+8vdQ6u90vwFr/e6ncn7zsaE6+fPmw3yGpAzUI7fnlMaP6T7ZseIKetBlGOHVJD9HkphfnSxvFiXj+dlieoPiykoR2X9GHn+G3LKs1uUz3v7zfOffuLkWQxlqAFmCsKzpclpKi6A+my9KSYo82Ot2vEdP+Jfc9sPyqpoB/w2Sxz81MM2mkFPRFptqnvyi+mU5B3UJ57pDgvvD5reLix9eXXTkIxTuF9PVXuQ0p5dPEzlcxsjRTx853g0HjtadwFHOYR5dDFPxUpgaCBw7GDPmQMwMwroJG7MXNvYrwmaQ/2MiR/j90GnfH/8NjlYd6wplbmRzdHJlYW0KZW5kb2JqCjEzNyAwIG9iago8PC9UeXBlL1hSZWYvSURbPDE4MGY3Yzg4M2NhMDRkYzY0NGVkY2FiNTU1MDVlOTkxPjwxODBmN2M4ODNjYTA0ZGM2NDRlZGNhYjU1NTA1ZTk5MT5dL1Jvb3QKMSAwIFIvSW5mbyAyIDAgUi9TaXplIDEzOC9XWzEgMyAyXS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMzMD4+CnN0cmVhbQp42i3Sxy7EURSA8XN0o49hMEY3zOi999670XvvYkliYWXlHTwDG3sLiYSI2HgAbyCxwv/L3fxy8t3kJjf3iIj8/gaI2GQXd3BaRWJEVGwXIpQjPFCx35oiqu4vM/tVHF4zK85hAAbiKR5jEAZjCIZiGIajDSMw8v/+G3N/FM6rOJ9NicYFlaRLU2JwSSXl3JRYXFZxvZoShysq7m9T7Limku633u65t3x0mdN4XFd5ejDFgZuYgIkqL1fm1IkVmIsezMN89KIPCzAJC7Ebk7EESzEFy7AcXViEVViNqejGGqzFOqzHBmzBYqzENGzEJkzHZmzFDGzDTszELuzAdszCbMzBHpzCXhzEPuzHARzDIRzFERzGSRzHCdzGGVzEWVzFLdxQebN2WN4bzX8d4p7Kx7XVPz5NP8F9lZ9Mq/+cWZvvuxP5A+p5NTkKZW5kc3RyZWFtCmVuZG9iagpzdGFydHhyZWYKNzY0NjgKJSVFT0YK</File>
    </Filelist>
</otrs_package>