JIRAPackage
4.0.7
catWorkX GmbH
http://www.catworkx.de/
Affero GNU Public License, 3.0
Fixed a bug preventing automatic issue creation.
Make debugging configurable, do not verify hostnames on SSL connections when configured.
Do not update dynamic field.
Do not run ticket events when JIRA user triggers them.
Fix bug in typechecks.
Add typechecks, more debugging and fix update bug.
updates for OTRS4
Support IDs and names for custom fields and fix handling of some field types.
Switched to JIRA REST API.
Added article to mapFields call.
Cleanup in dynamic field code.
Removed authentication for license check. The API is available for anon access anyway.
Removed unnecessary returns.
Removed a strange if condition.
Removed obsolete and broken dependecy.
Attempt to debug JIRA 6.0 problems with JIRA::Client.
Bugfix.
Added licensing code.
Changed demo code for right hand side.
Finalized eval call again.
Bugfix.
Finalized eval call.
Added missing %Ticket.
Debugging.
Readded the $Self to the eval calls.
Changed eval call for external modules again.
Changed eval call for external modules.
Bugfix.
Bugfix.
Typo in config.
Added code to warn upon eval failure.
License info.
Skip file-2 attachment, fixes OTRSJIRA-3.
Bugfix for OTRSJIRA-5.
Bugfix.
Bugfix.
Bugfix for Perl 5.10 (SLES11SP2).
Lowered required module versions to work with Perl 5.10.
Rewrote date formatting completely.
Do not handle Checkboxes (for now).
Dynamic field data can be transferred.
Individial mapping for dynamic field types.
Changes to mapping code.
Bugfix.
Actually map field values if anything is present.
Avoid bounces and loops by checking the username of the user triggering an update.
Pass the correct variables down to the Jira Module.
More dependencies for Events. Better logging.
More dependencies for Events.
Readded original headers for actions. Corrected Actions dependencies. Fixed broken setup for ArticleCreateEvent. Added multiple events for TicketUpdate.
Removed broken dependency.
Fixed requirement check for events.
Fixed language typo.
Added more events.
Try to add the JIRAIssueID programatically.
Fix for the typo. 3.2.x Version.
Major rewrite of the OTRS2JIRA fieldmapping.
Added code to transform OTRS-dynamic fields/values to JIRA-custom fields/values and pass them to JIRA.
Added code to pass attachments to JIRA.
Added code to read configured Jira-project and Jira-issue from the 'SysConfig'.
Added ConfigItem to JIRA XML file and made field mapping from OTRS to JIRA configurable.
Added ConfigItem to JIRA XML file and made JIRA-date format configurable.
Added ConfigItem to JIRA XML file and made JIRA-Issue type configurable.
Added ConfigItem to JIRA XML file and made JIRA-project configurable.
Added code to check the OTRS Tickets state prior to any action. States are now configurable.
Added code to fetch the possible transitions of the given JIRA issue before attempting the transition.
Added template for showing an error in case a ticket is closed when one wants to open a JIRA issue.
Added code to pass the last article body to JIRA upon closing.
Added code to pass the article body to JIRA upon creation and comment the closing of a ticket in JIRA appropriately.
Added event code to close the JIRA issue when the ticket is closed.
Added a hyperlink to JIRA.
Fixed the issue creation code.
Cleanup.
Added the options into the XML file.
Added error handling to the installer.
Added debugging to the installer.
Bugifxed the code for adding the JiraIssueID to the searchable and visible fields.
Added code for adding the JiraIssueID to the searchable and visible fields.
Bugfix for REST code for the remote issue links.
Bugfix for REST code for the remote issue links.
Added REST code for the remote issue links.
Uninstaller and Upgrader code done.
Added assignee and reporter. Nicer statuspage.
Updated MD5 dependecy.
New MD5 code in installer.
Updated DTL.
Updated SQL.
Debugging for dynamic field.
Added missing backslashes.
Added dynamic field.
New package.
A module giving the option to escalate tickets into JIRA.
Ein Modul, um Tickets in ein JIRA zu eskalieren.
4.0.x
Thank you for choosing the JIRAPackage module.
Copyright (C) 2008-2015 catWorkX GmbH http://www.catworkx.de
This is commercial software.
Please install the otrs2jira-licensing plugin into your JIRA installation and obtain a valid license.
Please contact catWorkX GmbH for a valid license.
Vielen Dank fuer die Auswahl des JIRAPackage Modules.
Copyright (C) 2008-2015 catWorkX GmbH http://www.catworkx.de
Dies ist kommerzielle Software.
Bitte installieren Sie das Plugin otrs2jira-licensing in Ihre JIRA Installation und hinterlegen dort eine gültige Lizenz.
Bitte setzen Sie sich mit der catWorkX GmbH bzgl. einer gültigen Lizenz in Verbindung.
JIRA::REST
REST::Client
Time::Piece
$Kernel::OM->Get('var::packagesetup::' . $Param{Structure}->{Name}->{Content} )->CodeInstall();
$Kernel::OM->Get('var::packagesetup::' . $Param{Structure}->{Name}->{Content} )->CodeUpgrade();
2015-10-19 12:18:26
cat-pc-tbu.catworkx.de
LS0tCkRlYnVnZ2VyOgogIERlYnVnVGhyZXNob2xkOiBkZWJ1ZwogIFRlc3RNb2RlOiAnMCcKRGVzY3JpcHRpb246IFRpY2tldCBDb25uZWN0b3IgUkVTVApGcmFtZXdvcmtWZXJzaW9uOiA0LjAuNQpQcm92aWRlcjoKICBPcGVyYXRpb246CiAgICBTZXNzaW9uQ3JlYXRlOgogICAgICBEZXNjcmlwdGlvbjogQ3JlYXRlcyBhIFNlc3Npb24KICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogU2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZQogICAgVGlja2V0Q3JlYXRlOgogICAgICBEZXNjcmlwdGlvbjogQ3JlYXRlcyBhIFRpY2tldAogICAgICBNYXBwaW5nSW5ib3VuZDoge30KICAgICAgTWFwcGluZ091dGJvdW5kOiB7fQogICAgICBUeXBlOiBUaWNrZXQ6OlRpY2tldENyZWF0ZQogICAgVGlja2V0R2V0OgogICAgICBEZXNjcmlwdGlvbjogUmV0cmlldmVzIFRpY2tldCBkYXRhCiAgICAgIE1hcHBpbmdJbmJvdW5kOiB7fQogICAgICBNYXBwaW5nT3V0Ym91bmQ6IHt9CiAgICAgIFR5cGU6IFRpY2tldDo6VGlja2V0R2V0CiAgICBUaWNrZXRTZWFyY2g6CiAgICAgIERlc2NyaXB0aW9uOiBTZWFyY2ggZm9yIFRpY2tldHMKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogVGlja2V0OjpUaWNrZXRTZWFyY2gKICAgIFRpY2tldFVwZGF0ZToKICAgICAgRGVzY3JpcHRpb246IFVwZGF0ZXMgYSBUaWNrZXQKICAgICAgTWFwcGluZ0luYm91bmQ6IHt9CiAgICAgIE1hcHBpbmdPdXRib3VuZDoge30KICAgICAgVHlwZTogVGlja2V0OjpUaWNrZXRVcGRhdGUKICBUcmFuc3BvcnQ6CiAgICBDb25maWc6CiAgICAgIEtlZXBBbGl2ZTogJycKICAgICAgTWF4TGVuZ3RoOiAnMTAwMDAwMDAwJwogICAgICBSb3V0ZU9wZXJhdGlvbk1hcHBpbmc6CiAgICAgICAgU2Vzc2lvbkNyZWF0ZToKICAgICAgICAgIFJlcXVlc3RNZXRob2Q6CiAgICAgICAgICAtIFBPU1QKICAgICAgICAgIFJvdXRlOiAvU2Vzc2lvbgogICAgICAgIFRpY2tldENyZWF0ZToKICAgICAgICAgIFJlcXVlc3RNZXRob2Q6CiAgICAgICAgICAtIFBPU1QKICAgICAgICAgIFJvdXRlOiAvVGlja2V0CiAgICAgICAgVGlja2V0R2V0OgogICAgICAgICAgUmVxdWVzdE1ldGhvZDoKICAgICAgICAgIC0gR0VUCiAgICAgICAgICBSb3V0ZTogL1RpY2tldC86VGlja2V0SUQKICAgICAgICBUaWNrZXRTZWFyY2g6CiAgICAgICAgICBSZXF1ZXN0TWV0aG9kOgogICAgICAgICAgLSBHRVQKICAgICAgICAgIFJvdXRlOiAvVGlja2V0CiAgICAgICAgVGlja2V0VXBkYXRlOgogICAgICAgICAgUmVxdWVzdE1ldGhvZDoKICAgICAgICAgIC0gUEFUQ0gKICAgICAgICAgIFJvdXRlOiAvVGlja2V0LzpUaWNrZXRJRAogICAgVHlwZTogSFRUUDo6UkVTVApSZW1vdGVTeXN0ZW06ICcnClJlcXVlc3RlcjoKICBUcmFuc3BvcnQ6CiAgICBUeXBlOiAnJwo=
IyAtLQojIHZhci9wYWNrYWdlc2V0dXAvSklSQVBhY2thZ2UucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgojIENvcHlyaWdodCAoQykgMjAxNSBjYXRXb3JrWCBHbWJILCBodHRwOi8vY2F0d29ya3guZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OkpJUkFQYWNrYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHV0Zjg7Cgp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7CnVzZSBGaWxlOjpCYXNlbmFtZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoCiAgICBLZXJuZWw6OkNvbmZpZwogICAgS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZwogICAgS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UKICAgIEtlcm5lbDo6U3lzdGVtOjpZQU1MCiAgICBLZXJuZWw6OlN5c3RlbTo6VmFsaWQKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQKKTsKCm91ciAkVkVSU0lPTiA9IDQuMDAxOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpKSVJBUGFja2FnZS5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgc3lzY29uZmlnIG9iamVjdAogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKCiAgICAjIHJlYnVpbGQgWlpaKiBmaWxlcwogICAgJFN5c0NvbmZpZ09iamVjdC0+V3JpdGVEZWZhdWx0KCk7CgogICAgIyBkZWZpbmUgdGhlIFpaWiBmaWxlcwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKCiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIG5leHQgUFJFRklYIGlmICEtZiAkRmlsZTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyAKICAgICRTZWxmLT5fSW5zdGFsbFdlYnNlcnZpY2UoKTsKICAgICRTZWxmLT5fQ3JlYXRlRHluYW1pY0ZpZWxkcygpOwogICAgJFNlbGYtPl9BY3RpdmF0ZUR5bmFtaWNGaWVsZHMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0luc3RhbGxXZWJzZXJ2aWNlKCk7CiAgICAkU2VsZi0+X0NyZWF0ZUR5bmFtaWNGaWVsZHMoKTsKICAgICRTZWxmLT5fQWN0aXZhdGVEeW5hbWljRmllbGRzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfSW5zdGFsbFdlYnNlcnZpY2UoKQoKPWN1dAoKc3ViIF9JbnN0YWxsV2Vic2VydmljZSB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkWUFNTE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyk7CiAgICBteSAkTG9jYXRpb24gICA9IGpvaW4gJy8nLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpLAogICAgICAgIHF3L3ZhciBHZW5lcmljSW50ZXJmYWNlIEdlbmVyaWNUaWNrZXRDb25uZWN0b3JSRVNULnltbC87CgogICAgbXkgJENvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgICAgICBMb2NhdGlvbiA9PiAkTG9jYXRpb24sCiAgICApOwoKICAgIG15ICRJbXBvcnRlZENvbmZpZyA9ICRZQU1MT2JqZWN0LT5Mb2FkKCBEYXRhID0+ICR7JENvbnRlbnR9ICk7CgogICAgIyBkaXNwbGF5IGFueSBZQU1MIGVycm9yIG1lc3NhZ2UgYXMgYSBub3JtYWwgb3RycyBlcnJvciBtZXNzYWdlCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkSW1wb3J0ZWRDb25maWcpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGltcG9ydGVkIGNvbmZpZ3VyYXRpb24gaGFzIGN1cnJlbnQgZnJhbWV3b3JrIHZlcnNpb24gb3RoZXJ3aXNlIHVwZGF0ZSBpdAogICAgI2lmICggJEltcG9ydGVkQ29uZmlnLT57RnJhbWV3b3JrVmVyc2lvbn0gbmUgJFNlbGYtPntGcmFtZXdvcmtWZXJzaW9ufSApIHsKICAgICMgICAgJEltcG9ydGVkQ29uZmlnID0gJFNlbGYtPl9VcGRhdGVDb25maWd1cmF0aW9uKCBDb25maWd1cmF0aW9uID0+ICRJbXBvcnRlZENvbmZpZyApOwogICAgI30KCiAgICAjIHJlbW92ZSBmcmFtZXdvcmsgaW5mb3JtYXRpb24gc2luY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlCiAgICBkZWxldGUgJEltcG9ydGVkQ29uZmlnLT57RnJhbWV3b3JrVmVyc2lvbn07CgogICAgIyBnZXQgd2Vic2VydmljZSBuYW1lCiAgICBteSAkV2Vic2VydmljZU5hbWUgICA9IGJhc2VuYW1lICRMb2NhdGlvbjsKICAgIG15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKCiAgICAjIHJlbW92ZSBmaWxlIGV4dGVuc2lvbgogICAgJFdlYnNlcnZpY2VOYW1lID1+IHN7XC5bXi5dKyR9e31nOwoKICAgICMgY2hlY2sgaWYgbmFtZSBpcyBkdXBsaWNhdGVkCiAgICBteSAlV2Vic2VydmljZUxpc3QgPSByZXZlcnNlICV7ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlTGlzdCgpIH07CgogICAgcmV0dXJuIGlmICRXZWJzZXJ2aWNlTGlzdHsgJFdlYnNlcnZpY2VOYW1lIH07CgogICAgIyBvdGhlcndpc2Ugc2F2ZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdG8gb3ZlcnZpZXcgc2NyZWVuCiAgICBteSAkU3VjY2VzcyA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgICAgIENvbmZpZyAgPT4gJEltcG9ydGVkQ29uZmlnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwp9CgpzdWIgX0NyZWF0ZUR5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIG15ICRWYWxpZElEID0gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICAjIGdldCBhbGwgY3VycmVudCBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIG9yZGVyIG51bWJlcnMgKGlzIGFscmVhZHkgc29ydGVkKS4KICAgIG15IEBEeW5hbWljZmllbGRPcmRlckxpc3Q7CiAgICBmb3IgbXkgJER5bmFtaWNmaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIHB1c2ggQER5bmFtaWNmaWVsZE9yZGVyTGlzdCwgJER5bmFtaWNmaWVsZC0+e0ZpZWxkT3JkZXJ9OwogICAgfQoKICAgICMgZ2V0IHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgb3JkZXIgbGlzdCBhbmQgYWRkIDEKICAgIG15ICROZXh0T3JkZXJOdW1iZXIgPSAxOwogICAgaWYgKEBEeW5hbWljZmllbGRPcmRlckxpc3QpIHsKICAgICAgICAkTmV4dE9yZGVyTnVtYmVyID0gJER5bmFtaWNmaWVsZE9yZGVyTGlzdFstMV0gKyAxOwogICAgfQoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgICMgY3JlYXRlIGEgZHluYW1pYyBmaWVsZHMgbG9va3VwIHRhYmxlCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBuZXh0IGlmIHJlZiAkRHluYW1pY0ZpZWxkIG5lICdIQVNIJzsKICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBjcmVhdGUgb3IgdXBkYXRlIGR5bmFtaWMgZmllbGRzCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoQER5bmFtaWNGaWVsZHMpIHsKICAgICAgICBteSAkQ3JlYXRlRHluYW1pY0ZpZWxkOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBkeW5hbWljIGZpZWxkIGFscmVhZHkgZXhpc3RzCiAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkQ3JlYXRlRHluYW1pY0ZpZWxkID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGZpZWxkIGV4aXN0cyBjaGVjayBpZiB0aGUgdHlwZSBtYXRjaCB3aXRoIHRoZSBuZWVkZWQgdHlwZQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZFR5cGV9CiAgICAgICAgICAgIG5lICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIHJlbmFtZSB0aGUgZmllbGQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57TmFtZX0gLiAnT2xkJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENyZWF0ZUR5bmFtaWNGaWVsZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpZiB0aGUgZmllbGQgZXhpc3RzIGFuZCB0aGUgdHlwZSBtYXRjaCwgdXBkYXRlIGl0IHRvIHRoZSBJVFNNIGRlZmluaXRpb24KICAgICAgICBlbHNlIHsKIyAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkVXBkYXRlKAojICAgICAgICAgICAgICAgICV7JER5bmFtaWNGaWVsZH0sCiMgICAgICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0lEfSwKIyAgICAgICAgICAgICAgICBGaWVsZE9yZGVyID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57RmllbGRPcmRlcn0sCiMgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkVmFsaWRJRCwKIyAgICAgICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiMgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmV3IGZpZWxkIGhhcyB0byBiZSBjcmVhdGVkCiAgICAgICAgaWYgKCRDcmVhdGVEeW5hbWljRmllbGQpIHsKICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgZmllbGQKICAgICAgICAgICAgbXkgJEZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJE5leHRPcmRlck51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0sCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSwKICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0NvbmZpZ30sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+ICRWYWxpZElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJEZpZWxkSUQ7CgogICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBvcmRlciBudW1iZXIKICAgICAgICAgICAgJE5leHRPcmRlck51bWJlcisrOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9HZXREeW5hbWljRmllbGRzRGVmaW5pdGlvbigpCgpyZXR1cm5zIHRoZSBkZWZpbml0aW9uIGZvciByZXBvcnRpbmcgcmVsYXRlZCBkeW5hbWljIGZpZWxkcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7Cgo9Y3V0CgpzdWIgX0dldER5bmFtaWNGaWVsZHNEZWZpbml0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWxsIGR5bmFtaWMgZmllbGRzIGZvciByZXBvcnRpbmcKICAgIG15IEBEeW5hbWljRmllbGRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSklSQUlzc3VlSUQnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICdKaXJhIElzc3VlIElEJywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICA9PiAnJywKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9icm93c2UvWyUgRGF0YS5KSVJBSXNzdWVJRCB8IHVybCAlXScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBEeW5hbWljRmllbGRzOwp9CgpzdWIgX0FjdGl2YXRlRHluYW1pY0ZpZWxkcyB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCgogICAgbXkgJU1hcCA9ICgKICAgICAgICBKSVJBSXNzdWVJRCA9PiB7CiAgICAgICAgICAgICdab29tJyAgICAgPT4gMSwKICAgICAgICAgICAgJ0ZyZWVUZXh0JyA9PiAxLAogICAgICAgICAgICAnU2VhcmNoJyAgID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKICAgIGZvciBteSAkRmllbGQgKCBrZXlzICVNYXAgKSB7CiAgICAgICAgZm9yIG15ICRTY3JlZW4gKCBrZXlzICV7ICRNYXB7JEZpZWxkfSB9ICkgewogICAgICAgICAgICBteSAkRnVsbG5hbWUgICAgICA9ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldCcgLiAkU2NyZWVuOwogICAgICAgICAgICBteSAkT3B0aW9ucyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCggJEZ1bGxuYW1lICk7CiAgICAgICAgICAgIG15ICRNYXBwaW5nICAgICAgID0gJE9wdGlvbnMtPntEeW5hbWljRmllbGR9IHx8IHt9OwoKICAgICAgICAgICAgbXkgJU5ld01hcHBpbmcgPSAoCiAgICAgICAgICAgICAgICAleyAkTWFwcGluZyB9LAogICAgICAgICAgICAgICAgJU1hcCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAiJEZ1bGxuYW1lIyMjRHluYW1pY0ZpZWxkIiwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFwlTmV3TWFwcGluZywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0Pi4KCj1jdXQKCg==
IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0OwoKI215ICRrZXkgPSAiTUlNRTo6QmFzZTY0LGVuY29kZV9iYXNlNjQiOwpteSAka2V5ID0gIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBRGVtbyxtYXBPVFJTT3B0aW9uRmllbGREZW1vVXNlcjJKSVJBQXNzaWduZWUiOwpteSAkZGF0YSA9ICJIYWxsbyBXZWx0ISI7Cm15ICgkbW9kdWxlLCRmdW5jdGlvbikgPSBzcGxpdCAoLywvLCRrZXkpOwpwcmludCAia2V5OiAka2V5XG5kYXRhOiAkZGF0YVxubW9kdWxlOiAkbW9kdWxlXG5mdW5jOiAkZnVuY3Rpb25cbiI7CgpteSAkcmVzID0gIiI7CiNteSAkc3RtdCA9ICIgdXNlICRtb2R1bGUgcXcoJGZ1bmN0aW9uKTsgXCRyZXMgPSAkZnVuY3Rpb24oXCRkYXRhKTsgIjsKbXkgJHN0bXQgPSAiIHVzZSAkbW9kdWxlIHF3KCRmdW5jdGlvbik7IFwkcmVzID0gJHttb2R1bGV9OjokZnVuY3Rpb24odW5kZWYsXCRkYXRhLHVuZGVmKTsgIjsKZXZhbCAkc3RtdDsKd2FybiAkQCBpZiAkQDsKCnByaW50ICJzdG10OiAkc3RtdFxucmVzOiAkcmVzXG4iOwo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpY2tldEpJUkEiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbiBmb3IgdGhlIFRpY2tldEpJUkEgbW9kdWxlLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZE1vZHVsUmVnaXN0cmF0aW9uIGbDvHIgZGFzIFRpY2tldEpJUkEgTW9kdWwuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkFnZW50RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8RnJvbnRlbmRNb2R1bGVSZWc+CgkJCQk8VGl0bGU+VGlja2V0SklSQTwvVGl0bGU+CgkJCQk8R3JvdXA+dXNlcnM8L0dyb3VwPgoJCQkJPERlc2NyaXB0aW9uPlRpY2tldEpJUkE8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+VGlja2V0SklSQTwvTmF2QmFyTmFtZT4KCQkJCTxOYXZCYXI+CgkJCQkJPERlc2NyaXB0aW9uPlRpY2tldEpJUkE8L0Rlc2NyaXB0aW9uPgoJCQkJCTxOYW1lPlRpY2tldEpJUkE8L05hbWU+CgkJCQkJPEltYWdlPm92ZXJ2aWV3LnBuZzwvSW1hZ2U+CgkJCQkJPExpbms+QWN0aW9uPUFnZW50VGlja2V0SklSQTwvTGluaz4KCQkJCQk8TmF2QmFyPlRpY2tldEpJUkE8L05hdkJhcj4KCQkJCQk8VHlwZT5NZW51PC9UeXBlPgoJCQkJCTxQcmlvPjg0MDA8L1ByaW8+CgkJCQkJPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KCQkJCTwvTmF2QmFyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpY2tldEpJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGbDvHIgZGFzIEFnZW50IEludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8RnJvbnRlbmRNb2R1bGVSZWc+CgkJCQk8RGVzY3JpcHRpb24+RXNjYWxhdGUgdGhpcyBUaWNrZXQgdG8gSklSQTwvRGVzY3JpcHRpb24+CgkJCQk8VGl0bGU+RXNjYWxhdGUgdG8gSklSQTwvVGl0bGU+CgkJCQk8TmF2QmFyTmFtZT5KSVJBPC9OYXZCYXJOYW1lPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM5MDAtSklSQSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93cyBhIEpJUkEtbGluayBpbiBtZW51IG9mIHRoZSB0aWNrZXQgem9vbS48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciBKSVJBLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFRpY2tldGFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxIYXNoPgoJCQkJPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51SklSQTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iTmFtZSI+SklSQTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudFRpY2tldEpJUkE8L0l0ZW0+CgkJCQk8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgoJCQk8L0hhc2g+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI1VSTCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBVUkwgb2YgdGhlIEpJUkEgc2VydmVyLCBpbmNsdWRlIHRoZSBwcm90b2NvbCBhbmQgdGhlIHBvcnQgaWYgcmVxdWlyZWQgYSB3ZWxsIGFzIHRoZSBiYXNlIGlmIGFueS48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFVSTCBkZXMgSklSQSBTZXJ2ZXJzLCBpbmtsdXNpdmUgUHJvdG9rb2xsIHNvd2llIFBvcnQgdW5kIFBmYWQsIHNvZmVybiB6dXRyZWZmZW5kLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5odHRwOi8vY2F0LXBjLTA1MC5jYXR3b3JreC5kZTo4MDgwPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI1BhdGgiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgcGF0aCBvZiB0aGUgUkVTVCBBUEkuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBQZmFkIGRlciBSRVNUIEFQSS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+L3Jlc3QvYXBpLzIvPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI1VzZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgdXNlcm5hbWUgdG8gdXNlIHdoZW4gbG9nZ2luZyBpbiBpbnRvIEpJUkEgaXNzdWVzLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgQmVudXR6ZXJuYW1lIG1pdCBkZW0gc2ljaCBiZWltIEpJUkEgYW5nZW1lbGRldCB3aXJkLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5vdHJzPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI1Bhc3N3b3JkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIHBhc3N3b3JkIHRvIHVzZSB3aGVuIGxvZ2dpbmcgaW4gaW50byBKSVJBIGlzc3Vlcy48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGFzIFBhc3N3b3J0IG1pdCBkZW0gc2ljaCBiZWltIEpJUkEgYW5nZW1lbGRldCB3aXJkLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5vdHJzPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI1JlcG9ydGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWUgb2YgdGhlIHJlcG9ydGVyIHRvIHVzZSBmb3IgdGhlIG5ldyBKSVJBIGlzc3Vlcy48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVyIE5hbWUgZGVzIFJlcG9ydGVycyBmw7xyIG5ldWUgSklSQSBJc3N1ZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkNvcmU6OlJFU1Q8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPm90cnM8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRKSVJBIyMjQXNzaWduZWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgbmFtZSBvZiB0aGUgYXNzaWduZWUgdG8gdXNlIGZvciB0aGUgbmV3IEpJUkEgaXNzdWVzLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgTmFtZSBkZXMgQXNzaWduZWUgZsO8ciBuZXVlIEpJUkEgSXNzdWVzLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5hZG1pbjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldEpJUkEjIyNJbmNvbWluZ1VzZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgdXNlcm5hbWUgdGhhdCBpcyB1c2VkIHdoZW4gSklSQSBsb2dzIGludG8gT1RSUyB0byB1cGRhdGUgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVyIEJlbnV0emVybmFtZSBtaXQgZGVtIHNpY2ggSklSQSBhbSBPVFJTIGFubWVsZGV0LCB1bSBUaWNrZXRzIHp1IGFrdHVhbGlzaWVyZW4uPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkNvcmU6OlJFU1Q8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPmppcmE8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRKSVJBIyMjV29ya2Zsb3dDbG9zZUFjdGlvbk5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgbmFtZSBvZiB0aGUgY2xvc2UgaXNzdWUgd29ya2Zsb3cgYWN0aW9uIChkZWZhdWx0OiAiQ2xvc2UgSXNzdWUiLCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBKSVJBIGxhbmd1YWdlIG9mIHVzZXIgaW4gVGlja2V0SklSQSMjI1VzZXIsIEVuZ2xpc2goVUspIHdvcmtzKS48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVyIE5hbWUgZGVyIEFrdGlvbiB6dW0gU2NobGllw59lbiB2b24gSXNzdWVzIChTdGFuZGFyZDogIkNsb3NlIElzc3VlIiwgYWNodGVuIFNpZSBhdWYgZGllIEpJUkEgU3ByYWNoZSBkZXMgQmVudXRlcnMgaW4gVGlja2V0SklSQSMjI1VzZXIsIEVuZ2xpc2goVUspIGlzdCBlbXBmZWhsZW5zd2VydCkuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkNvcmU6OlJFU1Q8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPkNsb3NlIElzc3VlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI09UUlNUaWNrZXRBbGxvd2VkU3RhdGVzNENyZWF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lcyBvZiB0aGUgT1RSUyBUaWNrZXQgc3RhdGVzIHRoYXQgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGEgSklSQSBJc3N1ZS48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIE5hbWVuIGRlciBPVFJTIFRpY2tldCBadXN0w6RuZGUgZGllIGRhcyBFcnpldWdlbiBlaW5lcyBKSVJBIElzc3VlIHp1bGFzc2VuLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZz5uZXcsb3BlbixtZXJnZWQscGVuZGluZyByZW1pbmRlcjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldEpJUkEjIyNPVFJTVGlja2V0QWxsb3dlZFN0YXRlczRDbG9zZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lcyBvZiB0aGUgT1RSUyBUaWNrZXQgc3RhdGVzIHRoYXQgYWxsb3cgdGhlIGNsb3Npbmcgb2YgYSBKSVJBIElzc3VlLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgTmFtZW4gZGVyIE9UUlMgVGlja2V0IFp1c3TDpG5kZSBkaWUgZGFzIFNjaGxpZcOfZW4gZWluZXMgSklSQSBJc3N1ZSB6dWxhc3Nlbi48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+Y2xvc2VkIHN1Y2Nlc3NmdWwsY2xvc2VkIHVuc3VjY2Vzc2Z1bCxyZW1vdmVkPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0SklSQSMjI09UUlNUaWNrZXRBbGxvd2VkU3RhdGVzNFVwZGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBuYW1lcyBvZiB0aGUgT1RSUyBUaWNrZXQgc3RhdGVzIHRoYXQgYWxsb3cgdXBkYXRpbmcgdGhlIEpJUkEgSXNzdWUuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBOYW1lbiBkZXIgT1RSUyBUaWNrZXQgWnVzdMOkbmRlIGRpZSBkYXMgQWt0dWFsaXNpZXJlbiBlaW5lcyBKSVJBIElzc3VlIHp1bGFzc2VuLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZz5uZXcsb3BlbixtZXJnZWQscGVuZGluZyByZW1pbmRlcjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8SGFzaD4KCQkJCTxJdGVtIEtleT0iS2V5Ij5KSVJBSXNzdWVJRDwvSXRlbT4KCQkJCTxJdGVtIEtleT0iQ29udGVudCI+MTwvSXRlbT4KCQkJPC9IYXNoPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxIYXNoPgoJCQkJPEl0ZW0gS2V5PSJLZXkiPkpJUkFJc3N1ZUlEPC9JdGVtPgoJCQkJPEl0ZW0gS2V5PSJDb250ZW50Ij4xPC9JdGVtPgoJCQk8L0hhc2g+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyMwMDEtVGlja2V0Q2xvc2VKSVJBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VXBkYXRlIEpJUkEgb25jZSB0aGUgdGlja2V0IGlzIGNsb3NlZC48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGFzIEpJUkEgbmFjaCBkZW0gU2NobGllw59lbiBkZXMgVGlja2V0cyBha3R1YWxpc2llcmVuLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpUaWNrZXQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8SGFzaD4KCQkJCTxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q2xvc2VKSVJBSXNzdWU8L0l0ZW0+CgkJCQk8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTdGF0ZVVwZGF0ZTwvSXRlbT4KCQkJPC9IYXNoPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjMDAxLVRpY2tldENyZWF0ZUpJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DcmVhdGUgSklSQSBJc3N1ZSBvbmNlIHRoZSB0aWNrZXQgaXMgcHVzaGVkIGludG8gYSBzcGVjaWZpYyBzdGF0ZS4gU2VlIFRpY2tldEpJUkEjIyNPVFJTVGlja2V0QWxsb3dlZFN0YXRlczRDcmVhdGUgZm9yIGRldGFpbHMuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVyemV1Z2UgZGFzIEpJUkEgSXNzdWUgc29iYWxkIGRhcyBPVFJTIFRpY2tldCBpbiBlaW5lbSBiZXN0aW1tdGVuIFp1c3RhbmQgYW5nZWtvbW1lbiBpc3QuIEbDvHIgRGV0YWlscywgc2llaGUgVGlja2V0SklSQSMjI09UUlNUaWNrZXRBbGxvd2VkU3RhdGVzNENyZWF0ZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEhhc2g+CgkJCQk8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OkNyZWF0ZUpJUkFJc3N1ZTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFN0YXRlVXBkYXRlPC9JdGVtPgoJCQk8L0hhc2g+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyMwMDEtVGlja2V0SklSQVVwZGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlVwZGF0ZSBKSVJBIG9uY2UgdGhlIHRpY2tldCB1cGRhdGVkIHRoZSB0aXRsZSBmaWVsZC4gRHVwbGljYXRlIHRoaXMgZW50cnkgZm9yICphbGwqIGZpZWxkcyB5b3Ugd2FudCB0byBzeW5jIGludG8gSklSQS48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGFzIEpJUkEgYmVpbSBha3R1YWxpc2llcmVuIGRlcyBGZWxkZXMgInRpdGxlIiBlYmVuZmFsbHMgYWt0dWFsaXNpZXJlbi4gRGllc2VyIEVpbnRyYWcgbXVzcyBmw7xyICpqZWRlcyogenUgw7xiZXJ0cmFnZW5kZSBGZWxkIGV4dHJhIGFuZ2VsZWd0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEhhc2g+CgkJCQk8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlVwZGF0ZUpJUkFJc3N1ZTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFRpdGxlVXBkYXRlfFRpY2tldEN1c3RvbWVyVXBkYXRlfFRpY2tldEZyZWVUZXh0VXBkYXRlfFRpY2tldE93bmVyVXBkYXRlfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAwMXxUaWNrZXREeW5hbWljRmllbGRVcGRhdGVfZmllbGQwMDJ8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlX2ZpZWxkMDAzfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAwNHxUaWNrZXREeW5hbWljRmllbGRVcGRhdGVfZmllbGQwMDV8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlX2ZpZWxkMDEwfFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZV9maWVsZDAxMTwvSXRlbT4KCQkJPC9IYXNoPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjMDAxLUFydGljbGVUb0pJUkEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DcmVhdGUgYSBKSVJBIENvbW1lbnQgb25jZSBhbiBhcnRpY2xlIGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVyemV1Z2UgZWluZW4gSklSQSBrb21tZW50YXIgc29iYWxkIGVpbiBPVFJTIEFydGlrZWwgZXJ6ZXVndCB3dXJkZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEhhc2g+CgkJCQk8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OkFkZEFydGljbGVUb0pJUkFJc3N1ZTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iRXZlbnQiPkFydGljbGVDcmVhdGV8QXJ0aWNsZVVwZGF0ZTwvSXRlbT4KCQkJPC9IYXNoPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldEpJUkEjIyNQcm9qZWN0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gdXNlIGZvciB0aGUgbmV3IEpJUkEgaXNzdWVzLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgTmFtZSBkZXMgUHJvamVrdGVzIGbDvHIgbmV1ZSBKSVJBIElzc3Vlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+T1RSUzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldEpJUkEjIyNJc3N1ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgbmFtZSBvZiB0aGUgdHlwZSB0byB1c2UgZm9yIHRoZSBuZXcgSklSQSBpc3N1ZXMuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlciBOYW1lIGRlcyBUeXAgZsO8ciBuZXVlIEpJUkEgSXNzdWVzLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5CdWc8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRKSVJBIyMjSklSQS1EYXRlVGltZUZvcm1hdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRhdGUgZm9ybWF0IHVzZWQgaW4gSklSQSwgZS5nLjogSklSQTogZGQvTU1NL3l5IGg6bW0gYSA9IE9UUlMgJWQvJWIvJXkgJUk6JU0gJXA8L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGFzIHZvbiBKSVJBIGFremVwdGllcnRlIERhdHVtc2Zvcm1hdCwgei5CLjogSklSQTogZGQvTU1NL3l5IGg6bW0gYSA9IE9UUlMgJWQvJWIvJXkgJUk6JU0gJXA8L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+JWQvJWIvJXkgJUk6JU0gJXA8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRKSVJBIyMjSklSQS1EYXRlRm9ybWF0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGF0ZSBmb3JtYXQgdXNlZCBpbiBKSVJBLCBlLmcuOiBKSVJBOiBkZC9NTU0veXkgPSBPVFJTICVkLyViLyV5PC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRhcyB2b24gSklSQSBha3plcHRpZXJ0ZSBEYXR1bXNmb3JtYXQsIHouQi46IEpJUkE6IGRkL01NTS95eSA9IE9UUlMgJWQvJWIvJXk8L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+JWQvJWIvJXk8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRKSVJBIyMjT1RSUy1KSVJBLUZpZWxkTWFwcGluZyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1hcHBpbmcgZnJvbSBPVFJTIGZpZWxkcyB0byBKSVJBIEZpZWxkcy4gS2V5OiBPVFJTOyBDb250ZW50OiBKSVJBLiBQcmVmaXhlczogInN0ZDoiID0gc3RhbmRhcmQgZmllbGQ7ICJkeW46IiA9IE9UUlMgZHluYW1pYyBmaWVsZDsgImN1c3Q6IiA9IEpJUkEgY3VzdG9tIGZpZWxkOyAiY2FsbDoiID0gT1RSUy9KSVJBIG1hcHBpbmcgY2FsbCB3aXRoIGZ1bGwgUGVybCBtb2R1bGVwYXRoIFBrZzo6U3ViLGZ1bmMgKGUuZy4gTUlNRTo6QmFzZTY0LGVuY29kZV9iYXNlNjQpLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BYmJpbGR1bmcgZGVyIE9UUlMgRmVsZGVybiB6dSBkZW4gSklSQSBGZWxkZXJuLiBTY2hsw7xzc2VsOiBPVFJTOyBJbmhhbHQ6IEpJUkEuIFByw6RmaXhlOiAic3RkOiIgPSBTdGFuZGFyZCBGZWxkOyAiZHluOiIgPSBPVFJTIER5bmFtaWMgRmVsZDsgImN1c3Q6IiA9IEpJUkEgQ3VzdG9tIEZlbGQ7ICJjYWxsOiIgPSBPVFJTL0pJUkEgTWFwcGluZy1GdW5rdGlvbnNhdWZydWYgbWl0IHZvbGxlbSBQZXJsIE1vZHVsZXBmYWQgUGtnOjpTdWIsZnVuYyAoei5CLiBNSU1FOjpCYXNlNjQsZW5jb2RlX2Jhc2U2NCkuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+SklSQTwvR3JvdXA+CgkJPFN1Ykdyb3VwPkNvcmU6OlJFU1Q8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8SGFzaD4KCQkJCTxJdGVtIEtleT0iZHluOmR5bmFtaWNGaWVsZDEiPmN1c3Q6Y3VzdG9tRmllbGQxPC9JdGVtPgoJCQkJPEl0ZW0gS2V5PSJkeW46amlyYV9wcmlvIj5zdGQ6cHJpb3JpdHk8L0l0ZW0+CgkJCQk8SXRlbSBLZXk9InN0ZDpUaXRsZSI+c3RkOnN1bW1hcnk8L0l0ZW0+CgkJCQk8SXRlbSBLZXk9InN0ZDpRdWV1ZSI+Y3VzdDpxdWV1ZTwvSXRlbT4KCQkJCTxJdGVtIEtleT0ibWFwOk1vZDo6U3ViTW9kOjpmdW5jIj5jdXN0OmZpZWxkMTwvSXRlbT4KCQkJCTxJdGVtIEtleT0iZHluOmR5bmFtaWNGaWVsZDIiPm1hcDpNb2Q6OlN1Yk1vZCxmdW5jMjwvSXRlbT4KCQkJCTxJdGVtIEtleT0ibWFwOk1vZDo6U3ViTW9kOjpmdW5jMyI+bWFwOk1vZDo6U3ViTW9kLGZ1bmM0PC9JdGVtPgoJCQk8L0hhc2g+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJPENvbmZpZ0l0ZW0gTmFtZT0iSklSQTo6T1RSU1RpY2tldElERmllbGQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgSUQgb2YgdGhlIGN1c3RvbSBmaWVsZCBpbiBKSVJBIHRoYXQgc3RvcmVzIHRoZSBPVFJTIHRpY2tldCBJRC48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIElEIGRlcyBGZWxkZXMgaW4gSklSQSwgZGFzIGRpZSBPVFJTLVRpY2tldElEIHNwZWljaGVydC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTAwMDA8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJKSVJBOjpDYWNoZVRUTCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpbWVUb0xpdmUgZm9yIENhY2hlLjwvRGVzY3JpcHRpb24+CgkJPERlc2NyaXB0aW9uIExhbmc9ImRlIj5UaW1lVG9MaXZlIGbDvHIgQ2FjaGU8L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTo6UkVTVDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MjAwMDA8L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJKSVJBOjpTU0xWZXJpZnkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uIExhbmc9ImVuIj5WZXJpZnkgaG9zdG5hbWUgZm9yIFNTTCBjb25uZWN0aW9ucy48L0Rlc2NyaXB0aW9uPgoJCTxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VmVyaWZpemllcmUgZGVuIEhvc3RuYW1lbiBiZWkgU1NMLVZlcmJpbmR1bmdlbjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPkpJUkE8L0dyb3VwPgoJCTxTdWJHcm91cD5Db3JlOjpSRVNUPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L09wdGlvbj4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+Cgk8Q29uZmlnSXRlbSBOYW1lPSJKSVJBOjpEZWJ1ZyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkVuYWJsZXMgRGVidWdnaW5nIGZvciBKSVJBIHBhY2thZ2UuPC9EZXNjcmlwdGlvbj4KCQk8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFrdGl2aWVydCBkYXMgRGVidWdnaW5nIGbDvHIgZGFzIEpJUkEtUGFrZXQ8L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5KSVJBPC9Hcm91cD4KCQk8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9PcHRpb24+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAgLS0KIyAgS2VybmVsL1N5c3RlbS9UaWNrZXRKSVJBLnBtIC0gY29yZSBtb2R1bGUKIyAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgY2F0V29ya1ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkpTT047CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGU7Cgp1c2UgUkVTVDo6Q2xpZW50Owp1c2UgSklSQTo6UkVTVDsKdXNlIFRpbWU6OlBpZWNlOwp1c2UgU2NhbGFyOjpVdGlsIHF3KGxvb2tzX2xpa2VfbnVtYmVyKTsKdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOwoKdXNlIGNvbnN0YW50IFAgPT4gX19QQUNLQUdFX187CgpvdXIgJFZFUlNJT04gPSAnNC4wMDEnOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6TWFpbgogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldAogICAgS2VybmVsOjpTeXN0ZW06OlVzZXIKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQKICAgIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZQogICAgS2VybmVsOjpTeXN0ZW06OkpTT04KICAgIEtlcm5lbDo6U3lzdGVtOjpDYWNoZQopOwoKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICRTZWxmLT57RGVidWd9ICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OkRlYnVnJyk7CiAgICAkU2VsZi0+e0NvbmZpZ30gICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJykgfHwge307CiAgICAkU2VsZi0+e0pJUkFDbGllbnR9ID0gSklSQTo6UkVTVC0+bmV3KAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1VSTH0sCiAgICAgICAgJFNlbGYtPntDb25maWd9LT57VXNlcn0sCiAgICAgICAgJFNlbGYtPntDb25maWd9LT57UGFzc3dvcmR9LAogICAgKTsKCiAgICBteSAkVmVyaWZ5U1NMID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTU0xWZXJpZnknKTsKICAgIGlmICggISRWZXJpZnlTU0wgKSB7CiAgICAgICAgbXkgJExvYWRlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoCiAgICAgICAgICAgICdOZXQ6OlNTTGVheScsCiAgICAgICAgICAgIFNpbGVudCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRMb2FkZWQpIHsKICAgICAgICAgICAgJFNlbGYtPntKSVJBQ2xpZW50fS0+e3Jlc3R9LT5nZXRVc2VyYWdlbnQoKS0+c3NsX29wdHMoIHZlcmlmeV9ob3N0bmFtZSA9PiAwICk7CiAgICAgICAgICAgICRTZWxmLT57SklSQUNsaWVudH0tPntyZXN0fS0+Z2V0VXNlcmFnZW50KCktPnNzbF9vcHRzKCBTU0xfdmVyZml5X21vZGUgPT4gTmV0OjpTU0xlYXk6OlZFUklGWV9OT05FKCkgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntKSVJBRHluYW1pY0ZpZWxkfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCggTmFtZSA9PiAnSklSQUlzc3VlSUQnICk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0pJUkFBUEknOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpDYWNoZVRUTCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gSXNzdWVDbG9zZSgpCgpDbG9zZSBhbiBpc3N1ZSBpbiBKSVJBCgo9Y3V0CgpzdWIgSXNzdWVDbG9zZSB7CiAgICBteSAoJFNlbGYsICVQYXJhbSkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKCBxdy9Jc3N1ZUlELyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDbG9zZVRyYW5zaXRpb24gPSAkU2VsZi0+e0NvbmZpZ30tPntXb3JrZmxvd0Nsb3NlQWN0aW9uTmFtZX0gLy8gJ0RvbmUnOwoKICAgIG15ICRUcmFuc2l0aW9uczsKICAgIG15ICRFcnJvclRyYW5zaXRpb25zOwoKICAgIGV2YWx7CiAgICAgICAgJFRyYW5zaXRpb25zID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKAogICAgICAgICAgICAnL2lzc3VlLycgLiAkUGFyYW17SXNzdWVJRH0gLiAnL3RyYW5zaXRpb25zJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXhwYW5kID0+ICd0cmFuc2l0aW9uLmZpZWxkcycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgMTsKICAgIH0gb3IgJEVycm9yVHJhbnNpdGlvbnMgPSAkQDsKCiAgICBpZiAoICRFcnJvclRyYW5zaXRpb25zICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6Oklzc3VlQ2xvc2U6IGNhbm5vdCBnZXQgdHJhbnNpdGlvbnMgdGhlIEpJUkEgSXNzdWUgZm9yICVzOiAlcyIsCiAgICAgICAgICAgICAgICAkUGFyYW17SXNzdWVJRH0sICRFcnJvclRyYW5zaXRpb25zLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAreyBlcnJvciA9PiAkRXJyb3JUcmFuc2l0aW9ucyB9OwogICAgfQoKICAgIG15ICgkVHJhbnNpdGlvbikgPSBncmVweyAkXy0+e25hbWV9IGVxICRDbG9zZVRyYW5zaXRpb24gfUB7ICRUcmFuc2l0aW9ucy0+e3RyYW5zaXRpb25zfSB8fCBbXSB9OwoKICAgIGlmICggISRUcmFuc2l0aW9uICkgewogICAgICAgIHJldHVybiAreyBlcnJvciA9PiAnTm8gdHJhbnNpdGlvbiBmb3VuZCBmb3IgJyAuICRDbG9zZVRyYW5zaXRpb24gfTsKICAgIH0KCiAgICBteSAkRXJyb3JDbG9zZTsKCiAgICBteSAlT3B0cyA9ICgKICAgICAgICB0cmFuc2l0aW9uID0+IHsKICAgICAgICAgICAgaWQgPT4gJFRyYW5zaXRpb24tPntpZH0sCiAgICAgICAgfQogICAgKTsKCiAgICBpZiAoICRQYXJhbXtDb21tZW50fSApIHsKICAgICAgICAkT3B0c3t1cGRhdGV9ID0gewogICAgICAgICAgICBjb21tZW50ID0+IFsKICAgICAgICAgICAgICAgIHsgYWRkID0+IHsgYm9keSA9PiAkUGFyYW17Q29tbWVudH0gfSB9LAogICAgICAgICAgICBdLAogICAgICAgIH07CiAgICB9CgogICAgZXZhbHsKICAgICAgICAkU2VsZi0+e0pJUkFDbGllbnR9LT5QT1NUKAogICAgICAgICAgICAnL2lzc3VlLycgLiAkUGFyYW17SXNzdWVJRH0gLiAnL3RyYW5zaXRpb25zJywKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgIFwlT3B0cywKICAgICAgICApOwoKICAgICAgICAxOwogICAgfSBvciAkRXJyb3JDbG9zZSA9ICRAOwoKICAgIGlmICggJEVycm9yQ2xvc2UgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6SXNzdWVDbG9zZTogY2Fubm90IGNsb3NlIGlzc3VlICVzOiAlcyBmb3IgJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte0lzc3VlSUR9LCAkRXJyb3JUcmFuc2l0aW9ucywKICAgICAgICAgICAgICAgICRNYWluT2JqZWN0LT5EdW1wKFwlT3B0cyksCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICRFcnJvckNsb3NlIH07CiAgICB9CgogICAgcmV0dXJuICt7fTsKfQoKPWl0ZW0gSXNzdWVHZXQoKQoKR2V0IGFuIGlzc3VlIGZyb20gSklSQQoKICAgIG15ICRJc3N1ZURhdGEgPSAkT2JqZWN0LT5Jc3N1ZUdldCgKICAgICAgICBJc3N1ZSA9PiAkSXNzdWVLZXksCiAgICApOwoKPWN1dAoKc3ViIElzc3VlR2V0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkICggcXcvSXNzdWUvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJElzc3VlOwogICAgbXkgJEVycm9yR2V0OwoKICAgIGV2YWx7CiAgICAgICAgJElzc3VlID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKCAnL2lzc3VlLycgLiAkUGFyYW17SXNzdWV9ICk7CiAgICB9IG9yICRFcnJvckdldCA9ICRAOwoKICAgIGlmICggJEVycm9yR2V0ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6Oklzc3VlQ2xvc2U6IGNhbm5vdCBjbG9zZSBpc3N1ZSAlczogJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte0lzc3VlSUR9LCAkRXJyb3JHZXQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICRFcnJvckdldCB9OwogICAgfQoKICAgIHJldHVybiAkSXNzdWU7Cn0KCj1pdGVtIElzc3VlQ3JlYXRlKCkKCmNyZWF0ZXMgYW4gaXNzdWUgaW4gdGhlIGNvbmZpZ3VyZWQgSklSQSBzeXN0ZW0gdXNpbmcgUkVTVAoKICAgIG15ICRJc3N1ZSA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZUNyZWF0ZSgKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsICAgICAgICAgICAgICAgICAgIyB0aGUgVGlja2V0SUQsIG1hbmRhdG9yeQogICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySUQgICAgICAgICAgICAgICAgICAgICAjIHRoZSBVc2VySUQsIG1hbmRhdG9yeQogICAgKTsKCnJldHVybnM6CgogICAgJElzc3VlID0gewogICAgICAgIGlkID0+IDEwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzc3VlIGlkIGluIEpJUkEsIHN0YXJ0cyBmcm9tIDEwMDAwCiAgICAgICAga2V5ID0+IFBST0otMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXNzdWUga2V5IGFzIHVzZWQgaW4gdGhlIHdlYmludGVyZmFjZSwgPFByb2o+LTxOdW1iZXI+LCBzdGFydHMgZnJvbSAxCiAgICAgICAgWy4uLl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGxlbnR5IG9mIG90aGVyIGZpZWxkcyBhcyBkZWZpbmVkIGluIHRoZSBBUEkKICAgIH0KCj1jdXQKCnN1YiBJc3N1ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJE1haW5PYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkREZWYWx1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldElEIFVzZXJJRC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQXJ0aWNsZSA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVGaXJzdEFydGljbGUoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVDcmVhdGU6IFRpY2tldElEOiAlcyA9PSAlcyBUaXRsZTogJXMgVGV4dDogJXMiLAogICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwgJEFydGljbGV7VGlja2V0SUR9LCAkQXJ0aWNsZXtUaXRsZX0sICRBcnRpY2xle0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZhbGlkTGljZW5zZSA9ICRTZWxmLT5DaGVja1ZhbGlkTGljZW5zZSgpOwogICAgaWYgKCAkVmFsaWRMaWNlbnNlICE9IDEgKSB7CiAgICAgICAgbXkgJFVSTCA9ICRTZWxmLT57Q29uZmlnfS0+e1VSTH07CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6SXNzdWVDcmVhdGU6IGludmFsaWQgbGljZW5zZSBhdCAkVVJMLCBzdGF0dXMgJFZhbGlkTGljZW5zZSIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICdObyB2YWxpZCBsaWNlbnNlJyB9OyAjIHNraXAgdGhlIHJlc3QKICAgIH0KCiAgICBteSAkUmVwb3J0ZXIgPSAkU2VsZi0+e0NvbmZpZ30tPntSZXBvcnRlcn07CiAgICBteSAkQXNzaWduZWUgPSAkU2VsZi0+e0NvbmZpZ30tPntBc3NpZ25lZX07CgogICAgIyByZWFkICdQcm9qZWN0JyBmZWxkIGZyb20gICJTeXNDb25maWciIGluIE9UUlMKICAgIG15ICRQcm9qZWN0ID0gJFNlbGYtPntDb25maWd9LT57UHJvamVjdH07CgogICAgIyByZWFkICdJc3N1ZVR5cGUnIGZlbGQgZnJvbSAgIlN5c0NvbmZpZyIgaW4gT1RSUwogICAgbXkgJElzc3VlVHlwZSAgID0gJFNlbGYtPntDb25maWd9LT57SXNzdWVUeXBlfTsKICAgIG15ICRGaWVsZE5hbWUgICA9ICdKSVJBSXNzdWVJRCc7CiAgICBteSAkSklSQUlzc3VlSUQgPSAkQXJ0aWNsZXsiRHluYW1pY0ZpZWxkXyIgLiAkRmllbGROYW1lfTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNyZWF0ZTogSklSQUlzc3VlSUQocHJlKTogJyVzJyBEeW5hbWljRmllbGRJRDogJXMgIiwKICAgICAgICAgICAgICAgICggJEpJUkFJc3N1ZUlEIHx8ICcnICksICRGaWVsZE5hbWUsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSXNzdWUgPSB7fTsKCiAgICBpZiAoJEpJUkFJc3N1ZUlEKSB7CgogICAgICAgICRJc3N1ZSA9ICRTZWxmLT5Jc3N1ZUdldCgKICAgICAgICAgICAgSXNzdWUgPT4gJEpJUkFJc3N1ZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRJc3N1ZSAmJiAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICBzcHJpbnRmIFAgLiAiOjpJc3N1ZUNyZWF0ZTogY2Fubm90IGZldGNoIHRoZSBKSVJBIElzc3VlICVzIGZvciAlcyIsCiAgICAgICAgICAgICAgICAgICAgJEpJUkFJc3N1ZUlELCAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICdDYW5ub3QgZmV0Y2ggSXNzdWUnIH07CiAgICAgICAgfQoKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRDdXN0b21GaWVsZCA9ICdjdXN0b21maWVsZF8nIC4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6Ok9UUlNUaWNrZXRJREZpZWxkJykgfHwgMTAwMDAgKTsKICAgICAgICBteSAkSklSQUNyZWF0ZVBhcmFtcyA9IHsKICAgICAgICAgICAgcHJvamVjdCAgICAgICA9PiB7IGtleSA9PiAkUHJvamVjdCB9LAogICAgICAgICAgICBpc3N1ZXR5cGUgICAgID0+IHsgbmFtZSA9PiAkSXNzdWVUeXBlIH0sCiAgICAgICAgICAgIHN1bW1hcnkgICAgICAgPT4gJEFydGljbGV7VGl0bGV9LAogICAgICAgICAgICBkZXNjcmlwdGlvbiAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICByZXBvcnRlciAgICAgID0+IHsgbmFtZSA9PiAkUmVwb3J0ZXIgfSwKICAgICAgICAgICAgYXNzaWduZWUgICAgICA9PiB7IG5hbWUgPT4gJEFzc2lnbmVlIH0sCiAgICAgICAgICAgICRDdXN0b21GaWVsZCAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICB9OwoKICAgICAgICAkSklSQUNyZWF0ZVBhcmFtcyA9ICRTZWxmLT5NYXBGaWVsZHMoICRKSVJBQ3JlYXRlUGFyYW1zLCAlQXJ0aWNsZSk7CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gICI6Oklzc3VlQ3JlYXRlOiBQYXJhbWV0ZXJzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgJE1haW5PYmplY3QtPkR1bXAoJEpJUkFDcmVhdGVQYXJhbXMpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEVycm9yQ3JlYXRlOwogICAgICAgIGV2YWwgewogICAgICAgICAgICAkSXNzdWUgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT5QT1NUKAogICAgICAgICAgICAgICAgJy9pc3N1ZScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICt7IGZpZWxkcyA9PiAkSklSQUNyZWF0ZVBhcmFtcyB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgMTsKICAgICAgICB9IG9yICRFcnJvckNyZWF0ZSA9ICRAOwogCiAgICAgICAgaWYgKCAkRXJyb3JDcmVhdGUgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6SXNzdWVDcmVhdGU6IGNhbm5vdCBjcmVhdGUgdGhlIEpJUkEgSXNzdWUgZm9yICVzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldElEfSwgJEVycm9yQ3JlYXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICRFcnJvckNyZWF0ZSB9OwogICAgICAgIH0KCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgZnJhZ2VtZW50IHRyYW5zcG9ydHMgYXR0YWNobWVudHMgYWxvbmcgd2l0aCB0aGUgaXNzdWUKICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiB0aGUgYXR0YWNobWVudHMKICAgICAgICBteSAlSW5kZXggPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXJhZ2VudCB1c2VkIGJ5IHRoZSBKaXJhIG9iamVjdCB0byBkbyB0aGUgZmlsZXVwbG9hZHMKICAgICAgICBteSAkUmVzdCA9ICRTZWxmLT57SklSQUNsaWVudH0tPntyZXN0fTsKICAgICAgICBteSAkVUEgICA9ICRSZXN0LT5nZXRVc2VyYWdlbnQoKTsKCiAgICAgICAgIyBnZXQgSUQgb2YgZWFjaCBhdHRhY2htZW50IGZpbGUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBmaWxlCiAgICAgICAgd2hpbGUgKCBteSAoICRGaWxlSUQsICRBdHRhY2hIICkgPSBlYWNoICVJbmRleCApIHsKICAgICAgICAgICAgIyByZXRyaWV2ZSB0aGUgbmFtZSBhbmQgY29udGVudCBvZiBlYWNoIGF0dGFjaG1lbnQgZmlsZSwKICAgICAgICAgICAgIyBzdG9yZSB0aGVtIGludG8gQGZpbGVuYW1lcyBhbmQgQGF0dGFjaG1lbnRzIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgbXkgQEZpbGVuYW1lczsKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzOwoKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEICAgID0+ICRGaWxlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50e0ZpbGVuYW1lfSBlcSAnZmlsZS0yJzsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlQ3JlYXRlOiBIYW5kbGluZyBhdHRhY2htZW50OiAlcyIsICRBdHRhY2htZW50e0ZpbGVuYW1lfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJElzc3VlS2V5ID0gJElzc3VlLT57a2V5fTsKCiAgICAgICAgICAgICRVQS0+cG9zdCgKICAgICAgICAgICAgICAgICRSZXN0LT5nZXRIb3N0KCkgLiAiL2lzc3VlLyRJc3N1ZUtleS9hdHRhY2htZW50cyIsCiAgICAgICAgICAgICAgICAleyRSZXN0LT57X2hlYWRlcnN9fSwKICAgICAgICAgICAgICAgICdYLUF0bGFzc2lhbi1Ub2tlbicgPT4gJ25vY2hlY2snLAogICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgICAgICA9PiAnZm9ybS1kYXRhJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIGZpbGUgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgICAgICAgICAgICAgICAgICAgIyBhcyB3ZSBoYXZlIHRoZSBjb250ZW50IGFscmVhZCwgd2UgZG8gbm90IHBhc3MgYSBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudHtGaWxlbmFtZX0sICAgIyBmaWxlbmFtZSBmb3IgdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAkQXR0YWNobWVudHtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgID0+ICRBdHRhY2htZW50e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmQgb2YgdHJhbnNwb3J0aW5nIGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREZWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIEZpZWxkSUQgID0+ICRTZWxmLT57SklSQUR5bmFtaWNGaWVsZH0tPntJRH0sCiAgICAgICAgICAgIE9iamVjdElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gWyB7IFZhbHVlVGV4dCA9PiAkSXNzdWUtPntrZXl9IH0sIF0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlQ3JlYXRlOiBKSVJBSXNzdWVJRChwb3N0KTogJXMgRHluYW1pY0ZpZWxkSUQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICAkSXNzdWUtPntrZXl9LCAkRmllbGROYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVDcmVhdGU6IFN1Y2Nlc3M6ICVzIiwgJFN1Y2Nlc3MsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGF0YSAgID0gewogICAgICAgICAgICBvYmplY3QgPT4gewogICAgICAgICAgICAgICAgdXJsICAgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJXM6Ly8lcy8lcy9pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSVzIiwKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJyksCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJyksCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgdGl0bGUgPT4gc3ByaW50ZiggIk9UUlMgVGlja2V0IyVzICglcykiLCAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgbXkgJFJlc3VsdDsKICAgICAgICBldmFsIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57SklSQUNsaWVudH0tPlBPU1QoCiAgICAgICAgICAgICAgICAnL2lzc3VlLycgLiAkSXNzdWUtPntrZXl9IC4gJy9yZW1vdGVsaW5rJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJERhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6SXNzdWVDcmVhdGU6IFJlbW90ZWxpbmsgKCVzLyVzKSByZXN1bHQgJXMiLAogICAgICAgICAgICAgICAgICAgICRJc3N1ZS0+e2tleX0sICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJE1haW5PYmplY3QtPkR1bXAoJFJlc3VsdCksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkSXNzdWU7Cn0KCj1pdGVtIElzc3VlVXBkYXRlKCkKCnVwZGF0ZXMgYW4gaXNzdWUgaW4gdGhlIGNvbmZpZ3VyZWQgSklSQSBzeXN0ZW0gdXNpbmcgUkVTVAoKICAgIG15ICRJc3N1ZSA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZVVwZGF0ZSgKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsICAgICAgICAgICAgICAgICAgIyB0aGUgVGlja2V0SUQsIG1hbmRhdG9yeQogICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySUQgICAgICAgICAgICAgICAgICAgICAjIHRoZSBVc2VySUQsIG1hbmRhdG9yeQogICAgKTsKCnJldHVybnM6CgogICAgJElzc3VlID0gewogICAgICAgIGlkID0+IDEwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzc3VlIGlkIGluIEpJUkEsIHN0YXJ0cyBmcm9tIDEwMDAwCiAgICAgICAga2V5ID0+IFBST0otMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXNzdWUga2V5IGFzIHVzZWQgaW4gdGhlIHdlYmludGVyZmFjZSwgPFByb2o+LTxOdW1iZXI+LCBzdGFydHMgZnJvbSAxCiAgICAgICAgWy4uLl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGxlbnR5IG9mIG90aGVyIGZpZWxkcyBhcyBkZWZpbmVkIGluIHRoZSBBUEkKICAgIH0KPWN1dAoKc3ViIElzc3VlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKCBxdy9UaWNrZXRJRCBVc2VySUQvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgIG15IEBJbmRleCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVJbmRleCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSA9PiAnQUxMJywKICAgICk7CgogICAgbXkgJUFydGljbGU7CgogICAgaWYgKEBJbmRleCkgewogICAgICAgICVBcnRpY2xlID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkSW5kZXhbLTFdLAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZVVwZGF0ZTogVGlja2V0SUQ6ICVzID09ICVzIFRpdGxlOiAlcyIsCiAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LCAkVGlja2V0e1RpY2tldElEfSwgJFRpY2tldHtUaXRsZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkVVJMID0gJFNlbGYtPntDb25maWd9LT57VVJMfTsKCiAgICBteSAkVmFsaWRMaWNlbnNlID0gJFNlbGYtPkNoZWNrVmFsaWRMaWNlbnNlKCk7CiAgICBpZiAoICRWYWxpZExpY2Vuc2UgIT0gMSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlVXBkYXRlOiBpbnZhbGlkIGxpY2Vuc2UgYXQgJXMsIHN0YXR1cyAlcyIsCiAgICAgICAgICAgICAgICAkVVJMLCAkVmFsaWRMaWNlbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiB7fTsgIyBza2lwIHRoZSByZXN0CiAgICB9CgogICAgbXkgJFJlcG9ydGVyID0gJFNlbGYtPntDb25maWd9LT57UmVwb3J0ZXJ9OwogICAgbXkgJEFzc2lnbmVlID0gJFNlbGYtPntDb25maWd9LT57QXNzaWduZWV9OwoKICAgICMgcmVhZCAnUHJvamVjdCcgZmVsZCBmcm9tICAiU3lzQ29uZmlnIiBpbiBPVFJTCiAgICBteSAkUHJvamVjdCA9ICRTZWxmLT57Q29uZmlnfS0+e1Byb2plY3R9OwoKICAgICMgcmVhZCAnSXNzdWVUeXBlJyBmZWxkIGZyb20gICJTeXNDb25maWciIGluIE9UUlMKICAgIG15ICRJc3N1ZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ30tPntJc3N1ZVR5cGV9OwogICAgbXkgJEZpZWxkTmFtZSA9ICdKSVJBSXNzdWVJRCc7CgogICAgbXkgJEpJUkFJc3N1ZUlEID0gJFRpY2tldHsnRHluYW1pY0ZpZWxkXycgLiAkRmllbGROYW1lfTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpJc3N1ZVVwZGF0ZTogSklSQUlzc3VlSUQocHJlKTogJyVzJyBEeW5hbWljRmllbGRJRDogJXMiLAogICAgICAgICAgICAgICAgJEpJUkFJc3N1ZUlELCAkRmllbGROYW1lLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJElzc3VlID0ge307CgogICAgaWYgKCAkSklSQUlzc3VlSUQgKSB7CiAgICAgICAgbXkgJEN1c3RvbUZpZWxkID0gJ2N1c3RvbWZpZWxkXycgLiAoICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6T1RSU1RpY2tldElERmllbGQnKSB8fCAxMDAwMCApOwoKICAgICAgICBteSAkSklSQVVwZGF0ZVBhcmFtcyA9IHsKICAgICAgICAgICAgJEN1c3RvbUZpZWxkID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgfTsKCiAgICAgICAgJEpJUkFVcGRhdGVQYXJhbXMgPSAkU2VsZi0+TWFwRmllbGRzKCAkSklSQVVwZGF0ZVBhcmFtcywgJVRpY2tldCwgJUFydGljbGUgKTsKCiAgICAgICAgbXkgJFVwZGF0ZUVycm9yOwoKICAgICAgICBldmFsewogICAgICAgICAgICAkSXNzdWUgPSAkU2VsZi0+e0pJUkFDbGllbnR9LT5QVVQoCiAgICAgICAgICAgICAgICAiL2lzc3VlLyIgLiAkSklSQUlzc3VlSUQsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHsgZmllbGRzID0+ICRKSVJBVXBkYXRlUGFyYW1zIH0sCiAgICAgICAgICAgICkKICAgICAgICB9IG9yICRVcGRhdGVFcnJvciA9ICRAOwoKICAgICAgICBpZiAoICRVcGRhdGVFcnJvciApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlVXBkYXRlOiBFcnJvciBvbiB1cGRhdGU6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICRVcGRhdGVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRJc3N1ZSB8fCAnU3VjY2Vzcyc7Cn0KCj1pdGVtIElzc3VlQ29tbWVudCgpCgpjcmVhdGVzIGFuIGlzc3VlIGluIHRoZSBjb25maWd1cmVkIEpJUkEgc3lzdGVtIHVzaW5nIFNPQVAKCiAgICBteSAkSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVDb21tZW50KAogICAgICAgIElzc3VlSUQgPT4gJFRpY2tldElELCAjIHRoZSBJc3N1ZUlELCBtYW5kYXRvcnkKICAgICAgICBDb21tZW50ID0+ICRBcnRpY2xlSUQgIyB0aGUgY29tbWVudCwgbWFuZGF0b3J5CiAgICApOwoKcmV0dXJuczoKCiAgICAkSXNzdWUgPSB7CiAgICAgICAgaWQgPT4gMTAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXNzdWUgaWQgaW4gSklSQSwgc3RhcnRzIGZyb20gMTAwMDAKICAgICAgICBrZXkgPT4gUFJPSi0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZSBrZXkgYXMgdXNlZCBpbiB0aGUgd2ViaW50ZXJmYWNlLCA8UHJvaj4tPE51bWJlcj4sIHN0YXJ0cyBmcm9tIDEKICAgICAgICBbLi4uXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwbGVudHkgb2Ygb3RoZXIgZmllbGRzIGFzIGRlZmluZWQgaW4gdGhlIEFQSQogICAgfQoKPWN1dAoKc3ViIElzc3VlQ29tbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOyAjIyBGSVhNRSBpbXBsZW1lbnQKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L0lzc3VlSUQgQ29tbWVudC8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVVJMID0gJFNlbGYtPntDb25maWd9LT57VVJMfTsKCiAgICBteSAkVmFsaWRMaWNlbnNlID0gJFNlbGYtPkNoZWNrVmFsaWRMaWNlbnNlKCk7CiAgICBpZiAoICRWYWxpZExpY2Vuc2UgIT0gMSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Oklzc3VlQ29tbWVudDogaW52YWxpZCBsaWNlbnNlIGF0ICVzLCBzdGF0dXMgJXMiLAogICAgICAgICAgICAgICAgJFVSTCwgJFZhbGlkTGljZW5zZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4ge307ICMgc2tpcCB0aGUgcmVzdAogICAgfQoKICAgIG15ICRJc3N1ZSA9IHt9OwoKICAgIGlmICggJFBhcmFte0lzc3VlSUR9ICkgewogICAgICAgIG15ICRFcnJvckNvbW1lbnQ7CiAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICRJc3N1ZSA9ICRTZWxmLT57SklSQUNsaWVudH0tPlBPU1QoCiAgICAgICAgICAgICAgICAiL2lzc3VlLyIgLiAkUGFyYW17SXNzdWVJRH0gLiAiL2NvbW1lbnQiLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB7IGJvZHkgPT4gJFBhcmFte0NvbW1lbnR9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAxOwogICAgICAgIH0gb3IgJEVycm9yQ29tbWVudCA9ICRAOwoKICAgICAgICBpZiAoICRFcnJvckNvbW1lbnQgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6SXNzdWVDb21tZW50OiBjYW5ub3QgY3JlYXRlIGNvbW1lbnQgZm9yIGlzc3VlICVzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0lzc3VlSUR9LCAkRXJyb3JDb21tZW50LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICt7IGVycm9yID0+ICRFcnJvckNvbW1lbnQgfTsKICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkSXNzdWU7Cn0KCj1pdGVtIEZpZWxkc0dldCgpCgpSZXRyaWV2ZSBmaWVsZCBkZWZpbml0aW9ucyBmcm9tIEpJUkEuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgoKICAgIG15ICRGaWVsZHMgPSAkT2JqZWN0LT5GaWVsZHNHZXQoKTsKCj1jdXQKCnN1YiBGaWVsZHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBteSAkQ2FjaGVLZXkgPSAnRmllbGRzR2V0JzsKCiAgICAkUGFyYW17UmV0dXJufSB8fD0gJyc7CgogICAgaWYgKCAkUGFyYW17UmV0dXJufSAmJiBsYyAkUGFyYW17UmV0dXJufSBlcSAndHlwZXMnICkgewogICAgICAgICRDYWNoZUtleSA9ICdGaWVsZFR5cGVzJzsKICAgIH0KCiAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgbXkgJEZpZWxkczsKICAgIG15ICRGaWVsZFR5cGVzOwoKICAgIG15ICRFcnJvckZpZWxkczsKICAgIGV2YWwgewogICAgICAgIG15ICRGaWVsZHNEYXRhID0gJFNlbGYtPntKSVJBQ2xpZW50fS0+R0VUKAogICAgICAgICAgICAiL2ZpZWxkIgogICAgICAgICk7CgogICAgICAgIG15ICVDdXN0b21GaWVsZHMgPSBtYXB7CiAgICAgICAgICAgICRfLT57bmFtZX0gPT4gJF8tPntzY2hlbWF9LT57Y3VzdG9tSWR9CiAgICAgICAgfSBncmVwIHsKICAgICAgICAgICAgJF8tPntzY2hlbWF9LT57Y3VzdG9tSWR9CiAgICAgICAgfSBAeyAkRmllbGRzRGF0YSB8fCBbXSB9OwoKICAgICAgICAkRmllbGRzID0gXCVDdXN0b21GaWVsZHM7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkRmllbGRzRGF0YSB8fCBbXSB9ICkgewogICAgICAgICAgICAkRmllbGRUeXBlcy0+eyAkRmllbGQtPntpZH0gfSA9ICRGaWVsZC0+e3NjaGVtYX07CiAgICAgICAgfQoKICAgICAgICAxOwogICAgfSBvciAkRXJyb3JGaWVsZHMgPSAkQDsKCiAgICBpZiAoICEkRXJyb3JGaWVsZHMgKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0ZpZWxkc0dldCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRGaWVsZHMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0ZpZWxkVHlwZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGRUeXBlcywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0gfHwgMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAgIjo6RmllbGRzR2V0OiBjYW5ub3QgcmV0cmlldmUgZmllbGRzIGRlZmluaXRpb25zOiAlcyIsCiAgICAgICAgICAgICAgICAkRXJyb3JGaWVsZHMsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggbGMgJFBhcmFte1JldHVybn0gZXEgJ3R5cGVzJyApIHsKICAgICAgICByZXR1cm4gJEZpZWxkVHlwZXM7CiAgICB9CgogICAgcmV0dXJuICRGaWVsZHM7Cn0KCj1pdGVtIE1hcEZpZWxkcwoKTWFwcyB0aGUgT1RSUyB0byB0aGUgSklSQSBjdXN0b20gZmllbGRzIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uClJldHVybnMgYSBoYXNoIG1hcC4KCiAgbXkgJEZpZWxkcyA9ICRPYmplY3QtPk1hcEZpZWxkcygkRmllbGRzLCAlVGlja2V0LCAlQXJ0aWNsZSkKCnJldHVybjoKCiAgJEZpZWxkcyA9IHsKICAgIHN0YW5kYXJkRmllbGQxID0+IHZhbHVlMSwKICAgIHN0YW5kYXJkRmllbGQyID0+IHZhbHVlMiwKICAgIFsuLi5dCiAgICBjdXN0b21maWVsZHMgPT4gewogICAgICAgIGNmMSA9PiB2YWx1ZTMsCiAgICAgICAgY2YyID0+IHZhbHVlNCwKICAgICAgICBbLi4uXQogICAgfQogIH0KCj1jdXQKCnN1YiBNYXBGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJEZpZWxkcywgJUFydGljbGUgKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkQ2FjaGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkREZWYWx1ZU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJyk7CgogICAgIyByZXRyaWV2ZXMgZHluYW1pYy1jdXN0b20gZmllbGQgbWFwcGluZwogICAgbXkgJEN1c3RvbUZpZWxkcyAgID0ge307CiAgICBteSAkTWFwcGluZyAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ30tPnsnT1RSUy1KSVJBLUZpZWxkTWFwcGluZyd9OwogICAgbXkgJERhdGVGb3JtYXQgICAgID0gJFNlbGYtPntDb25maWd9LT57J0pJUkEtRGF0ZUZvcm1hdCd9OwogICAgbXkgJERhdGVUaW1lRm9ybWF0ID0gJFNlbGYtPntDb25maWd9LT57J0pJUkEtRGF0ZVRpbWVGb3JtYXQnfTsKCiAgICBteSAkSklSQUZpZWxkcyAgICAgPSAkU2VsZi0+RmllbGRzR2V0KCk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IHNwcmludGYgUCAuICI6Ok1hcEZpZWxkczogQXJ0aWNsZTogJXMiLAogICAgICAgICAgICAgICAgJE1haW5PYmplY3QtPkR1bXAoIFwlQXJ0aWNsZSApLAogICAgICAgICk7CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBQIC4gIjo6TWFwRmllbGRzOiBtYXBwaW5nOiAlcyIsCiAgICAgICAgICAgICAgICAkTWFpbk9iamVjdC0+RHVtcCggJE1hcHBpbmcgKSwKICAgICAgICApOwogICAgfQogICAgCgogICAgaWYgKCBkZWZpbmVkICRNYXBwaW5nICkgewoKICAgICAgICAjIGFsbCBjaGFuZ2VzIHJlcXVpcmVkIE9OTFkgZm9yIFBlcmwgNS4xMCAuLi4KICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JE1hcHBpbmd9ICApIHsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJE1hcHBpbmctPnskS2V5fTsKCiAgICAgICAgICAgIG5leHQgS0VZIGlmICFsZW5ndGggJEtleSB8fCAhbGVuZ3RoICRWYWx1ZTsKCiAgICAgICAgICAgIG15ICgkS1ByZWZpeCwkVlByZWZpeCwkREJWYWwpID0gKCIiLCIiLHVuZGVmKTsKICAgICAgICAgICAgbXkgKCRJc0FEYXRlLCAkSXNBRGF0ZVRpbWUpID0gKDAsMCk7CgogICAgICAgICAgICAoJEtQcmVmaXgsICRLZXkpICAgPSBzcGxpdCAvOi8sICRLZXksIDI7CiAgICAgICAgICAgICgkVlByZWZpeCwgJFZhbHVlKSA9IHNwbGl0IC86LywgJFZhbHVlLCAyOwoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IGNoZWNraW5nOiBrcHJlZml4LGtleSx2cHJlZml4LHZhbCA6ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiJEtQcmVmaXgsJEtleSwkVlByZWZpeCwkVmFsdWVcbiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRLUHJlZml4IGVxICdzdGQnICkgewogICAgICAgICAgICAgICAgJERCVmFsID0gJEFydGljbGV7JEtleX07CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAiOjpNYXBGaWVsZHM6IHN0ZCBmaWVsZCB3aXRoICREQlZhbFxuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEtleSBlcSAnQ3JlYXRlZCcgfHwgJEtleSBlcSAnQ2hhbmdlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJElzQURhdGVUaW1lID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEtleSA9fiBte0RhdGVcen14bXMgKSB7CiAgICAgICAgICAgICAgICAgICAgJElzQURhdGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEtQcmVmaXggZXEgJ2R5bicgKSB7CiAgICAgICAgICAgICAgICBteSAkRHluRmllbGQgID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+ICRLZXkgKTsKICAgICAgICAgICAgICAgIG15ICRGaWVsZFR5cGUgPSAkRHluRmllbGQtPntGaWVsZFR5cGV9OwoKICAgICAgICAgICAgICAgICREQlZhbCA9ICRBcnRpY2xleyJEeW5hbWljRmllbGRfJEtleSJ9OwoKICAgICAgICAgICAgICAgIGlmICggISREQlZhbCAmJiAkRHluRmllbGQgKSB7CiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gJERGVmFsdWVPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZElEICA9PiAkRHluRmllbGQtPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICApIHx8IHVuZGVmOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBkeW4gZmllbGQgQXJyYXk6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE1haW5PYmplY3QtPkR1bXAoJERCVmFsIC8vICcnKSAuICJcbiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSXNNdWx0aXNlbGVjdDsKCiAgICAgICAgICAgICAgICAjIG9ubHkgaGFuZGxlIERhdGUsIERhdGVUaW1lIGFuZCBDaGVja2JveCwgZm9yIHRoZSByZXN0IHdlIGhhdmUgbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgaWYgKCAkRmllbGRUeXBlIGVxICdEYXRlJyApIHsKICAgICAgICAgICAgICAgICAgICAkSXNBRGF0ZSA9IDE7CgogICAgICAgICAgICAgICAgICAgICREQlZhbCA9IHJlZiAkREJWYWwgPyAkREJWYWwtPlswXS0+e1ZhbHVlRGF0ZVRpbWV9IDogJERCVmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRmllbGRUeXBlIGVxICdEYXRlVGltZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJElzQURhdGVUaW1lID0gMTsKCiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gcmVmICREQlZhbCA/ICREQlZhbC0+WzBdLT57VmFsdWVEYXRlVGltZX0gOiAkREJWYWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ0NoZWNrYm94JyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBza2lwcGluZzogQ2hlY2tib3ggIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkR5bmFtaWNmaWVsZCAkS2V5IHdpdGggdmFsdWUgJERCVmFsXG4iLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gdW5kZWY7CiAgICAgICAgICAgICAgICB9ICMgSWdub3JlIGJ5IGRlZmF1bHQgc2luY2UgSklSQSBkb2VzIG5vdCBoYXZlIGEgY2hlY2tib3ggY3VzdG9tIGZpZWxkCiAgICAgICAgICAgICAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ011bHRpc2VsZWN0JyApIHsKICAgICAgICAgICAgICAgICAgICAkREJWYWwgPSByZWYgJERCVmFsID8KICAgICAgICAgICAgICAgICAgICAgICAgWyBtYXB7ICt7IHZhbHVlID0+ICRfIH0gfUB7JERCVmFsfSBdIDoKICAgICAgICAgICAgICAgICAgICAgICAgW107CgogICAgICAgICAgICAgICAgICAgICRJc011bHRpc2VsZWN0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnRHJvcGRvd24nICkgewogICAgICAgICAgICAgICAgICAgICREQlZhbCA9IHJlZiAkREJWYWwgPwogICAgICAgICAgICAgICAgICAgICAgICAreyB2YWx1ZSA9PiAkREJWYWwtPlswXS0+e1ZhbHVlVGV4dH0gfSA6CiAgICAgICAgICAgICAgICAgICAgICAgICt7IHZhbHVlID0+ICREQlZhbCB9OwoKICAgICAgICAgICAgICAgICAgICAkSXNNdWx0aXNlbGVjdCA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJERCVmFsID0gKHJlZiAkREJWYWwgJiYgISRJc011bHRpc2VsZWN0KSA/CiAgICAgICAgICAgICAgICAgICAgKCAkREJWYWwtPlswXS0+e1ZhbHVlVGV4dH0gfHwgJERCVmFsLT5bMF0tPntWYWx1ZUludH0gKSA6CiAgICAgICAgICAgICAgICAgICAgJERCVmFsOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBkeW4gZmllbGQgd2l0aCAkREJWYWwgYW5kIHR5cGUgJEZpZWxkVHlwZVxuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEtQcmVmaXggZXEgJ2NhbGwnICkgewoKICAgICAgICAgICAgICAgICMgY2FsbHMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhpczogZS5nLiAiTUlNRTo6QmFzZTY0LGVuY29kZV9iYXNlNjQiCiAgICAgICAgICAgICAgICBteSAoJE1vZHVsZSwgJEZ1bmN0aW9uKSA9IHNwbGl0IC8sLywgJEtleTsKCiAgICAgICAgICAgICAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCAkTW9kdWxlICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvZGUgPSAkTW9kdWxlLT5jYW4oICRGdW5jdGlvbiApOwogICAgICAgICAgICAgICAgICAgICREQlZhbCAgID0gJENvZGUtPiggJFNlbGYsICRNYXBwaW5nLCAlQXJ0aWNsZSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gJzo6TWFwRmllbGRzOiBDb3VsZCBub3QgbG9hZCAnIC4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBjYWxsIHRvICckRnVuY3Rpb24nIHJlc3VsdGluZyBpbiAkREJWYWxcbiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkREJWYWwgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRJc0FEYXRlID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJERCVmFsID0gJFNlbGYtPkRhdGVGb3JtYXRUcmFuc2Zvcm0oICREYXRlRm9ybWF0LCAkREJWYWwgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRJc0FEYXRlVGltZSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICREQlZhbCA9ICRTZWxmLT5EYXRlRm9ybWF0VHJhbnNmb3JtKCAkRGF0ZVRpbWVGb3JtYXQsICREQlZhbCApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBnb3QgbWFwcGVkIHZhbHVlOiBrcHJlZml4LGtleSx2cHJlZml4LHZhbCxkYnZhbCA6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRLUHJlZml4LCRLZXksJFZQcmVmaXgsJFZhbHVlLCREQlZhbFxuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFZQcmVmaXggZXEgJ3N0ZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkcy0+eyRWYWx1ZX0gPSAkREJWYWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRWUHJlZml4IGVxICdjdXN0JyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKSVJBRmllbGRzLT57JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJEpJUkFGaWVsZHMtPnskVmFsdWV9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEZpZWxkcy0+eyJjdXN0b21maWVsZF8iIC4gJFZhbHVlfSA9ICREQlZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFZQcmVmaXggZXEgJ2NhbGwnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNhbGxzIG11c3QgYmUgc3BlY2lmaWVkIGFzIHRoaXM6IGUuZy4gIk1JTUU6OkJhc2U2NCxlbmNvZGVfYmFzZTY0IgogICAgICAgICAgICAgICAgICAgIG15ICgkTW9kdWxlLCAkRnVuY3Rpb24pID0gc3BsaXQgLywvLCAkS2V5OwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVzID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCAkTW9kdWxlICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb2RlID0gJE1vZHVsZS0+Y2FuKCAkRnVuY3Rpb24gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlcyAgICAgPSAkQ29kZS0+KCAkU2VsZiwgJERCVmFsLCAkRmllbGRzLCAlQXJ0aWNsZSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IFAgLiAnOjpNYXBGaWVsZHM6IENvdWxkIG5vdCBsb2FkICcgLiAkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBjYWxsIHRvICckRnVuY3Rpb24nIHJlc3VsdGluZyBpbiAkUmVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gUCAuICI6Ok1hcEZpZWxkczogc2tpcHBpbmc6IGtwcmVmaXgsa2V5LHZwcmVmaXgsdmFsLGRidmFsIDogIgogICAgICAgICAgICAgICAgICAgICAgICAuICIkS1ByZWZpeCwkS2V5LCRWUHJlZml4LCRWYWx1ZSwkREJWYWxcbiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBmaWVsZHM6ICIgLiAkTWFpbk9iamVjdC0+RHVtcCgkRmllbGRzKSAuICJcbiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkRmllbGRzID0gJFNlbGYtPkNoZWNrRmllbGRUeXBlcyggJEZpZWxkcyApOwoKICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6TWFwRmllbGRzOiBmaWVsZHMgKGFmdGVyIHR5cGUgY2hlY2spOiAiIC4gJE1haW5PYmplY3QtPkR1bXAoJEZpZWxkcykgLiAiXG4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRGaWVsZHM7Cn0KCj1pdGVtIERhdGVGb3JtYXRUcmFuc2Zvcm0KClRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgZGF0ZSB2YWx1ZSBvZiBhIG90cnMgKGR5bmFtaWMvc3RhbmRhcmQpIGZpZWxkIHRvIHRoZSBKaXJhIGZvcm1hdC4KCkl0IHJlY2VpdmVzIHRoZSBjdXJyZW50IGZvcm1hdCBmcm9tIHRoZSBydW5uaW5nIHN5c3RlbS4KCiAgbXkgJFZhbHVlMSA9ICRTZWxmLT5EYXRlRm9ybWF0VHJhbnNmb3JtKCclZC8lYi8leSAlSTolTSAlcCcsICAgJzIwMDQtMDgtMTQgMjI6NDU6MDAnKQoKcmV0dXJucyAKCiAgMTQvQXVnLzA0IDEwOjA1IFBNCgpvciBDPHVuZGVmPiB1cG9uIGZhaWx1cmUKCj1jdXQKCnN1YiBEYXRlRm9ybWF0VHJhbnNmb3JtIHsKICAgIG15ICgkU2VsZiwgJERhdGVGb3JtYXQsICREYXRlKSA9IEBfOwoKICAgIGlmICggIWRlZmluZWQoJERhdGUpIHx8ICggJERhdGUgZXEgIiIgKSApIHsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CgogICAgaWYgKCBsZW5ndGggJERhdGUgPCAxMSApIHsKICAgICAgICAkRGF0ZSAuPSAnIDAwOjAwOjAwJzsKICAgIH0KCiAgICBteSAkVGltZSA9IFRpbWU6OlBpZWNlLT5zdHJwdGltZSggJERhdGUsICclWS0lbS0lZCAlSDolTTolUycgKTsKICAgIGlmICggISAkVGltZSApIHsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuICRUaW1lLT5zdHJmdGltZSgnJVktJW0tJWRUJUg6JU06JVMuMDAwKzAwMDAnKTsKfQoKPWl0ZW0gQ2hlY2tGaWVsZFR5cGVzCgpUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZGF0YSB0cmFuc2ZlcmVkIHRvIHRoZSBKSVJBIHN5c3RlbSBoYXZlIHRoZSBjb3JyZWN0IHR5cGUuCkUuZy4gZmllbGRzIG9mIHR5cGUgImxhYmVscyIgaGF2ZSB0byBiZSBhbiBhcnJheSBvZiBzdHJpbmcgZXRjLgoKT24gTWFyY2ggMTB0aCwgMjAxNSB3ZSBhZ3JlZWQgb24gdGhvc2UgcmVzdHJpY3Rpb25zOgoKPW92ZXIgNAoKPWl0ZW0gKiBGb3IgZmllbGRzIG9mIHR5cGUgInVzZXIiIHRoZSAidXNlcm5hbWUiIGlzIHNldAoKPWl0ZW0gKiBGb3IgZmllbGRzIG9mIHR5cGUgInNlbGVjdCIgYW5kIHRoZSBsaWtlIHRoZSB2YWx1ZSBpcyBzZXQKCj1pdGVtICogQmVzaWRlIGN1c3RvbWZpZWxkdHlwZXMgb25seSB0eXBlICJ1c2VyIiBpcyBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudAoKPWJhY2sKCj1jdXQKCnN1YiBDaGVja0ZpZWxkVHlwZXMgewogICAgbXkgKCRTZWxmLCAkRmllbGRzKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgIG15ICVGaWVsZHNDb3B5ID0gJXskRmllbGRzfTsKCiAgICBteSAkRmllbGRzSW5mbyA9ICRTZWxmLT5GaWVsZHNHZXQoCiAgICAgICAgUmV0dXJuID0+ICdUeXBlcycsCiAgICApOwoKICAgIG15ICVEaXNwYXRjaCA9ICgKICAgICAgICBzdHJpbmcgICAgICAgICAgPT4gWyBcJl9TdHJpbmcsICAgICAgICAgICAgIF0sCiAgICAgICAgdXJsICAgICAgICAgICAgID0+IFsgXCZfU3RyaW5nLCAgICAgICAgICAgICBdLAogICAgICAgIGFycmF5ICAgICAgICAgICA9PiBbIFwmX0FycmF5LCAgICAgICAgICAgICAgXSwKICAgICAgICBsYWJlbHMgICAgICAgICAgPT4gWyBcJl9BcnJheSwgICAgICAgICAgICAgIF0sCiAgICAgICAgY2FzY2FkaW5nc2VsZWN0ID0+IFsgXCZfQXJyYXksICAgICAgICAgICAgICBdLAogICAgICAgIG11bHRpY2hlY2tib3hlcyA9PiBbIFwmX0FycmF5LCAgICAgICAgICAgICAgXSwKICAgICAgICB1c2VyICAgICAgICAgICAgPT4gWyBcJl9HZW5lcmljLCAnbmFtZScsICAgIF0sCiAgICAgICAgdXNlcnBpY2tlciAgICAgID0+IFsgXCZfR2VuZXJpYywgJ25hbWUnLCAgICBdLAogICAgICAgIHNlbGVjdCAgICAgICAgICA9PiBbIFwmX0dlbmVyaWMsICd2YWx1ZScgICAgXSwKICAgICAgICByYWRpb2J1dHRvbnMgICAgPT4gWyBcJl9HZW5lcmljLCAndmFsdWUnICAgIF0sCiAgICAgICAgbnVtYmVyICAgICAgICAgID0+IFsgXCZfTnVtYmVyLCAgICAgICAgICAgICBdLAogICAgICAgIGZsb2F0ICAgICAgICAgICA9PiBbIFwmX051bWJlciwgICAgICAgICAgICAgXSwKICAgICAgICBkYXRldGltZSAgICAgICAgPT4gWyBcJl9EYXRldGltZSwgICAgICAgICAgIF0sCiAgICAgICAgZGF0ZSAgICAgICAgICAgID0+IFsgXCZfRGF0ZXRpbWUsICdzaG9ydCcsICBdLAogICAgICAgIGRhdGVwaWNrZXIgICAgICA9PiBbIFwmX0RhdGV0aW1lLCAnc2hvcnQnLCAgXSwKICAgICAgICB0ZXh0YXJlYSAgICAgICAgPT4gWyBcJl9TdHJpbmcsICAgICAgICAgICAgIF0sCiAgICAgICAgdGV4dGZpZWxkICAgICAgID0+IFsgXCZfU3RyaW5nLCAgICAgICAgICAgICBdLAogICAgICAgIGRlZmF1bHQgICAgICAgICA9PiBbIFwmX1N0cmluZywgICAgICAgICAgICAgXSwKICAgICk7CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkICgga2V5cyAlRmllbGRzQ29weSApIHsKCiAgICAgICAgbmV4dCBpZiBmaXJzdHsgJEZpZWxkIGVxICRfIH1xdyhwcm9qZWN0IGlzc3VldHlwZSByZXBvcnRlciBhc3NpZ25lZSk7CgogICAgICAgIG15ICRTY2hlbWEgPSAkRmllbGRzSW5mby0+eyRGaWVsZH07CiAgICAgICAgbXkgJFJlZiAgICA9IHJlZiAkRmllbGRzQ29weXskRmllbGR9OwogICAgICAgIG15ICRUeXBlICAgPSAkU2NoZW1hLT57Y3VzdG9tfSB8fCAkU2NoZW1hLT57dHlwZX07CgogICAgICAgIGlmICggaW5kZXgoICRUeXBlLCAnOicgKSAhPSAtMSApIHsKICAgICAgICAgICAgJFR5cGUgPSAoc3BsaXQgLzovLCAkVHlwZSlbLTFdOwogICAgICAgIH0KCiAgICAgICAgIyBzdHJpbmcgaXMgcmVxdWlyZWQgYW5kIGl0IGlzIGFscmVhZHkgYSBzdHJpbmcgLSBubyB0cmFuc2Zvcm1hdGlvbiByZXF1aXJlZAogICAgICAgIG5leHQgRklFTEQgaWYgJFR5cGUgZXEgJ3N0cmluZycgJiYgISRSZWY7CgogICAgICAgICMgYXJyYXkgaXMgcmVxdWlyZWQgYW5kIGl0IGlzIGFscmVhZHkgYW4gYXJyYXkgLSBubyB0cmFuc2Zvcm1hdGlvbiByZXF1aXJlZAogICAgICAgIG5leHQgRklFTEQgaWYgJFR5cGUgZXEgJ2FycmF5JyAmJiAkUmVmICYmICRSZWYgZXEgJ0FSUkFZJzsKCiAgICAgICAgbXkgQFN1YlBhcmFtcyA9IEB7ICREaXNwYXRjaHskVHlwZX0gfHwgJERpc3BhdGNoe2RlZmF1bHR9IH07CiAgICAgICAgbXkgJFN1YiAgICAgICA9IHNoaWZ0IEBTdWJQYXJhbXM7CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBQIC4gIjo6Q2hlY2tGaWVsZFR5cGVzOiAiCiAgICAgICAgICAgICAgICAgICAgLiAkTWFpbk9iamVjdC0+RHVtcChbICRGaWVsZCwgJFJlZiwgJFNjaGVtYSwgJFR5cGUsICIkU3ViIiwgXEBTdWJQYXJhbXMgXSkgLiAiXG4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJFN1YjsKCiAgICAgICAgJEZpZWxkc0NvcHl7JEZpZWxkfSA9ICRTZWxmLT4kU3ViKCAkRmllbGRzQ29weXskRmllbGR9LCAkUmVmLCBAU3ViUGFyYW1zICk7CiAgICB9CgogICAgcmV0dXJuIFwlRmllbGRzQ29weTsKfQoKc3ViIF9TdHJpbmcgewogICAgbXkgKCRTZWxmLCAkVmFsdWUsICRSZWYpID0gQF87CgogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgIHJldHVybiAkVmFsdWUtPnskS2V5fTsKICAgIH0KICAgIGVsc2lmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiBqb2luICcsICcsIEB7JFZhbHVlfTsKICAgIH0KCiAgICByZXR1cm4gIiRWYWx1ZSI7Cn0KCnN1YiBfQXJyYXkgewogICAgbXkgKCRTZWxmLCAkVmFsdWUsICRSZWYpID0gQF87CgogICAgaWYgKCAkUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBteSAoJEtleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgIHJldHVybiBbICRWYWx1ZS0+eyRLZXl9IF07CiAgICB9CgogICAgcmV0dXJuIFsgJFZhbHVlIF07Cn0KCnN1YiBfR2VuZXJpYyB7CiAgICBteSAoJFNlbGYsICRWYWx1ZSwgJFJlZiwgJEtleSkgPSBAXzsKCiAgICBpZiAoICRSZWYgZXEgJ0hBU0gnICYmICFleGlzdHMgJFZhbHVlLT57JEtleX0gKSB7CiAgICAgICAgbXkgKCRFeGlzdGluZ0tleSkgPSBzb3J0IGtleXMgJXskVmFsdWV9OwogICAgICAgIHJldHVybiAreyAkS2V5ID0+ICRWYWx1ZS0+eyRFeGlzdGluZ0tleX0gfTsKICAgIH0KICAgIGVsc2lmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiAreyAkS2V5ID0+IGpvaW4gJywgJywgQHskVmFsdWV9IH07CiAgICB9CgogICAgcmV0dXJuICt7ICRLZXkgPT4gIiRWYWx1ZSIgfTsKfQoKc3ViIF9OdW1iZXIgewogICAgbXkgKCRTZWxmLCAkVmFsdWUsICRSZWYpID0gQF87CgogICAgbXkgJFZhbHVlQ29weSA9ICRWYWx1ZTsKICAgIGlmICggJFJlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgKCRLZXkpID0gc29ydCBrZXlzICV7JFZhbHVlfTsKICAgICAgICAkVmFsdWVDb3B5ID0gJFZhbHVlLT57JEtleX07CiAgICB9CiAgICBlbHNpZiAoICRSZWYgZXEgJ0FSUkFZJyApIHsKICAgICAgICAkVmFsdWVDb3B5ID0gam9pbiAnLCAnLCBAeyRWYWx1ZX07CiAgICB9CgogICAgaWYgKCAhIGxvb2tzX2xpa2VfbnVtYmVyKCAkVmFsdWVDb3B5ICkgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVHJ5IHRvIGNhc3QgJFZhbHVlQ29weSB0byBhIG51bWJlciIsCiAgICAgICAgKTsKCiAgICAgICAgbm8gd2FybmluZ3MgJ251bWVyaWMnOwogICAgICAgICRWYWx1ZUNvcHkgKz0gMDsKICAgIH0KCiAgICByZXR1cm4gJFZhbHVlQ29weTsKfQoKc3ViIF9EYXRldGltZSB7CiAgICBteSAoJFNlbGYsICRWYWx1ZSwgJFJlZiwgJFR5cGUpID0gQF87CgogICAgbXkgJFZhbHVlQ29weSA9ICRWYWx1ZTsKICAgIGlmICggJFJlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgKCRLZXkpID0gc29ydCBrZXlzICV7JFZhbHVlfTsKICAgICAgICAkVmFsdWVDb3B5ID0gJFZhbHVlLT57JEtleX07CiAgICB9CiAgICBlbHNpZiAoICRSZWYgZXEgJ0FSUkFZJyApIHsKICAgICAgICAkVmFsdWVDb3B5ID0gam9pbiAnICcsIEB7JFZhbHVlfTsKICAgIH0KCiAgICBteSAlUmVnZXhlcyA9ICgKICAgICAgICAnTG9uZycgID0+IHFyL1swLTldezR9LVswLTldezJ9LVswLTldezJ9VFswLTldezJ9OlswLTldezJ9OlswLTldezJ9XC5bMC05XStcK1swLTldKy8sCiAgICAgICAgJ1Nob3J0JyA9PiBxci9bMC05XXs0fS1bMC05XXsyfS1bMC05XXsyfS8sCiAgICApOwoKICAgICNteSAkUmVnZXggPSAkUmVnZXhlc3skVHlwZX0gfHwgJFJlZ2V4ZXN7TG9uZ307CiAgICBteSAkUmVnZXggPSAkUmVnZXhlc3tMb25nfTsKCiAgICBpZiAoICRWYWx1ZUNvcHkgIX4gJFJlZ2V4ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJFZhbHVlQ29weSBpcyBub3QgYSBkYXRlIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkVmFsdWVDb3B5Owp9Cgo9aXRlbSBUaGlzIGZ1bmN0aW9uIGNhbGxzIEpJUkEgYW4gcXVlcmllcyB0aGUgbGljZW5zZSBzdGF0dXMgZm9yIHRoaXMgaW5zdGFsbGF0aW9uLgoKbXkgJHN0YXR1cyA9ICRTZWxmLT5DaGVja1ZhbGlkTGljZW5zZSgpOwoKcmV0dXJuczoKCjAgdXBvbiBmYWlsdXJlCjEgdXBvbiB2YWxpZCBsaWNlbnNlCjIgdXBvbiBleHBpcmVkIGxpY2Vuc2UKCj1jdXQKCnN1YiBDaGVja1ZhbGlkTGljZW5zZSB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ307CgogICAgbXkgJFVSTCAgICAgID0gJENvbmZpZy0+e1VSTH07CiAgICBteSAkVXNlciAgICAgPSAkQ29uZmlnLT57VXNlcn07CiAgICBteSAkUGFzc3dvcmQgPSAkQ29uZmlnLT57UGFzc3dvcmR9OwoKICAgICMjIG1heWJlIG1vdmUgdGhpcyBpbnRvIGEgc3ViCiAgICBteSAkSGVhZGVycyA9IHsKICAgICAgICBBY2NlcHQgICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uJywKIyBUaGUgbGF0dGVyIGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBPVFJTSklSQS04MQojICAgICAgICAgICAgQXV0aG9yaXphdGlvbiA9PiAnQmFzaWMgJwojICAgICAgICAgICAgICAuIGVuY29kZV9iYXNlNjQoICR1c2VyIC4gJzonIC4gJHBhc3N3b3JkICksCiAgICAgICAgIkNvbnRlbnQtdHlwZSIgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgfTsKCiAgICBteSAkQ2xpZW50ID0gUkVTVDo6Q2xpZW50LT5uZXcoKTsKICAgICRDbGllbnQtPnNldEZvbGxvdygxKTsKCiAgICBteSAkVmVyaWZ5U1NMID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpTU0xWZXJpZnknKTsKCiAgICBpZiAoICEkVmVyaWZ5U1NMICkgewogICAgICAgIG15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAnTmV0OjpTU0xlYXknLAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkTG9hZGVkKSB7CiAgICAgICAgICAgICRDbGllbnQtPmdldFVzZXJhZ2VudCgpLT5zc2xfb3B0cyggdmVyaWZ5X2hvc3RuYW1lID0+IDAgKTsKICAgICAgICAgICAgJENsaWVudC0+Z2V0VXNlcmFnZW50KCktPnNzbF9vcHRzKCBTU0xfdmVyZml5X21vZGUgPT4gTmV0OjpTU0xlYXk6OlZFUklGWV9OT05FKCkgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCRQcm90bywgdW5kZWYsICRIb3N0LCBAQmFzZVVSTCApID0gc3BsaXQgJy8nLCAkVVJMOwogICAgbXkgJEdldFVSTCA9ICcvJy4gam9pbignLycsIEBCYXNlVVJMKSAuICcvcmVzdC9vdHJzMmppcmEvMS4wL2luZm8nOwoKICAgICRHZXRVUkwgPX4gc3svL317L31nOwogICAgJENsaWVudC0+c2V0SG9zdCgiJFByb3RvLy8kSG9zdCIpOwogICAgJENsaWVudC0+R0VUKCAkR2V0VVJMLCAkSGVhZGVycyApOwoKIAogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAgUCAuICI6OkNoZWNrVmFsaWRMaWNlbnNlOiBSRVNUOiBob3N0ICRQcm90by8vJEhvc3QgZ2V0dXJsICRHZXRVUkwiLAogICAgICAgICk7CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiBzcHJpbnRmIFAgLiAiOjpDaGVja1ZhbGlkTGljZW5zZTogUkVTVDogcmVzcG9uc2VDb2RlICVzLCByZXNwb25zZUNvbnRlbnQgJXMiLAogICAgICAgICAgICAgICAgJENsaWVudC0+cmVzcG9uc2VDb2RlKCksCiAgICAgICAgICAgICAgICAkQ2xpZW50LT5yZXNwb25zZUNvbnRlbnQoKSwKICAgICAgICApOwogICAgfQoKICAgICMgVE9ETzogRmVobGVybWVsZHVuZyBhdXNnZWJlbiB3ZW5uIEZlaGxlciBiZWkgZGVyIFZlcmJpbmR1bmcgYXVmdHJpdHQKCiAgICByZXR1cm4gaW50KCRDbGllbnQtPnJlc3BvbnNlQ29udGVudCgpKTsKfQoKMTsKCg==
IyAgLS0KIyAgS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRKSVJBLnBtIC0gZnJvbnRlbmQgbW9kdWxlCiMgIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IGNhdFdvcmtYIEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojICAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEpJUkE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9IHF3KAogICAgS2VybmVsOjpDb25maWcKICAgIEtlcm5lbDo6U3lzdGVtOjpMb2cKICAgIEtlcm5lbDo6U3lzdGVtOjpNYWluCiAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0CiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0CiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQQopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgJFNlbGYtPntEZWJ1Z30gICA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6RGVidWcnKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gX19QQUNLQUdFX18gLiAnOjpuZXcoKTogU3ViYWN0aW9uPScgLiAkUGFyYW17U3ViYWN0aW9ufSAuICcgVGlja2V0SUQ9JyAuICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRMb2dPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJFRpY2tldEpJUkFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQScpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJURhdGEgID0gKCk7CiAgICBteSAkQmxvY2sgPSAnU3VjY2Vzcyc7CgogICAgIyBTdWJhY3Rpb24gPSBKSVJBMk9UUlMgfHwgT1RSUzJKSVJBCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVGlja2V0SUQ6ICRUaWNrZXR7VGlja2V0SUR9IFRpdGxlOiAkVGlja2V0e1RpdGxlfSBTdGF0ZTogJFRpY2tldHtTdGF0ZX0iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSklSQUNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpIHx8IHt9OwoKICAgIG15ICRBbGxvd2VkU3RhdGVzTmFtZXMgPSAkSklSQUNvbmZpZy0+e09UUlNUaWNrZXRBbGxvd2VkU3RhdGVzNENyZWF0ZX07CiAgICBteSBAQWxsb3dlZFN0YXRlc0xpc3QgID0gc3BsaXQgLywvLCAkQWxsb3dlZFN0YXRlc05hbWVzOwoKICAgIGlmICggZmlyc3QgeyAkXyBlcSAkVGlja2V0e1N0YXRlfSB9IEBBbGxvd2VkU3RhdGVzTGlzdCApIHsKICAgICAgICBteSAkSklSQUlzc3VlID0gJFRpY2tldEpJUkFPYmplY3QtPklzc3VlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6ICIgLiAkTWFpbk9iamVjdC0+RHVtcCgkSklSQUlzc3VlKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEpJUkFJc3N1ZS0+e2Vycm9yfSApIHsKICAgICAgICAgICAgJEJsb2NrICAgICAgID0gJ0Vycm9yJzsKICAgICAgICAgICAgJERhdGF7ZXJyb3J9ID0gJEpJUkFJc3N1ZS0+e2Vycm9yfTsKICAgICAgICB9CgogICAgICAgIG15ICRVUkwgPSAkSklSQUNvbmZpZy0+e1VSTH07CgkgICAgICAKICAgICAgICAkRGF0YXtpZH0gID0gJEpJUkFJc3N1ZS0+e2lkfTsKICAgICAgICAkRGF0YXtrZXl9ID0gJEpJUkFJc3N1ZS0+e2tleX07CiAgICAgICAgJERhdGF7dXJsfSA9ICIkVVJML2Jyb3dzZS8iIC4gJEpJUkFJc3N1ZS0+e2tleX07CgogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldC0+U3RhdGUgJFRpY2tldHtTdGF0ZX0gYWxsb3dzIGZldGNoaW5nICIKICAgICAgICAgICAgICAgICAgICAuICJvZiB0aGUgSklSQUlzc3VlLT5rZXk6ICIgLiAkSklSQUlzc3VlLT57a2V5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQmxvY2sgICAgICAgID0gJ0Vycm9yJzsKICAgICAgICAkRGF0YXtlcnJvcn0gID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAiVGlja2V0IG5vdCBpbiAkQWxsb3dlZFN0YXRlc05hbWVzOiAiIC4gJFRpY2tldHtTdGF0ZX0gLiAiLiIKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBPVFJTIFRpY2tldCBub3QgaW4gJEFsbG93ZWRTdGF0ZXNOYW1lczogIiAuICRUaWNrZXR7U3RhdGV9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICREYXRhe1RpY2tldElEfSAgICAgPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0e1RpY2tldE51bWJlcn07CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgTmFtZSA9PiAkQmxvY2ssCiAgICApOwoKICAgICMgYnVpbGQgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKFRpdGxlID0+ICJUaWNrZXRKSVJBIik7CiAgICAkT3V0cHV0ICAgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAgIC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRKSVJBJywKICAgICk7CiAgICAkT3V0cHV0ICAgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAgLS0KIyAgS2VybmVsL0xhbmd1YWdlL2RlX0FnZW50VGlja2V0SklSQS5wbSAtIGxhbmd1YWdlIG1vZHVsZQojICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBjYXRXb3JrWCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FnZW50VGlja2V0SklSQTsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIG5ldyBKSVJBIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQnfSA9ICdFaW4gbmV1ZXMgSklSQSBJc3N1ZSB3dXJkZSBlcnN0ZWxsdCc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgSklSQSBJc3N1ZSBjb3VsZCBub3QgYmUgY3JlYXRlZCd9ID0gJ0VpbiBKSVJBIElzc3VlIGtvbm50ZSBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4nOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyB0aGUgaXNzdWUgKEpJUkEpJ30gPSAnWnVtIEpJUkEgSXNzdWUnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpJ30gPSAnWnVyw7xjayB6dW0gT1RSUyBUaWNrZXQnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgbm90IG9wZW4uJ30gPSAnVGlja2V0IG5pY2h0IGltIG9mZmVuZW4gWnVzdGFuZC4nOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKSVJBIHRvIE9UUlMnfSA9ICdKSVJBIG5hY2ggT1RSUyc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rha2UgdGhpcyB0aWNrZXQgYmFjayBmcm9tIEpJUkEnfSA9ICdEaWVzZXMgVGlja2V0IGF1cyBKSVJBIHp1csO8Y2tob2xlbic7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgdG8gSklSQSd9ID0gJ09UUlMgbmFjaCBKSVJBJzsKICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXNjYWxhdGUgdGhpcyB0aWNrZXQgdG8gSklSQSd9ID0gJ0RpZXNlcyBUaWNrZXQgbmFjaCBKSVJBIGVza2FsaWVyZW4nOwogICAjJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJ30gPSAnJzsKICAgcmV0dXJuIDE7Cn0KMTsK
IyAgLS0KIyAgS2VybmVsL0xhbmd1YWdlL2VuX0FnZW50VGlja2V0SklSQS5wbSAtIGxhbmd1YWdlIG1vZHVsZQojICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBjYXRXb3JrWCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUKIyAgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0FnZW50VGlja2V0SklSQTsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIG5ldyBKSVJBIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQnfSA9ICdBIG5ldyBKSVJBIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIEpJUkEgSXNzdWUgY291bGQgbm90IGJlIGNyZWF0ZWQnfSA9ICdBIEpJUkEgSXNzdWUgY291bGQgbm90IGJlIGNyZWF0ZWQnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyB0aGUgaXNzdWUgKEpJUkEpJ30gPSAnVG8gdGhlIGlzc3VlIChKSVJBKSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgdG8gdGhlIHRpY2tldCAoT1RSUyknfSA9ICdCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpJzsKICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IG5vdCBvcGVuLid9ID0gJ1RpY2tldCBub3Qgb3Blbi4nOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKSVJBIHRvIE9UUlMnfSA9ICdKSVJBIHRvIE9UUlMnOwogICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWtlIHRoaXMgdGlja2V0IGJhY2sgZnJvbSBKSVJBJ30gPSAnVGFrZSB0aGlzIHRpY2tldCBiYWNrIGZyb20gSklSQSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgdG8gSklSQSd9ID0gJ09UUlMgdG8gSklSQSc7CiAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VzY2FsYXRlIHRoaXMgdGlja2V0IHRvIEpJUkEnfSA9ICdFc2NhbGF0ZSB0aGlzIHRpY2tldCB0byBKSVJBJzsKICAgIyRTZWxmLT57VHJhbnNsYXRpb259LT57Jyd9ID0gJyc7CiAgIHJldHVybiAxOwp9CjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEpJUkEudHQgLSBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAxNSBjYXRXb3JrWCBHbWJoLCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3VjY2VzcyIpICVdCiAgICA8IS0tIHN0YXJ0IGZvcm0gLS0+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBzdHlsZT0icGFkZGluZy1sZWZ0OiAxY207cGFkZGluZy10b3A6IDFjbTsiPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICA8aDE+WyUgRW52KCJCb3gwIikgJV1bJSBUcmFuc2xhdGUoIkEgbmV3IEpJUkEgSXNzdWUgaGFzIGJlZW4gY3JlYXRlZCIpIHwgaHRtbCAlXSFbJSBFbnYoIkJveDAiKSAlXTwvaDE+CiAgICAgICAgPC90aD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyB0aGUgaXNzdWUgKEpJUkEpIikgfCBodG1sICVdOiA8YSBocmVmPSJbJSBEYXRhLnVybCB8IGh0bWwgJV0iPlslIERhdGEua2V5IHwgaHRtbCAlXSAoWyUgRGF0YS5pZCB8IGh0bWwgJV0pPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQmFjayB0byB0aGUgdGlja2V0IChPVFJTKSIpIHwgaHRtbCAlXTogPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSI+WyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIChbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSk8L2E+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgICA8IS0tIGVuZCBmb3JtIC0tPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3VjY2VzcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFcnJvciIpICVdCiAgICA8IS0tIHN0YXJ0IGZvcm0gLS0+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBzdHlsZT0icGFkZGluZy1sZWZ0OiAxY207cGFkZGluZy10b3A6IDFjbTsiPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICA8aDE+WyUgRW52KCJCb3gwIikgJV1bJSBUcmFuc2xhdGUoIkEgSklSQSBJc3N1ZSBjb3VsZCBub3QgYmUgY3JlYXRlZCIpIHwgaHRtbCAlXSFbJSBFbnYoIkJveDAiKSAlXTwvaDE+CiAgICAgICAgPC90aD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgRW52KCJCb3gwIikgJV1bJSBEYXRhLmVycm9yIHwgaHRtbCAlXVslIEVudigiQm94MCIpICVdCiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgWyUgVHJhbnNsYXRlKCJCYWNrIHRvIHRoZSB0aWNrZXQgKE9UUlMpIikgfCBodG1sICVdOiA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIj5bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV0gKFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdKTwvYT4KICAgICAgICA8L3RkPgogICAgICA8L3RyPgogICAgPC90YWJsZT4KICAgIDwhLS0gZW5kIGZvcm0gLS0+ClslIFJlbmRlckJsb2NrRW5kKCJFcnJvciIpICVdCgogIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51SklSQS5wbSAtIG1lbnUgbW9kdWxlCiMgIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IGNhdFdvcmtYIEdtYkggaHR0cDovL3d3dy5jYXR3b3JreC5kZQojICAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVKSVJBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRWRVJTSU9OID0gJzAuMDInOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygKICAgIEtlcm5lbDo6Q29uZmlnCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0CiAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Cik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCiAgICBteSAkU2VsZiA9IHsgJVBhcmFtIH07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGlja2V0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEFjdGlvbiA9ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufTsKCiAgICAjIGNoZWNrIGlmIGZyb250ZW5kIG1vZHVsZSByZWdpc3RlcmVkLCBpZiBub3QsIGRvIG5vdCBzaG93IGFjdGlvbgogICAgaWYgKCAkQWN0aW9uICkgewogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259OwoKICAgICAgICByZXR1cm4gaWYgISRNb2R1bGU7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdydycsCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIExvZ05vICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEFjY2Vzc09rOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfSApICkgewogICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9LAogICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkQWNjZXNzT2s7CiAgICB9CgogICAgIyBjaGVjayBhY2wKICAgIGlmICggZGVmaW5lZCAkUGFyYW17QUNMfS0+eyRBY3Rpb259ICYmICEkUGFyYW17QUNMfS0+eyRBY3Rpb259ICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9OwoKICAgICMgaWYgdGlja2V0IGlzIGV4Y2FsYXRlZAogICAgaWYgKCAkUGFyYW17VGlja2V0fS0+e0pJUkF9IGVxICdsb2NrJyApIHsKCiAgICAgICAgIyBpZiBpdCBpcyBsb2NrZWQgZm9yIHNvbWVib2R5IGVsc2UKICAgICAgICByZXR1cm4gaWYgJFBhcmFte1RpY2tldH0tPntPd25lcklEfSBuZSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICMgc2hvdyBjdXN0b20gYWN0aW9uCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICAgICAgJXsgJFBhcmFte1RpY2tldH0gfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnSklSQSB0byBPVFJTJyksCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdUYWtlIHRoaXMgdGlja2V0IGJhY2sgZnJvbSBKSVJBJyksCiAgICAgICAgICAgIExpbmsgICAgICAgID0+ICdBY3Rpb249QWdlbnRUaWNrZXRKSVJBO1N1YmFjdGlvbj1KSVJBMk9UUlM7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXScsCiAgICAgICAgIH07CiAgICAgfQoKICAgICAjIGlmIHRpY2tldCBpcyBlc2NhbGF0ZWQKICAgICByZXR1cm4gewogICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAleyAkUGFyYW17VGlja2V0fSB9LAogICAgICAgICAlUGFyYW0sCiAgICAgICAgIE5hbWUgICAgICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnT1RSUyB0byBKSVJBJyksCiAgICAgICAgIERlc2NyaXB0aW9uICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnRXNjYWxhdGUgdGhpcyB0aWNrZXQgdG8gSklSQScpLAogICAgICAgICBMaW5rICAgICAgICAgPT4gJ0FjdGlvbj1BZ2VudFRpY2tldEpJUkE7U3ViYWN0aW9uPU9UUlMySklSQTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEICVdJywKICAgICB9Owp9CgoxOwo=
IyAtLQ0KIyBLZXJuZWwvU3lzdGVtL1RpY2tldC9FdmVudC9DbG9zZUpJUkFJc3N1ZS5wbSAtIGV2ZW50IG1vZHVsZQ0KIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBjYXRXb3JrWCBHbWJIIGh0dHA6Ly93d3cuY2F0d29ya3guZGUNCiMgLS0NCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUNCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQ0KIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Lg0KIyAtLQ0KDQpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpDbG9zZUpJUkFJc3N1ZTsNCg0KdXNlIHN0cmljdDsNCnVzZSB3YXJuaW5nczsNCg0KdXNlIExpc3Q6OlV0aWwgcXcoZmlyc3QpOw0KDQpvdXIgJFZFUlNJT04gPSA0LjAwMTsNCg0Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSBxdygNCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nDQogICAgS2VybmVsOjpTeXN0ZW06OkNvbmZpZw0KICAgIEtlcm5lbDo6U3lzdGVtOjpKU09ODQogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldA0KICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBDQopOw0KDQpzdWIgbmV3IHsNCiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOw0KDQogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0DQogICAgbXkgJFNlbGYgPSB7fTsNCiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7DQoNCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsNCiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOw0KDQogICAgcmV0dXJuICRTZWxmOw0KfQ0KDQpzdWIgUnVuIHsNCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOw0KDQogICAgbXkgJFRpY2tldE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7DQogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOw0KICAgIG15ICRMb2dPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOw0KICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsNCg0KICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmDQogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgew0KICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7DQogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywNCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIVxuIiwNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciBteSAkTmVlZGVkRGF0YSAocXcoVGlja2V0SUQpKSB7DQogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWREYXRhfSApIHsNCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWREYXRhIGluIERhdGEhXG4iLA0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9Ow0KDQogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0SUQgRXZlbnQ6ICRQYXJhbXtFdmVudH1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQojICAgIHJldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ1RpY2tldFN0YXRlVXBkYXRlJzsNCg0KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoDQogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELA0KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsDQogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwNCiAgICApOw0KDQogICAgcmV0dXJuIDEgaWYgISVUaWNrZXQ7DQoNCiAgICBteSAkSklSQUlzc3VlSUQgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9KSVJBSXNzdWVJRH07DQogICAgcmV0dXJuIDEgaWYgISRKSVJBSXNzdWVJRDsNCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldHtUaWNrZXRJRH0gVGl0bGU6ICRUaWNrZXR7VGl0bGV9ICINCiAgICAgICAgICAgICAgICAuICJTdGF0ZTogJFRpY2tldHtTdGF0ZX1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpIHx8ICB7fTsNCg0KICAgIG15ICRBbGxvd2VkU3RhdGVzTmFtZXMgPSAkQ29uZmlnLT57T1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0Q2xvc2V9Ow0KICAgIG15IEBBbGxvd2VkU3RhdGVzTGlzdCAgPSBzcGxpdCAvLC8sICRBbGxvd2VkU3RhdGVzTmFtZXM7DQoNCiAgICBpZiAoICFmaXJzdHsgJF8gZXEgJFRpY2tldHtTdGF0ZX0gfSBAQWxsb3dlZFN0YXRlc0xpc3QgKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IE9UUlMgVGlja2V0IG5vdCBpbiAkQWxsb3dlZFN0YXRlc05hbWVzOiAkVGlja2V0e1N0YXRlfVxuIiwNCiAgICAgICAgKTsNCg0KICAgICAgICByZXR1cm4gMTsNCiAgICB9DQoNCiAgICBteSAkVVJMID0gJENvbmZpZy0+e1VSTH07DQoNCiAgICBteSAkVmFsaWRMaWNlbnNlID0gJFRpY2tldEpJUkFPYmplY3QtPkNoZWNrVmFsaWRMaWNlbnNlKCk7DQogICAgaWYgKCAkVmFsaWRMaWNlbnNlICE9IDEgKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBpbnZhbGlkIGxpY2Vuc2UgYXQgJFVSTCwgc3RhdHVzICRWYWxpZExpY2Vuc2UiLA0KICAgICAgICApOw0KDQogICAgICAgIHJldHVybiAxOyAjIHNraXAgdGhlIHJlc3QNCiAgICB9DQoNCiAgICBteSAkSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVHZXQoIElzc3VlID0+ICRKSVJBSXNzdWVJRCApOw0KDQogICAgaWYgKCAkSXNzdWUtPntlcnJvcn0gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBjYW5ub3QgZmV0Y2ggdGhlIEpJUkEgSXNzdWUgIg0KICAgICAgICAgICAgICAgIC4gJEpJUkFJc3N1ZUlEIC4gIiBmb3IgIiAuICRUaWNrZXR7VGlja2V0SUR9IC4gIjogJEAiLA0KICAgICAgICApOw0KDQogICAgICAgIHJldHVybiAxOw0KICAgIH0NCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBpc3N1ZSBleGlzdHNcbiIsDQogICAgICAgICk7DQogICAgfQ0KDQogICAgbXkgQEFydGljbGVJbmRleCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVHZXQoDQogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LA0KICAgICAgICBVc2VySUQgICA9PiAxLA0KICAgICAgICBPcmRlciAgICA9PiAnREVTQycsICMgREVTQyxBU0MgLSBkZWZhdWx0IGlzIEFTQw0KICAgICAgICBMaW1pdCAgICA9PiAxLA0KICAgICk7DQoNCiAgICBteSAkUmVzdWx0ID0gJFRpY2tldEpJUkFPYmplY3QtPklzc3VlQ2xvc2UoDQogICAgICAgIElzc3VlSUQgPT4gJEpJUkFJc3N1ZUlELA0KICAgICAgICBDb21tZW50ID0+ICJPVFJTOiAkVGlja2V0e1N0YXRlfVxuXG4tLS0tLS0tLVxuIiAuICRBcnRpY2xlSW5kZXhbMF0tPntCb2R5fSwNCiAgICApOw0KDQogICAgaWYgKCAkUmVzdWx0LT57ZXJyb3J9ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLA0KICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOiBDYW5ub3QgY2xvc2UgaXNzdWUgJEpJUkFJc3N1ZUlEOiAkUmVzdWx0LT57ZXJyb3J9XG4iLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIHJldHVybiAxOw0KfQ0KDQoxOw0K
IyAtLQ0KIyBLZXJuZWwvU3lzdGVtL1RpY2tldC9FdmVudC9DcmVhdGVKSVJBSXNzdWUucG0gLSBldmVudCBtb2R1bGUNCiMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgY2F0V29ya1ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlDQojIC0tDQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlDQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UNCiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4NCiMgLS0NCg0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q3JlYXRlSklSQUlzc3VlOw0KDQp1c2Ugc3RyaWN0Ow0KdXNlIHdhcm5pbmdzOw0KDQp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7DQoNCm91ciAkVkVSU0lPTiA9ICc0LjAwMSc7DQoNCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoDQogICAgS2VybmVsOjpDb25maWcNCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nDQogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldA0KICAgIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXRKSVJBDQopOw0KDQpzdWIgbmV3IHsNCiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOw0KDQogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0DQogICAgbXkgJFNlbGYgPSB7fTsNCiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7DQoNCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsNCiAgICAkU2VsZi0+e0RlYnVnfSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdKSVJBOjpEZWJ1ZycpOw0KDQogICAgcmV0dXJuICRTZWxmOw0KfQ0KDQpzdWIgUnVuIHsNCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOw0KDQogICAgbXkgJFRpY2tldE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7DQogICAgbXkgJENvbmZpZ09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOw0KICAgIG15ICRMb2dPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOw0KICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsNCg0KICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmDQogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgew0KICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7DQogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywNCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIVxuIiwNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciBteSAkTmVlZGVkRGF0YSAocXcoVGlja2V0SUQpKSB7DQogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWREYXRhfSApIHsNCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWREYXRhIGluIERhdGEhXG4iLA0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9Ow0KDQogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0SURcbiIsDQogICAgICAgICk7DQoNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0SUQgRXZlbnQ6ICRQYXJhbXtFdmVudH1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQojICAgIHJldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ1RpY2tldFN0YXRlVXBkYXRlJzsNCg0KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoDQogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELA0KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsDQogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwNCiAgICApOw0KDQogICAgcmV0dXJuIDEgaWYgISVUaWNrZXQ7DQoNCiAgICBteSAkSklSQUlzc3VlSUQgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9KSVJBSXNzdWVJRH07DQogICAgcmV0dXJuIDEgaWYgJEpJUkFJc3N1ZUlEOw0KDQogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFRpY2tldElEOiAkVGlja2V0e1RpY2tldElEfSBUaXRsZTogJFRpY2tldHtUaXRsZX0gIg0KICAgICAgICAgICAgICAgIC4gIlN0YXRlOiAkVGlja2V0e1N0YXRlfVxuIiwNCiAgICAgICAgKTsNCiAgICB9DQoNCiAgICBteSAkQWxsb3dlZFN0YXRlc05hbWVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyktPntPVFJTVGlja2V0QWxsb3dlZFN0YXRlczRDcmVhdGV9Ow0KICAgIG15IEBBbGxvd2VkU3RhdGVzTGlzdCAgPSBzcGxpdCAvLC8sICRBbGxvd2VkU3RhdGVzTmFtZXM7DQoNCiAgICBpZiAoICEgZmlyc3R7ICRfIGVxICRUaWNrZXR7U3RhdGV9IH0gQEFsbG93ZWRTdGF0ZXNMaXN0ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBPVFJTIFRpY2tldCBub3QgaW4gJEFsbG93ZWRTdGF0ZXNOYW1lczogJFRpY2tldHtTdGF0ZX1cbiIsDQogICAgICAgICk7DQoNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KDQogICAgbXkgJEpJUkFJc3N1ZSA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZUNyZWF0ZSgNCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sDQogICAgICAgIFVzZXJJRCAgID0+IDEsDQogICAgKTsgIyBGSVhNRTogVXNlcklEID8NCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6IFVwZGF0ZSByZXNwb25zZSAkSklSQUlzc3VlXG4iLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIHJldHVybiAxOw0KfQ0KDQoxOw0K
IyAtLQ0KIyBLZXJuZWwvU3lzdGVtL1RpY2tldC9FdmVudC9VcGRhdGVKSVJBSXNzdWUucG0gLSBldmVudCBtb2R1bGUNCiMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgY2F0V29ya1ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlDQojIC0tDQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlDQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UNCiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4NCiMgLS0NCg0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6VXBkYXRlSklSQUlzc3VlOw0KDQp1c2Ugc3RyaWN0Ow0KdXNlIHdhcm5pbmdzOw0KDQp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7DQoNCm91ciAkVkVSU0lPTiA9ICc0LjAwMSc7DQoNCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoDQogICAgS2VybmVsOjpDb25maWcNCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nDQogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldA0KICAgIEtlcm5lbDo6U3lzdGVtOjpVc2VyDQogICAgS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkENCik7DQoNCnN1YiBuZXcgew0KICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87DQoNCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QNCiAgICBteSAkU2VsZiA9IHt9Ow0KICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsNCg0KICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOw0KICAgICRTZWxmLT57RGVidWd9ICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0pJUkE6OkRlYnVnJyk7DQoNCiAgICByZXR1cm4gJFNlbGY7DQp9DQoNCnN1YiBSdW4gew0KICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87DQoNCiAgICBteSAkVGlja2V0T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsNCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7DQogICAgbXkgJFVzZXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOw0KICAgIG15ICRMb2dPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOw0KICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsNCg0KICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmDQogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsNCiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgew0KICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsDQogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCFcbiIsDQogICAgICAgICAgICApOw0KDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgbXkgJE5lZWRlZERhdGEgKHF3KFRpY2tldElEKSkgew0KICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkRGF0YX0gKSB7DQogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywNCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkRGF0YSBpbiBEYXRhIVxuIiwNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsNCg0KICAgICMgR2V0IGN1cnJlbnQgdXNlciBkYXRhDQogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKA0KICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwNCiAgICApOw0KDQogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFVzZXJJRDogJFVzZXJJRCBVc2VyTG9naW46ICRDdXJyZW50VXNlcntVc2VyTG9naW59XG4iLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIGlmICggJEN1cnJlbnRVc2Vye1VzZXJMb2dpbn0gZXEgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRKSVJBJyktPntJbmNvbWluZ1VzZXJ9ICkgew0KICAgIAlyZXR1cm4gMTsNCiAgICB9DQoNCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH07DQoNCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLA0KICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogVGlja2V0SUQ6ICRUaWNrZXRJRCBFdmVudDogJFBhcmFte0V2ZW50fVxuIiwNCiAgICAgICAgKTsNCiAgICB9DQoNCiAgICAjIyBjYW5ub3QgdG8gKnRoYXQqIGVhc2lseSwgbWF5YmUgd2UnbGwgY2hlY2sgdGhlIFhNTC1Qcm9wcyBsYXRlciBvbiAjI3JldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ1RpY2tldFN0YXRlVXBkYXRlJzsNCg0KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoDQogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELA0KICAgICAgICBVc2VySUQgICAgICAgID0+IDEsDQogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwNCiAgICApOw0KDQogICAgcmV0dXJuIDEgaWYgISVUaWNrZXQ7DQoNCiAgICBteSAkSklSQUlzc3VlSUQgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9KSVJBSXNzdWVJRH07DQogICAgcmV0dXJuIDEgaWYgISRKSVJBSXNzdWVJRDsNCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldHtUaWNrZXRJRH0gVGl0bGU6ICRUaWNrZXR7VGl0bGV9ICINCiAgICAgICAgICAgICAgICAuICJTdGF0ZTogJFRpY2tldHtTdGF0ZX1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQogICAgbXkgJEFsbG93ZWRTdGF0ZXNOYW1lcyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57T1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0VXBkYXRlfTsNCiAgICBteSBAQWxsb3dlZFN0YXRlc0xpc3QgID0gc3BsaXQgLywvLCAkQWxsb3dlZFN0YXRlc05hbWVzOw0KDQogICAgaWYgKCAhZmlyc3R7ICRfIGVxICRUaWNrZXR7U3RhdGV9IH0gQEFsbG93ZWRTdGF0ZXNMaXN0ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBPVFJTIFRpY2tldCBub3QgaW4gJEFsbG93ZWRTdGF0ZXNOYW1lczogJFRpY2tldHtTdGF0ZX1cbiIsDQogICAgICAgICk7DQoNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KDQogICAgbXkgJEpJUkFJc3N1ZSA9ICRUaWNrZXRKSVJBT2JqZWN0LT5Jc3N1ZVVwZGF0ZSgNCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sDQogICAgICAgIFVzZXJJRCAgID0+IDEsDQogICAgKTsgIyBGSVhNRTogVXNlcklEID8NCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6IFVwZGF0ZSByZXNwb25zZSAkSklSQUlzc3VlXG4iLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIHJldHVybiAxOw0KfQ0KDQoxOw0K
IyAtLQ0KIyBLZXJuZWwvU3lzdGVtL1RpY2tldC9FdmVudC9BZGRBcnRpY2xlVG9KSVJBSXNzdWUucG0gLSBldmVudCBtb2R1bGUNCiMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgY2F0V29ya1ggR21iSCBodHRwOi8vd3d3LmNhdHdvcmt4LmRlDQojIC0tDQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlDQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UNCiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4NCiMgLS0NCg0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6QWRkQXJ0aWNsZVRvSklSQUlzc3VlOw0KDQp1c2Ugc3RyaWN0Ow0KdXNlIHdhcm5pbmdzOw0KDQp1c2UgTGlzdDo6VXRpbCBxdyhmaXJzdCk7DQoNCm91ciAkVkVSU0lPTiA9ICc0LjAwMSc7DQoNCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gcXcoDQogICAgS2VybmVsOjpDb25maWcNCiAgICBLZXJuZWw6OlN5c3RlbTo6TG9nDQogICAgS2VybmVsOjpTeXN0ZW06Ok1haW4NCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0DQogICAgS2VybmVsOjpTeXN0ZW06OlVzZXINCiAgICBLZXJuZWw6OlN5c3RlbTo6VGlja2V0SklSQQ0KKTsNCg0Kc3ViIG5ldyB7DQogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsNCg0KICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdA0KICAgIG15ICRTZWxmID0ge307DQogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOw0KDQogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7DQogICAgJFNlbGYtPntEZWJ1Z30gICA9ICRDb25maWdPYmplY3QtPkdldCgnSklSQTo6RGVidWcnKTsNCg0KICAgIHJldHVybiAkU2VsZjsNCn0NCg0Kc3ViIFJ1biB7DQogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsNCg0KICAgIG15ICRUaWNrZXRPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOw0KICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsNCiAgICBteSAkTWFpbk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7DQogICAgbXkgJFVzZXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOw0KICAgIG15ICRMb2dPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOw0KICAgIG15ICRUaWNrZXRKSVJBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldEpJUkEnKTsNCg0KICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmDQogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsNCiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgew0KICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsDQogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCFcbiIsDQogICAgICAgICAgICApOw0KDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgbXkgJE5lZWRlZERhdGEgKHF3KFRpY2tldElEKSkgew0KICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkRGF0YX0gKSB7DQogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywNCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkRGF0YSBpbiBEYXRhIVxuIiwNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfTsNCg0KICAgICMgR2V0IGN1cnJlbnQgdXNlciBkYXRhDQogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKA0KICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwNCiAgICApOw0KDQogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywNCiAgICAgICAgICAgIE1lc3NhZ2UgID0+IF9fUEFDS0FHRV9fIC4gIjo6UnVuKCk6IFVzZXJJRDogJFVzZXJJRCBVc2VyTG9naW46ICRDdXJyZW50VXNlcntVc2VyTG9naW59XG4iDQogICAgICAgICk7DQogICAgfQ0KDQogICAgaWYgKCAkQ3VycmVudFVzZXJ7VXNlckxvZ2lufSBlcSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEpJUkEnKS0+e0luY29taW5nVXNlcn0gKSB7DQogICAgCXJldHVybiAxOw0KICAgIH0NCg0KICAgIG15ICRUaWNrZXRJRCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfTsNCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldElEIEV2ZW50OiAkUGFyYW17RXZlbnR9XG4iDQogICAgICAgICk7DQogICAgfQ0KDQojICAgIHJldHVybiAxIGlmICRQYXJhbXtFdmVudH0gbmUgJ0FydGljbGVDcmVhdGUnOw0KDQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgNCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsDQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwNCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLA0KICAgICk7DQoNCiAgICByZXR1cm4gMSBpZiAhJVRpY2tldDsNCg0KICAgIG15ICRJc3N1ZUlEID0gJFRpY2tldHtEeW5hbWljRmllbGRfSklSQUlzc3VlSUR9Ow0KICAgIHJldHVybiAxIGlmICEkSXNzdWVJRDsNCg0KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7DQogICAgICAgICRMb2dPYmplY3QtPkxvZygNCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsDQogICAgICAgICAgICBNZXNzYWdlICA9PiBfX1BBQ0tBR0VfXyAuICI6OlJ1bigpOiBUaWNrZXRJRDogJFRpY2tldHtUaWNrZXRJRH0gVGl0bGU6ICRUaWNrZXR7VGl0bGV9ICINCiAgICAgICAgICAgICAgICAuICJTdGF0ZTogJFRpY2tldHtTdGF0ZX1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQogICAgbXkgQEFydGljbGVJbmRleCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVHZXQoDQogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwNCiAgICAgICAgVXNlcklEICAgPT4gMSwNCiAgICApOw0KDQogICAgcmV0dXJuIDEgaWYgIUBBcnRpY2xlSW5kZXg7DQoNCiAgICBteSAlQXJ0aWNsZSA9ICV7ICRBcnRpY2xlSW5kZXhbLTFdIH07DQoNCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLA0KICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogQXJ0aWNsZUlEOiAkQXJ0aWNsZXtBcnRpY2xlSUR9IFRpdGxlOiAkQXJ0aWNsZXtUaXRsZX1cbiIsDQogICAgICAgICk7DQogICAgfQ0KDQogICAgcmV0dXJuIDEgaWYgISVBcnRpY2xlOw0KDQogICAgbXkgJEFsbG93ZWRTdGF0ZXNOYW1lcyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0SklSQScpLT57T1RSU1RpY2tldEFsbG93ZWRTdGF0ZXM0VXBkYXRlfTsNCiAgICBteSBAQWxsb3dlZFN0YXRlc0xpc3QgID0gc3BsaXQgLywvLCAkQWxsb3dlZFN0YXRlc05hbWVzOw0KDQogICAgaWYgKCAhZmlyc3QgeyAkXyBlcSAkVGlja2V0e1N0YXRlfSB9IEBBbGxvd2VkU3RhdGVzTGlzdCApIHsNCiAgICAgICAgJExvZ09iamVjdC0+TG9nKA0KICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLA0KICAgICAgICAgICAgTWVzc2FnZSAgPT4gX19QQUNLQUdFX18gLiAiOjpSdW4oKTogT1RSUyBUaWNrZXQgbm90IGluICRBbGxvd2VkU3RhdGVzTmFtZXM6ICRUaWNrZXR7U3RhdGV9XG4iLA0KICAgICAgICApOw0KDQogICAgICAgIHJldHVybiAxOw0KICAgIH0NCg0KICAgIG15ICRKSVJBSXNzdWUgPSAkVGlja2V0SklSQU9iamVjdC0+SXNzdWVDb21tZW50KA0KICAgICAgICBJc3N1ZUlEID0+ICRJc3N1ZUlELA0KICAgICAgICBDb21tZW50ID0+ICRBcnRpY2xle0JvZHl9LA0KICAgICk7DQoNCiAgICAjIFRPRE86IElmIGVycm9yIG9jY3VyZWQgc2hvdyBub3RpZmljYXRpb24gYmFyDQoNCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgew0KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coDQogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLA0KICAgICAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZiBfX1BBQ0tBR0VfXyAuICI6IFVwZGF0ZSByZXNwb25zZSAlc1xuIiwNCiAgICAgICAgICAgICAgICAkTWFpbk9iamVjdC0+RHVtcCggJEpJUkFJc3N1ZSApLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIHJldHVybiAxOw0KfQ0KDQoxOw0K