ITSMConfigurationManagement
2.1.2
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.2.
Build for OTRS::ITSM 2.1.1.
Build for OTRS::ITSM 2.1.0 beta4.
Build for OTRS::ITSM 2.1.0 beta3.
Build for OTRS::ITSM 2.1.0 beta2.
Build for OTRS::ITSM 2.1.0 beta1.
Build for OTRS::ITSM 2.1.0 alpha1.
The OTRS::ITSM Configuration Management package.
Das OTRS::ITSM Configuration Management Paket.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package ITSMConfigurationManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.1.2</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.1.2</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the config item menu, you need to add them as member to the group 'itsm-configitem'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf das ConfigItem-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-configitem' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'itsm-configitem' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
All links to config item objects will be irrevocably deleted!
<br>
<br>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'itsm-configitem' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
Alle Verknüpfungen zu ConfigItem-Objekten werden unwiderruflich gelöscht!
<br>
<br>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package ITSMConfigurationManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.1.2</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu aktualisieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.1.2</li>
</ul>
<br>
((enjoy))<br>
<br>
ITSMCore
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# cleanup stats list
{
# load required modules
$Self->{MainObject}->Require('Kernel::System::CSV');
$Self->{MainObject}->Require('Kernel::System::Group');
$Self->{MainObject}->Require('Kernel::System::User');
$Self->{MainObject}->Require('Kernel::System::Stats');
# create needed objects
$Self->{CSVObject} = Kernel::System::CSV->new( %{$Self} );
$Self->{GroupObject} = Kernel::System::Group->new( %{$Self} );
$Self->{UserObject} = Kernel::System::User->new( %{$Self} );
$Self->{StatsObject} = Kernel::System::Stats->new(
%{$Self},
UserID => 1,
);
# cleanup stats list
$Self->{StatsObject}->StatsCleanUp();
}
# define function name
my $FunctionName = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2011-02-11 18:18:16
opms.otrs.com
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AtESAADcRbQEAPewkzcAAEwiWgKAe9jJGwAAJnnYffIAYAX1+/0gCCqVim28AQDgBtESAAAAADOyIA4AAACAGYmWAAAAAJiRaAkAAACAGYmWAAAAAJiRaAkAAACAGYmWAAAAAJiRaAkAAACAGYmWAOB+FxcXJycnaZqWXQgAAMyXpOwCAGABtFqtbrdbq9UqlUrZtQAAwBwRLQHA/dbW1qrVahzHZRcCAADzJcyyrOwaAAAAAFhI9loCAAAAYEaiJQAAAABmJFoCAAAAYEaiJQAAAABmJFoCAAAAYEaiJQAAAABmJFoCAAAAYEaiJQAAAABmJFoCgKl8+PDhf/7nfzqdTtmFAADAHBEtAcBUsiwLgmA4HJZdCAAAzBHREgBMJY7jQLQEAABfEy0BwFRESwAAcJtoCQCmkiRJIFoCAICviZYAYCp519JgMCi7EAAAmCOiJQCYigVxAABwm2gJAKYiWgIAgNtESwAwFdESAADcJloCgKmIlgAA4DbREgBMJY+WAukSAABcI1oCgKmEYRhFUSBaAgCAa0RLADCtJEkC0RIAAFwjWgKAadluCQAAbhAtAcC08mhpMBiUXQgAAMwL0RIATEvXEgAA3CBaAoBpiZYAAOAG0RIATEu0BAAAN4iWAGBaoiUAALhBtAQA00qSJBAtAQDANaIlAJhWHMdxHOcBEwAAEARBmGVZ2TUAAAAAsJB0LQEAAAAwI9ESAAAAADMSLQEAAAAwI9ESAAAAADMSLQEAAAAwo/8HJSIGA3yJN3IAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29uZmlnSXRlbS54bWwsdiAxLjEyIDIwMTAvMDMvMTUgMDk6MjQ6MjcgYmVzIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01Db25maWdJdGVtIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlciBBZG1pbklUU01Db25maWdJdGVtIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q29uZmlnIEl0ZW08L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+Q29uZmlnIEl0ZW08L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrMzwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDk1PC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW0tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIENvbmZpZyBJdGVtIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNvbmZpZyBJdGVtPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aXRzbV9jb25maWdpdGVtLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW08L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+T3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNvbmZpZyBJdGVtPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIFpvb208L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIEVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkVkaXQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtUHJpbnQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtUHJpbnQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBQcmludDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+UHJpbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbUFkZCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIEFkZDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+QWRkPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TmV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5OZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtQWRkPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNvbmZpZyBJdGVtPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4yMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlYXJjaCBDb25maWcgSXRlbXM8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlNlYXJjaDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlYXJjaCBDb25maWcgSXRlbXM8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlYXJjaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c2VhcmNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2g8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgYmFjayBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgWnVy/GNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW0mYW1wO0NsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+b25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxMDAtVmVyc2lvbnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB2ZXJzaW9ucyBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgVmVyc2lvbmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudVZlcnNpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5WZXJzaW9uczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgYmFjayBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgWnVy/GNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkmYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtWZXJzaW9uSUQ9JFFEYXRheyJWZXJzaW9uSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzMwMC1FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgZWRpdCBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgQmVhcmJlaXRlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+RWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0JmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzQwMC1QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHByaW50IGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciBEcnVja2VuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50JmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7VmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+dGFyZ2V0PSJwcmludCI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM1MDAtTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSBsaW5rIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciBWZXJrbvxwZmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50TGlua09iamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdCZhbXA7U291cmNlT2JqZWN0PUlUU01Db25maWdJdGVtJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJDb25maWdJdGVtSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzYwMC1EdXBsaWNhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBkdXBsaWNhdGUgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyIER1cGxpemllcmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0JmFtcDtEdXBsaWNhdGVJRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtWZXJzaW9uSUQ9JFFEYXRheyJWZXJzaW9uSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZWxlY3QgdGhlIGNvbmZpZyBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlnIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlEIENvbmZpZ0l0ZW1DbGFzc0lEIENvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkF1c3dhaGwgZGVzIE1vZHVscyB6dXIgR2VuZXJpZXJ1bmcgZGVyIENvbmZpZ0l0ZW0tTnVtbWVyLiAiQXV0b0luY3JlbWVudCIgeuRobHQgZGllIENvbmZpZ0l0ZW0tTnVtbWVyIGF1dG9tYXRpc2NoIGhvY2ggdW5kIHZlcmJpbmRldCBzaWUgbWl0IGRlciBTeXN0ZW1JRCB1bmQgbWl0IGRlciBDb25maWdJdGVtQ2xhc3NJRC4gRXMgd2lyZCBkYXMgRm9ybWF0ICJTeXN0ZW1JRCBDb25maWdJdGVtQ2xhc3NJRCBDb3VudGVyIiB2ZXJ3ZW5kZXQsIHouIEIuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gTG9jYXRpb249Iktlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyLyoucG0iIFNlbGVjdGVkSUQ9Iktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOjpBdXRvSW5jcmVtZW50Ij48L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpEZWZhdWx0U3ViT2JqZWN0IyMjSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJvYmplY3Qgb2YgdGhlIGNsYXNzICdJVFNNQ29uZmlnSXRlbScuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkYXMgU3RhbmRhcmQtU3Vib2JqZWN0IGRlciBLbGFzc2UgJ0lUU01Db25maWdJdGVtJy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkNvbXB1dGVyPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgaXRzbSBjb25maWcgaXRlbSBzdHVmZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIFN0YXRpc3Rpa2VuIPxiZXIgSVRTTSBDb25maWdJdGVtIERpbmdlIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5PYmpla3QtQmFja2VuZCBNb2R1bCBSZWdpc3RyYXRpb24gZGVzIEltcG9ydC9FeHBvcnQgTW9kdWxzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk9iamVjdEJhY2tlbmQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5Db25maWcgSXRlbTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpFdmVudE1vZHVsZVBvc3QjIyMxMDAtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNvbmZpZyBpdGVtIGV2ZW50IG1vZHVsZSB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FdmVudC1Nb2R1bCBm/HIgQ29uZmlnSXRlbXMsIGRhcyBkYXMgTG9nZ2luZyBpbiBkaWUgSGlzdG9yaWUgZXJsYXVidC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENvbmZpZ0l0ZW1DcmVhdGV8VmVyc2lvbkNyZWF0ZXxEZXBsb3ltZW50U3RhdGVVcGRhdGV8SW5jaWRlbnRTdGF0ZVVwZGF0ZXxDb25maWdJdGVtRGVsZXRlfExpbmtBZGR8TGlua0RlbGV0ZXxEZWZpbml0aW9uVXBkYXRlfE5hbWVVcGRhdGV8VmFsdWVVcGRhdGV8RGVmaW5pdGlvbkNyZWF0ZXxWZXJzaW9uRGVsZXRlKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Okhpc3RvcnlPcmRlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgaGlzdG9yeSBvcmRlciByZXZlcnNlIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgdW5kZXIgY29uZmlnIGl0ZW0gaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+WmVpZ2UgZGllIEhpc3RvcmllIG5vcm1hbCBvZGVyIHL8Y2t35HJ0cyBzb3J0aWVydCBpbSBBZ2VudC1JbnRlcmZhY2UgdW50ZXIgZGVyIENvbmZpZ0l0ZW0tSGlzdG9yaWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpWaWV3SGlzdG9yeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0ibm9ybWFsIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icmV2ZXJzZSI+cmV2ZXJzZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm9ybWFsIj5ub3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LU9iamVrdHMgaW0gQWdlbnRlbi1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBIaXN0b3J5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5IaXN0b3J5PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNEZXBsb3ltZW50U3RhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UGFyYW1ldGVycyBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGVuIEF1c2dhYmVzdGF0dXMgaW4gZGVyIEFuc2ljaHQgZvxyIGRpZSBFaW5zdGVsbHVuZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+RGVwbG95bWVudCBTdGF0ZSBUeXBlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZXBsb3ltZW50IFN0YXRlIFR5cGUuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwb3N0cHJvZHVjdGl2ZSI+cG9zdHByb2R1Y3RpdmU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icHJlcHJvZHVjdGl2ZSI+cHJlcHJvZHVjdGl2ZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwcm9kdWN0aXZlIj5wcm9kdWN0aXZlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+RnVuY3Rpb25hbGl0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPk9wdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzcyMjIzAxMC1DbGFzc0dyb3VwQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNsYXNzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0g3GJlcnBy/GZlbiBkZXIgR3J1cHBlLCBkaWUgZvxyIGVpbmUgS2xhc3NlIHp1c3TkbmRpZyBpc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6Q2xhc3NHcm91cENoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtIyMjMDEwLUl0ZW1DbGFzc0dyb3VwQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGdyb3VwIHJlc3BvbnNpYmxlIGZvciBhIGNvbmZpZ2l0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1vZHVsIHp1bSDcYmVycHL8ZmVuIGRlciBHcnVwcGUsIGRpZSBm/HIgZWluIENvbmZpZ0l0ZW0genVzdORuZGlnIGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtQ2xhc3NHcm91cENoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZSBSZWNodGUgenVyIEFuemVpZ2UgZGVyIENvbmZpZ0l0ZW0gS2xhc3NlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG9wdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlIFJlY2h0ZSB6dXIgQW56ZWlnZSBkZXIgQ29uZmlnSXRlbSBLbGFzc2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbUFkZCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZSBSZWNodGUgenVyIEFuemVpZ2UgZGVyIENvbmZpZ0l0ZW0gS2xhc3NlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG9wdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlIFJlY2h0ZSB6dXIgQW56ZWlnZSBkZXIgQ29uZmlnSXRlbSBIaXN0b3JpZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtUHJpbnQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgb3B0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGUgUmVjaHRlIHp1bSBEcnVja2VuIGRlcyBDb25maWdJdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtWm9vbSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZSBSZWNodGUgenVyIEFuemVpZ2UgZGVzIENvbmZpZ0l0ZW1zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgb3B0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGUgUmVjaHRlIHp1bSBEcnVja2VuIGRlcyBDb25maWdJdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI1Blcm1pc3Npb25zIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGllIHp1Z3JpZmZzYmVyZWNodGlndGUgR3J1cHBlIGRlciBHZW5lcmFsQ2F0YWxvZy1BdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+UGVybWlzc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xhc3MiPklUU006OkNvbmZpZ0l0ZW06OkNsYXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0lUU01Db25maWdJdGVtLnBtLHYgMS41IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDt4CDq7u306OPz8OD26O7t7ejy5SDl5Ojt6PboIENJJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICfP8O7s/+3gIO3gIOTl9Ojt6Pbo//LgJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICfK6+DxJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICfP7urg5uggwuXw8ejo8uUnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ9Hq8OjpIMLl8PHo6PLlJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfP7vHr5eTt7iDv8O7s5e3l7SDu8ic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnz+7x6+Xk7eAg7/Du7P/t4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnz/Du7P/t4PLgIO3gIOTl9Ojt6Pbo6PLlIOUg7eXz8e/l+O3gISDC6OYg8ejx8uXs7ej/IObz8O3g6yDn4CDk5fLg6evoLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSAgICAgICAgPSAnxOAg8vrw8egg6CDiIO/w5eTo+O3o8uUg4uXw8ejoPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7q4Ofg7egg6u7t9Ojj8/Au5eTo7ej26Cc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICAgICAgICAgPSAnxO7x8vrv7egg6u7t9Ojj8/Au5eTo7ej26Cc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICcnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u8evl5O3gIO/w7uz/7eAnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83g7/Dg4ugg6u7v6OUnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn8uXq6+gnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83l4Ory6OLt6Cc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7k5PD65urgJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP6Ovu8i3i7uTg9yc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+vg7ejw4O0nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7uTz6vLo4uXtJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ5ezu7fIvwvrn8fLg7e7i/+Lg7eUnOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn6//n+usg7vIg8+/u8vDl4eAnOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w5ePr5ebk4O0nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Ll8fIvyuD35fHy4uXtIOru7fLw7usnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN4PHy7uvl7Sc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Dl7e7x6OwnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Ll6+X07u0nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9H68OL68Cc7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwPD16OLo8OD57iDzLeLuJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB6Ozl8Cc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuDs5fDgJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE7uro7eMg8fLg7fbo/yc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuvg4ujg8vPw4Cc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7k5ewnOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu7ejy7vAnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zo+OrgJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUENNQ0lBIOrg8PLgJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP8Ojt8uXwJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ8/Ll8Cc7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0erl7eXwJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfTLeLuIOfgIPHo4/Pw7e7x8ic7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyu7t9uXt8vDg8u7wJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVU0Ig0/Hy8O7p8fLi7ic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiDy7vfq4CDn4CDk7vHy+u8nOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Dk7Ojt6PHy8ODy6OLt5e0g6O3x8vDz7OXt8ic7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7y8OXh6PLl6/Hq6CDv8Ojr7ubl7ej/JzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP7vLw5eHo8uXr8ergIM7v5fAu8S3s4Cc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwuPw4OTl7eAnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hw5eTt7iDt6OLuJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAn0frw4vrw7e4g7/Do6+7m5e3o5Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn8frw4vrw7eAgzu/l8C7xLezgJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6ugg6O3x8vDz7OXt8ic7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnyu7t6vPw5e3y7egg7+7y8OXh6PLl6+gnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tl7O4nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5yDn4CDw4Ofw4OHu8vfo9ugnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Xt8vrw7/Dg6fEg6+j25e3nJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB5efv6+Dy7e4g8ODn7/Du8fLw4O3/4uDtJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR7vTy8+XwIPEg7vLi7vDl7SDq7uQnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+jw4O3lIO3gIPLu9+rgJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo8ODt5SDn4CDv8O725fHu8Cc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAny+j25e3n6PDg7eUg5+Ag8frw4vrwJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo8ODt5SDn4CDv7vLw5eHo8uXrJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfF5Ojt6Pfl7SDr6Pbl7ecnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5ywg7uPw4O3o9+XtIO/uIOLw5ezlJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN5e7j8ODt6Pfl7SDr6Pbl7ecnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hv5fbo4Ovt6CDu4eXs7egg7/Du4/Dg7OgnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu5OXrJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR5fDo5e0gze7s5fAnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87v5fDg9uju7e3gIPHo8fLl7OAnOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7vbl8e7wJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP4Ozl8ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0uL68OQg5Ojx6ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAn0uL68OQg5Ojx6jo66uDv4Pbo8uXyJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK4O/g9ujy5fInOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zw5ebu4iDg5ODv8uXwJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICfM8OXm7uIg4OTg7/Ll8Do6SVAg7vIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgICAgPSAnzPDl5u7iIODk4O/y5fA6OklQIMDk8OXxJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCDu8iBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCDg5PDl8Sc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw/Dg9Oj37eAg6uDw8uAnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PuIO7h7vDz5OLg7eUnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgID0gJ8Tg8uAg7eAg6Ofy6Pfg7eUg7eAg4+Dw4O326P/y4Cc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxODy4CDt4CDo7fHy4Ovg9uj/JzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM8OXm7uIg4OTw5fEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICAgID0gJ8zw5ebu4iDg5PDl8To6zODx6uAg7eAg7+7k7PDl5uDy4Cc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgICAgPSAnzPDl5u7iIODk8OXxOjrD5enyIO/w5fXu5Cc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzODx6uAg7eAg7+7k7PDl5uDy4Cc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw+Xp8iDv8OX17uQnOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Lo7yDt4CDr6Pbl7efgJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73JzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73OjrK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73OjrE4PLgIO3gIOjn8uj34O3lJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE4PLgIO3gIOjn8uj34O3lJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM5eTo/yc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjQgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0VsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICfAcmVhLUVsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZFwnZWxlbWVudHMgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdDYW52aWFyIGRlZmluaWNp8yc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdNb3N0cmFyIHZlcnNpb25zJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdPY3VsdGFyIHZlcnNpb25zJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfabHRpbSBjYW52aSBwZXInOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ9psdGltIGNhbnZpJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICdDYW52aSBkZSBkZWZpbmljafMgaGEgZmFsbGF0ISBWZXVyZSBlbCByZWdpc3RyZSBkZWwgc2lzdGVtYSBwZXIgYSBt6XMgZGV0YWxscy4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQ2VyY2FyIHRhbWLpIGVuIHZlcnNpb25zIGFudGVyaW9ycz8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudHMgZGUgY29uZmlndXJhY2nzIG1vc3RyYXRzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0VsZW1lbnRzIGRlIGNvbmZpZ3VyYWNp8yBkaXNwb25pYmxlcyc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICdDZXJjYXIgZWxlbWVudHMgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0VzdGF0IGRlbCBkZXNwbGVnYW1lbnQnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnRXN0YXQgYWN0dWFsIGRlbCBkZXNwbGVnYW1lbnQnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnRXN0YXQgZGUgbFwnaW5jaWRlbnQnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgPSAnRXN0YXQgYWN0dWFsIGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0VsIG5vbSBkXCdhcXVlc3QgZWxlbWVudCBkZSBjb25maWd1cmFjafMnOwogICAgJExhbmctPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9CiAgICAgICAgPSAnTFwnZXN0YXQgZGVsIGRlc3BsZWdhbWVudCBkXGFxdWVzdCBlbGVtZW50IGRlIGNvbmZpZ3VyYWNp8yc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9CiAgICAgICAgPSAnTFwnZXN0YXQgZGUgbFwnaW5jaWRlbnQgZFwnYXF1ZXN0IGVsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgPSAn2mx0aW0gY2FudmknOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaWNhcic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGlyYXQnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmFjdGl1JzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgPSAnTWFudGVuaW1lbnQnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BsYW5pZmljYXQnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWNjafMnOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXBhcmFyJzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmV0aXJhdCc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JldmlzYXInOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm92YXIvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpdSc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50JzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnT3JkaW5hZG9yJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9ydOB0aWwnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRyZXMnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWzoZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Vydmlkb3InOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IGRlIGPycGllcyBkZSBzZWd1cmV0YXQnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9qZWN0b3InOwogICAgJExhbmctPnsnQ2FtZXJhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdD4G1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICA9ICdVbml0YXQgZFwnZXhwYW5zafMnOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWNsYXQnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN8mRlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSYXRvbO0nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRyZXMnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICA9ICdUYXJnZXRhIFBDTUNJQSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcHJlc3NvcmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdFbmNhbWluYWRvcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0VzY+BuZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IGRlIHNlZ3VyZXRhdCc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NvbW11dGFkb3InOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgID0gJ1B1bnQgZFwnYWNj6XMgV0xBTic7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJlcyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgID0gJ0VpbmEgZFwnYWRtaW5pc3RyYWNp8yc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwbGljYWNp8yBjbGllbnQnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICA9ICdTaXN0ZW1hIE9wZXJhdGl1IGNsaWVudCc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ludGVncmF0JzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJlcyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwbGljYWNp8yBzZXJ2aWRvcic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgID0gJ1Npc3RlbWEgT3BlcmF0aXUgc2Vydmlkb3InOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICA9ICdFaW5hIGRcJ3VzdWFyaSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1VzdWFyaXMgY29uY3VycmVudHMnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgPSAnTGxpY+huY2lhIGRlIGRlc2Vudm9sdXBhbWVudCc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgID0gJ0xsaWPobmNpYSBjb3Jwb3JhdGl2YSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgTm9kZSc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgID0gJ1BlciBQcm9jZXNzYWRvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgID0gJ1BlciBTZXJ2aWRvcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBVc3VhcmknOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdMbGlj6G5jaWEgSW5kaXZpZHVhbCc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ1Jlc3RyaWNjafMgZGUgdGVtcHMnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICA9ICdJbLdsaW1pdGF0JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgPSAnTGxpY+huY2lhIHBlciB2b2x1bSc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVsJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTm9tYnJlIGRlIHPocmllJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgPSAnU2lzdGVtYSBPcGVyYXRpdSc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NQVSc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhbSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc2MgZHVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgPSAnRGlzYyBkdXI6OkNhcGFjaXRhdCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NhcGFjaXRhdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGFwdGFkb3IgZGUgeGFyeGEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGFwdGFkb3IgZGUgeGFyeGE6OklQIHBlciBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgPSAnQWRhcHRhZG9yIGRlIHhhcnhhOjpEaXJlY2Np8yBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgID0gJ0lQIHBlciBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgPSAnRGlyZWNjafMgSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGFwdGFkb3IgZ3LgZmljJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgPSAnQWx0ZXIgZXF1aXBhbWVudCc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgID0gJ0RhdGEgZGUgZmkgZGUgbGEgZ2FyYW50aWEnOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICA9ICdEYXRhIGRcJ2luc3RhbLdsYWNp8yc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgID0gJ0RpcmVjY2nzIGRlIHhhcnhhJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6U3VibmV0IE1hc2snfSAgPSAnRGlyZWNjafMgZGUgeGFyeGE6Ok3gc2NhcmEgZGUgc3VieGFyeGEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICA9ICdEaXJlY2Np8yBkZSB4YXJ4YTo6UG9ydGEgZFwnZW5sbGHnJzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgPSAnTeBzY2FyYSBkZSBzdWJ4YXJ4YSc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BvcnRhIGRcJ2VubGxh5yc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgID0gJ1RpcHVzIGRlIGxsaWPobmNpYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgID0gJ0NsYXUgZGUgbGxpY+huY2lhJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgPSAnQ2xhdSBkZSBsbGlj6G5jaWE6OkN1YW50aXRhdCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gID0gJ0NsYXUgZGUgbGxpY+huY2lhOjpEYXRhIGRcJ2V4cGlyYWNp8yc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0N1YW50aXRhdCc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0RhdGEgZFwnZXhwaXJhY2nzJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ05vbWJyZSBt4HhpbSBkXCd1biBlbGVtZW50JzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgPSAnSWRlbnRpZmljYWRvcic7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyBDb3B5cmlnaHQgKEMpIDIwMTAgTzJCUy5jb20sIHMgci5vLiBKYWt1YiBIYW51cwojIC0tCiMgJElkOiBjel9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuNyAyMDEwLzAyLzIyIDEyOjE4OjMwIG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnS29uZmlnLiBQb2xvvmthJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdLb25maWcuIFBvbG++a2EtU3RydWt0dXJhJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdTcHLhdmEgS29uZmlndXJh6G7tY2ggUG9sb75layc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnWm3sbmEgRGVmaW5pY2UnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ1T47WRhJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdVa+F6YXQgVmVyemUnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1Nrcv10IFZlcnplJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICdQb3NsZWRu7SB6bexuYSBvZCc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnUG9zbGVkbu0gem3sbmEnOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfSA9ICdabexuYSBkZWZpbmljZSBuZfpzcOy5buEhIFZpeiBTeXN06W1vdv0gTG9nIHBybyBwb2Ryb2Jub3N0aS4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gICAgICAgID0gJ0hsZWRhdCB0YWvpIHYgcPhlZGNob3rtY2ggdmVyeu1jaD8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1pvYnJhemVu6SBLb25maWcuIFBvbG++a3knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgICAgICAgID0gJ0Rvc3R1cG7pIEtvbmZpZy4gUG9sb75reSc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICAgICAgICAgPSAnVnlobGVkYXQgS29uZmlnLiBQb2xvvmt5JzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGF2IE5hc2F6ZW7tJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdBa3R14Wxu7SBTdGF2IE5hc2F6ZW7tJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGF2IEluY2lkZW50dSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgPSAnQWt0deFsbu0gU3RhdiBJbmNpZGVudHUnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJ0pt6W5vIHTpdG8gS29uZmlnLiBQb2xvvmt5JzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdTdGF2IE5hc2F6ZW7tIHTpdG8gS29uZmlnLiBQb2xvvmt5JzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICdTdGF2IEluY2lkZW50dSB06XRvIEtvbmZpZy4gUG9sb75reSc7CgogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Bvc2xlZG7tIHpt7G5hJzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaWthY2UnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb3BhZG51dOknOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05lYWt0aXZu7Sc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2mRyvmJhJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfY7WTtY+0nOwogICAgJExhbmctPnsnUGxhbm5lZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hcGzhbm924W5vJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWvobu0nOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09wcmF2YS9PYm5vdmVu7Sc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWltbyBwcm92b3onOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1D4ZWhsZWQnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvS29udHJvbGEga3ZhbGl0eSc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmHobu0nOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50JzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdG9sbu0nOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vYmlsbu0nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ppbuknOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbic7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICda4WxvaG924WPtIFph+O16ZW7tJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWFtZXInOwogICAgJExhbmctPnsnQ2FtZXJhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbWVyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRG9rIFN0YW5pY2UnOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ts4XZlc25pY2UnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVtJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb25pdG9yJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNebknOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ppbuknOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BDTUNJQSBrYXJ0YSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGlza+FybmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JvdXRlcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2tlbmVyJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXpwZehub3N0bu0gWmH47Xplbu0nOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N3aXRjaCc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIFph+O16ZW7tJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQ+O1zdHVwb3b9IEJvZCBXTEFOJzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSmlu6Sc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkbWluaXN0cmHobu0gbuFzdHJvaic7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVb5pdmF0ZWxza+kgQXBsaWthY2UnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1W+aXZhdGVsc2v9IE9wZXJh6G7tIFN5c3TpbSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmVzdGF27G79JzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdPhlZG7tIPpyb3Zl8ic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSmlu6Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyb3bhIEFwbGlrYWNlJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXJvdv0gT3BlcmHobu0gU3lzdOltJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVvml2YXRlbHNr/SBO4XN0cm9qJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLb25rdXJlbuhu7SBVvml2YXRlbOknOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2UgVv12b2rh+GUnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BvZG5pa2924SBMaWNlbmNlICc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRnJlZXdhcmUnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvZnR3YXJlIHMgT3Rldvhlbv1tIEvzZGVtJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICduYSBVemVsJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICduYSBQcm9jZXNvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnbmEgU2VydmVyJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICduYSBVvml2YXRlbGUnOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0plZG5vZHVjaOEgTGljZW5jZSc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyGFzb3bsIG9tZXplbuEgTGljZW5jZSc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmVvbWV6ZW7hJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdmF6a2924SBMaWNlbmNlJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+lyaW926SDI7XNsbyc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmHobu0gU3lzdOltJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9jZXNvcic7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUkFNJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQZXZu/SBEaXNrJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXZu/SBEaXNrOjpLYXBhY2l0YSc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2FwYWNpdGEnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Ptu292/SBBZGFwdGVyJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICdT7btvdv0gQWRhcHRlcjo6SVAgeiBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICdT7btvdv0gQWRhcHRlcjo6SVAgYWRyZXNhJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCB6IERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIEFkcmVzYSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR3JhZmlja+EgS2FydGEnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ppbukgVnliYXZlbu0nOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgID0gJ0tvbmVjIHBsYXRub3N0aSB64XJ1a3knOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdHVtIEluc3RhbGFjZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+27b3bhIEFkcmVzYSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnU+27b3bhIEFkcmVzYTo6TWFza2EgUG9kc+107Cc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgICAgPSAnU+27b3bhIEFkcmVzYTo6R2F0ZXdheSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWFza2EgUG9kc+107Cc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR2F0ZXdheSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHJ1aCBsaWNlbmNlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBLbO3oJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBLbO3oOjpNbm++c3R27Sc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnTGljZW7obu0gS2zt6Do6S29uZWMgUGxhdG5vc3RpJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNbm++c3R27Sc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29uZWMgUGxhdG5vc3RpJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN6WRpdW0nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICAgID0gJ01heCBwb+hldCBqZWRu6SBQb2xvvmt5JzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWvhdG9yJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb24gMic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNhJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCdWRvdmEnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3BvZGxhvu0nOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIFD47XNsdbllbnN0du0nOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbmNlbOH4JzsKICAgICRMYW5nLT57J091dGxldCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGaWxp4WxrYSc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmFjayc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTe1zdG5vc3QnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ByYWNvdmm5dOwnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNQ29uZmlnSXRlbS5wbSAtIHByb3ZpZGVzIGRhIChEYW5pc2gpIGxhbmd1YWdlIHRyYW5zbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkYV9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMSAyMDEwLzA2LzI1IDA5OjAwOjI3IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW0nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJ0NvbmZpZyBJdGVtLW9tcuVkZSc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAnQ29uZmlnIEl0ZW0gc3R5cmluZyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnxm5kcmUgZGVmaW5pdGlvbic7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnS2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWaXMgdmVyc2lvbmVyJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdTa2p1bCB2ZXJzaW9uZXInOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ1NpZHN0IOZuZHJldCBhZic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnU2lkc3Qg5m5kcmV0JzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICfGbmRyaW5nIGFmIGRlZmluaXRpb24gZmVqbGVkZSEgU2UgU3lzdGVtIExvZyBmb3IgZGV0YWxqZXIuJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ1P4ZyBvZ3PlIGkgdGlkbGlnZXJlIHZlcnNpb25lcj8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnVmlzIENvbmZpZyBJdGVtcyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdUaWxn5m5nZWxpZ2UgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgID0gJ1P4ZyBDb25maWcgSXRlbSc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdEZXBsb3ltZW50IHRpbHN0YW5kJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ051duZyZW5kZSBkZXBsb3ltZW50IHN0YXR1cyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudCB0aWxzdGFuZCc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICdOdXbmcmVuZGUgSW5jaWRlbnQgdGlsc3RhbmQnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnTmF2bmV0IHDlIGRlbm5lIENvbmZpZyBJdGVtJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0RlcGxveW1lbnQgdGlsc3RhbmQgZm9yIGRlbm5lIENvbmZpZyBpdGVtJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnSW5jaWRlbnQgdGlsc3RhbmQgZm9yIGRlbm5lIENvbmZpZyBJdGVtJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2lkc3Qg5m5kcmV0JzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGlrZXInOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVZGz4YmV0JzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5ha3Rpdic7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZlZGxpZ2Vob2xkZWxzZSc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90JzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGxhbmxhZ3QnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWt0aW9uJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVwZXJhdGlvbic7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BlcnNpb25lcmV0JzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQW5tZWxkZWxzZSc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpb25lbCc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50JzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVza3RvcCc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhcHRvcCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FuZGV0JzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbic7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JhY2t1cCBlbmhlZCc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbWVyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RvY2tpbmcgU3RhdGlvbic7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rhc3RhdHVyJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb25pdG9yJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTXVzJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQW5kZXQnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga29ydCc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ByaW50ZXInOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSb3V0ZXInOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTa2FubmVyJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2lra2VyaGVkc2VuaGVkJzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3dpdGNoJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIGVuaGVkJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiBBY2Nlc3MgUG9pbnQnOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbmRldCc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkbWluIHbmcmt0+Gplcic7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0tsaWVudCBhcGxpa2F0aW9uJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2xpZW50IE9TJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWRkZWQnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNaWRkbGV3YXJlJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQW5kZXQnOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgYXBsaWthdGlvbic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlciBPUyc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JydWdlciB25nJrdPhqZXInOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTYW10aWRpZ2UgYnJ1Z2VyZSc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdVZHZpa2xlciBsaWNlbnMnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdFbnRlcnByaXNlIGxpY2Vucyc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQciBub2RlJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHIgcHJvY2Vzc29yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHIgc2VydmVyJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHIgYnJ1Z2VyJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW5rZWx0bGljZW5zJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGlkc2JlZ3LmbnNldCc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VuYmVncuZuc2V0JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lbiBMaWNlbnMnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcmllbnVtbWVyJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnT1MnOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDUFUnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSQU0nOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdIYXJkZGlzayc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ0hhcmRkaXNrOjpLYXBhY2l0ZXQnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYXBhY2l0ZXQnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGUUROJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmV0a29ydCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgID0gJ05ldGtvcnQ6OklQIHZpYSBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnTmV0a29ydDo6SVAgYWRyZXNzZSc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIHZpYSBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgYWRyZXNzZSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dyYWZpa2tvcnQnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBbmRldCB1ZHN0eXInOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICdVZGz4YnNkYXRvIGZvciBnYXJhbnRpJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5zdGFsbGF0aW9uc2RhdG8nOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR25nJrc2FkcmVzc2UnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICA9ICdOZXR25nJrc2FkcmVzc2U6OlN1Ym5ldCBtYXNrZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgID0gJ05ldHbmcmtzYWRyZXNzZTo6R2F0ZXdheSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N1Ym5ldCBtYXNrZSc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGV3YXknOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnN0eXBlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5zbvhnbGUnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdMaWNlbnNu+GdsZTo6TeZuZ2RlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAnTGljZW5zbvhnbGU6OlVkbPhic2RhdG8nOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN5m5nZGUnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdVZGz4YnNkYXRvJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaWUnOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICA9ICdNYXhpbXVtIGFudGFsIGFmIGV0IGVsZW1lbnQnOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWthdG9yJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbiAxJzsKICAgICRMYW5nLT57J1Bob25lIDInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbiAyJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0J5Z25pbmcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFdGFnZSc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIGZhY2lsaXRldCc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0tvbnRvcic7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0aWtrb250YWt0JzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmFjayc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1J1bSc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyYmVqZHNwbGFkcyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db25maWdJdGVtLnBtLHYgMS44IDIwMTAvMDIvMjQgMTM6MDQ6NTUgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW0nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJ0NvbmZpZyBJdGVtLUJlcmVpY2gnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0NvbmZpZyBJdGVtIFZlcndhbHR1bmcnOwogICAgJExhbmctPnsnQ2hhbmdlIERlZmluaXRpb24nfSAgICAgID0gJ0RlZmluaXRpb24g5G5kZXJuJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICdLbGFzc2UnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1ZlcnNpb25lbiBlaW5ibGVuZGVuJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWZXJzaW9uZW4gYXVzYmxlbmRlbic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAnWnVsZXR6dCBnZeRuZGVydCB2b24nOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1p1bGV0enQgZ2XkbmRlcnQnOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ8RuZGVybiBkZXIgRGVmaW5pdGlvbiBmZWhsZ2VzY2hsYWdlbiEgSW0gU3lzdGVtIExvZyBmaW5kZW4gU2llIHdlaXRlcmUgSW5mb3JtYXRpb25lbi4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQXVjaCBpbiBmcvxoZXJlbiBWZXJzaW9uZW4gc3VjaGVuPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICA9ICdDb25maWcgSXRlbXMgYW5nZXplaWd0JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtcyB2ZXJm/GdiYXInOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW0gU3VjaGUnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnVmVyd2VuZHVuZ3NzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnQWt0dWVsbGVyIFZlcndlbmR1bmdzc3RhdHVzJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgID0gJ1ZvcmZhbGxzc3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0FrdHVlbGxlciBWb3JmYWxsc3N0YXR1cyc7CiAgICAkTGFuZy0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICAgICA9ICdEZXIgTmFtZSBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0RlciBWZXJ3ZW5kdW5nc3N0YXR1cyBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRGVyIFZvcmZhbGxzc3RhdHVzIGRpZXNlcyBDb25maWcgSXRlbXMnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMZXR6dGUgxG5kZXJ1bmcnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaXppZXJlbic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FiZ2VsYXVmZW4nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmFrdGl2JzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW4gV2FydHVuZyc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90YmV0cmllYic7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dlcGxhbnQnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWt0aXYnOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbiBSZXBhcmF0dXInOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdd9lciBEaWVuc3QnOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVbnRlciBSZXZpZXcnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZXN0L1FTJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmF0aXYnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWb3JmYWxsJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVza3RvcCc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhcHRvcCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb24nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYWNrdXAgR2Vy5HQnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWFtZXInOwogICAgJExhbmctPnsnQ2FtZXJhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEb2NraW5nIFN0YXRpb24nOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUYXN0YXR1cic7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVtJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9uaXRvcic7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hdXMnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEgS2FydGUnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEcnVja2VyJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Nhbm5lcic7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NpY2hlcnRoZWl0c2dlcuR0JzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3dpdGNoJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIEdlcuR0JzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiBBY2Nlc3MgUG9pbnQnOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxrbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZG1pbiBUb29sJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ2xpZW50IEFud2VuZHVuZyc7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NsaWVudCBCZXRyaWVic3N5c3RlbSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmVkZGVkJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlciBBbndlbmR1bmcnOwogICAgJExhbmctPnsnU2VydmVyIE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgQmV0cmllYnNzeXN0ZW0nOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVc2VyIFRvb2wnOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHbGVpY2h6ZWl0aWdlIFVzZXInOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRW50d2lja2xlciBMaXplbnonOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdFbnRlcnByaXNlIExpemVueic7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gS25vdGVuJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvIFByb3plc3Nvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BybyBTZXJ2ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gQmVudXR6ZXInOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFaW56ZWxsaXplbnonOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdaZWl0bGljaCBiZWdyZW56dCc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VubGltaXRpZXJ0JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lbiBMaXplbnonOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Nlcmllbm51bW1lcic7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0JldHJpZWJzc3lzdGVtJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ1BVJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJiZWl0c3NwZWljaGVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRmVzdHBsYXR0ZSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ0Zlc3RwbGF0dGU6OkthcGF6aXTkdCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcGF6aXTkdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR6d2VyayBBZGFwdGVyJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgPSAnTmV0endlcmsgQWRhcHRlcjo6SVAg/GJlciBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnTmV0endlcmsgQWRhcHRlcjo6SVAgQWRkcmVzc2UnOwogICAgJExhbmctPnsnSVAgb3ZlciBESENQJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCD8YmVyIERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCBBZGRyZXNzZSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dyYWZpayBBZGFwdGVyJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2UgQXVzc3RhdHR1bmcnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICdHYXJhbnRpZSBBYmxhdWZkYXR1bSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luc3RhbGxhdGlvbnNkYXR1bSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ05ldHp3ZXJrIEFkZHJlc3NlJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6U3VibmV0IE1hc2snfSAgICAgICAgICAgPSAnTmV0endlcmsgQWRkcmVzc2U6OlN1Ym5ldHogTWFza2UnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICdOZXR6d2VyayBBZGRyZXNzZTo6R2F0ZXdheSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N1Ym5ldHogTWFza2UnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56dHlwJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56c2NobPxzc2VsJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56c2NobPxzc2VsOjpNZW5nZSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ0xpemVuenNjaGz8c3NlbDo6QWJsYXVmZGF0dW0nOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZW5nZSc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FibGF1ZmRhdHVtJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaXVtJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgPSAnTWF4aW1hbGUgQW56YWhsIGVpbmVzIEVsZW1lbnRzJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9CiAgICAgICAgPSAnTGVlcmUgRmVsZGVyIGJlbGFzc2VuIGRlbiBha3R1ZWxsZW4gV2VydCc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpa2F0b3InOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uIDInOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZHJlc3NlJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR2Vi5HVkZSc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YWdlJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVQgRWlucmljaHR1bmcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdC/HJvJzsKICAgICRMYW5nLT57J091dGxldCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQW5zY2hsdXNzZG9zZSc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSYXVtJzsKICAgICRMYW5nLT57J1dvcmtwbGFjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJiZWl0c3BsYXR6JzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6Q29uZmlnSXRlbUNyZWF0ZSd9ICAgICAgICAgICAgPSAnTmV1ZXMgQ29uZmlnSXRlbSAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6VmVyc2lvbkNyZWF0ZSd9ICAgICAgICAgICAgICAgPSAnTmV1ZSBWZXJzaW9uIGVyemV1Z3QgKElEPSVzKSc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkRlcGxveW1lbnRTdGF0ZVVwZGF0ZSd9ICAgICAgID0gJ1ZlcndlbmR1bmdzc3RhdHVzIGdl5G5kZXJ0IChuZXU9JXM7IGFsdD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpJbmNpZGVudFN0YXRlVXBkYXRlJ30gICAgICAgICA9ICdWb3JmYWxsc3N0YXR1cyBnZeRuZGVydCAobmV1PSVzOyBhbHQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6Q29uZmlnSXRlbURlbGV0ZSd9ICAgICAgICAgICAgPSAnQ29uZmlnSXRlbSAoSUQ9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6TGlua0FkZCd9ICAgICAgICAgICAgICAgICAgICAgPSAnTGluayBhdWYgJXMgKFR5cD0lcykgaGluenVnZWb8Z3QnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpMaW5rRGVsZXRlJ30gICAgICAgICAgICAgICAgICA9ICdMaW5rIGF1ZiAlcyAoVHlwPSVzKSBnZWz2c2NodCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkRlZmluaXRpb25VcGRhdGUnfSAgICAgICAgICAgID0gJ0RlZmluaXRpb24gZGVzIENvbmZpZ0l0ZW1zIGFrdHVhbGlzaWVydCAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6TmFtZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnTmFtZSBnZeRuZGVydCAobmV1PSVzOyBhbHQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6VmFsdWVVcGRhdGUnfSAgICAgICAgICAgICAgICAgPSAnQXR0cmlidXQgJXMgdm9uICIlcyIgYXVmICIlcyIgZ2XkbmRlcnQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWZXJzaW9uRGVsZXRlJ30gICAgICAgICAgICAgICA9ICdWZXJzaW9uICVzIGdlbPZzY2h0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBlbmdsaXNoIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBlbl9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA4LzMxIDE0OjM4OjAwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplbl9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpDb25maWdJdGVtQ3JlYXRlJ30gICAgICAgICAgICA9ICdOZXcgQ29uZmlnSXRlbSAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6VmVyc2lvbkNyZWF0ZSd9ICAgICAgICAgICAgICAgPSAnTmV3IHZlcnNpb24gKElEPSVzKSc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkRlcGxveW1lbnRTdGF0ZVVwZGF0ZSd9ICAgICAgID0gJ0RlcGxveW1lbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6SW5jaWRlbnRTdGF0ZVVwZGF0ZSd9ICAgICAgICAgPSAnSW5jaWRlbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6Q29uZmlnSXRlbURlbGV0ZSd9ICAgICAgICAgICAgPSAnQ29uZmlnSXRlbSAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpMaW5rQWRkJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaW5rIHRvICVzICh0eXBlPSVzKSBhZGRlZCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkxpbmtEZWxldGUnfSAgICAgICAgICAgICAgICAgID0gJ0xpbmsgdG8gJXMgKHR5cGU9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpEZWZpbml0aW9uVXBkYXRlJ30gICAgICAgICAgICA9ICdDb25maWdJdGVtc1wnIGRlZmluaXRpb24gdXBkYXRlZCAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6TmFtZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnTmFtZSB1cGRhdGVkIChuZXc9JXM7IG9sZD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWYWx1ZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdBdHRyaWJ1dGUgJXMgdXBkYXRlZCBmcm9tICIlcyIgdG8gIiVzIic7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OlZlcnNpb25EZWxldGUnfSAgICAgICAgICAgICAgID0gJ1ZlcnNpb24gJXMgZGVsZXRlZCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0lUU01Db25maWdJdGVtLnBtLHYgMS42IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICdFbGVtZW50byBkZSBDb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdBcmVhIGRlIENvbmZpZ3VyYWNp824gZGUgRWxlbWVudG9zJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0afNuIGRlIEVsZW1lbnRvcyBkZSBDb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdNb2RpZmljYXIgRGVmaW5pY2nzbic7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc2UnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ01vc3RyYXIgVmVyc2lvbmVzJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdPY3VsdGFyIFZlcnNpb25lcyc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAnVWx0aW1hIG1vZGlmaWNhY2nzbiBwb3InOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYWNp824nOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ0FjdHVhbGl6YWNp824gZGUgZGVmaW5pY2lvbmVzIGZhbGxpZGEhIFJldmlzYXIgZWwgTG9nIGRlbCBTaXN0ZW1hIHBhcmEgY29uc3VsdGFyIGRldGFsbGVzJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ2J1c2NhciBlbiB2ZXJzaW9uZXMgYW50ZXJpb3Jlcz8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNp824gbW9zdHJhZG9zJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0VsZW1lbnRvcyBkZSBjb25maWd1cmFjafNuIGRpc3BvbmlibGVzJzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgID0gJ0J1c2NhciBlbGVtZW50b3MgZGUgY29uZmlndXJhY2nzbic7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdFc3RhZG8gZGUgaW1wbGVtZW50YWNp824nOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnRXN0YWRvIGFjdHVhbCBkZSBpbXBsZW1lbnRhY2nzbic7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdFc3RhZG8gZGVsIEluY2lkZW50ZSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICdFc3RhZG8gQWN0dWFsIGRlbCBJbmNpZGVudGUnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnRWwgbm9tYnJlIGRlIGVzdGUgZWxlbWVudG8gZGUgY29uZmlndXJhY2nzbic7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdFbCBlc3RhZG8gZGUgaW1wbGVtZW50YWNp824gZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdFbCBlc3RhZG8gZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgPSAnVWx0aW1hIG1vZGlmaWNhY2nzbic7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpY2Fkbyc7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGlyYWRvJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnSW5hY3Rpdm8nOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICA9ICdNYW50ZW5pbWllbnRvJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGlsb3RvJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGxhbmlmaWNhZG8nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWNjafNuJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVwYXJhY2nzbic7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1JldGlyYWRvJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmV2aXNhZG8nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQcnVlYmFzJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlcmFjaW9uYWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudGUnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YXRpbCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ090cm8nOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZ2VuZGEgUGVyc29uYWwnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWzpZm9ubyc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZpZG9yJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gZGUgQ29waWFzJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmlkZW8gQmVhbSc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0PhbWFyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RlY2xhZG8nOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdHJvJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgPSAnVGFyamV0YSBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXByZXNvcmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdFbnJ1dGFkb3InOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdFc2NhbmVyJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gZGUgc2VndXJpZGFkJzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gVVNCJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3Rybyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgID0gJ0hlcnJhbWllbnRhIGRlIEFkbWluaXN0cmFkb3InOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICA9ICdBcGxpY2FjafNuIENsaWVudGUnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICA9ICdTTyBDbGllbnRlJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWJpZG8nOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdHJvJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgPSAnQXBsaWNhY2nzbiBTZXJ2aWRvcic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgID0gJ1NPIFNlcnZpZG9yJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgPSAnSGVycmFtaWVudGEgZGUgVXN1YXJpbyc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1VzdWFyaW9zIGNvbmN1cnJlbnRlcyc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9zdHJhY2nzbic7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgID0gJ0xpY2VuY2lhIGRlIERlc2Fycm9sbGFkb3InOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICA9ICdMaWNlbmNpYSBDb3Jwb3JhdGl2YSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BvciBOb2RvJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgPSAnUG9yIFByb2Nlc2Fkb3InOwogICAgJExhbmctPnsnUGVyIFNlcnZlcid9ICAgICAgICAgICAgICAgICAgICA9ICdQb3IgU2Vydmlkb3InOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICA9ICdQb3IgVXN1YXJpbyc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ1RpZW1wbyByZXN0cmluZ2lkYSc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ0lsaW1pdGFkYSc7CiAgICAkTGFuZy0+eydWb2x1bWUgTGljZW5jZSd9ICAgICAgICAgICAgICAgID0gJ0xpY2VuY2lhIHBvciBWb2x1bWVuJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWxvJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTnVtZXJvIFNlcmlhbCc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgID0gJ1Npc3RlbWEgT3BlcmF0aXZvJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgPSAnRGlzY28gRHVybyc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgID0gJ0Rpc2NvIER1cm86OkNhcGFjaWRhZCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NhcGFjaWRhZCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgID0gJ0FkYXB0YWRvciBkZSBSZWQnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGFwdGFkb3IgZGUgUmVkOjpJUCBTb2JyZSBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgPSAnQWRhcHRhZG9yIGRlIFJlZDo6RGlyZWNjafNuIElQJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgPSAnSVAgc29icmUgREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgID0gJ0RpcmVjY2nzbiBJUCc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgID0gJ1RhcmpldGEgR3LhZmljYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgID0gJ090cm8gZXF1aXBvJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgPSAnRmVjaGEgZGUgRXhwaXJhY2nzbiBkZSBsYSBHYXJhbnTtYSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0ZlY2hhIGRlIEluc3RhbGFjafNuJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgPSAnRGlyZWNjafNuIGRlIFJlZCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gID0gJ0RpcmVjY2nzbiBkZSBSZWQ6Ok1hc2NhcmEgZGUgU3VicmVkJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgPSAnRGlyZWNjafNuIGRlIFJlZDo6UHVlcnRhIGRlIGVubGFjZSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgID0gJ01hc2NhcmEgZGUgU3VicmVkJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUHVlcnRhIGRlIGVubGFjZSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgID0gJ1RpcG8gZGUgTGljZW5jaWEnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICA9ICdDbGF2ZSBkZSBMaWNlbmNpYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgID0gJ0NsYXZlIGRlIExpY2VuY2lhOjpDYW50aWRhZCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gID0gJ0NsYXZlIGRlIExpY2VuY2lhOjpGZWNoYSBkZSBFeHBpcmFjafNuJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAnQ2FudGlkYWQnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICdGZWNoYSBkZSBFeHBpcmFjafNuJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaW8nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYXhpbW8gbnVtZXJvIGRlIHVuIGVsZW1lbnRvICc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpY2Fkb3InOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUmFjayd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgZmFfSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICfZhdit2K/ZiNiv2YcgQ0knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiBDSSc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAn2KrYutuM24zYsSDYqti52LHbjNmBJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICfaqdmE2KfYsyc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAn2YjbjNix2KfbjNi04oCM2YfYpyDYsdinINmG2YXYp9uM2LQg2KjYr9mHJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICfZiNuM2LHYp9uM2LTigIzZh9inINix2Kcg2YXYrtmB24wg2qnZhic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAn2KLYrtix24zZhiDYqti624zbjNixINio2Ycg2YjYs9uM2YTZhyc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAn2KLYrtix24zZhiDYqti624zbjNixJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICfYudmF2YTbjNin2Kog2KrYutuM24zYsSDYqti52LHbjNmBINmG2KfZhdmI2YHZgiDYqNmI2K8uINio2LHYp9uMINqp2LPYqCDYp9i32YTYp9i5INio24zYtNiq2LEgbG9nINiz24zYs9iq2YUg2LHYpyDYqNio24zZhtuM2K8uJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ9iv2LEg2YjbjNix2KfbjNi04oCM2YfYp9uMINmC2KjZhNuMINmH2YUg2KzYs9iq2KzZiCDYp9mG2KzYp9mFINi02YjYr9ifJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0NJ2YfYp9uMINmG2YXYp9uM2LQg2K/Yp9iv2Ycg2LTYr9mHJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0NJ2YfYp9uMINiv2LEg2K/Ys9iq2LHYsyc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINmG2LXYqCDYr9ixINmF2K3ZhCc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICfZiNi22LnbjNiqINmB2LnZhNuMINmG2LXYqCc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINix2K7Yr9in2K8nOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgPSAn2YjYtti524zYqiDYrNin2LHbjCDYsdiu2K/Yp9ivJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ9mG2KfZhSDYp9uM2YYgQ0nZh9inJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ9mI2LbYuduM2Kog2YbYtdioINin24zZhiBDSSc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9mI2LbYuduM2Kog2LHYrtiv2KfYryDYp9uM2YYgQ0knOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYotiu2LHbjNmGINiq2LrbjNuM2LEnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYqtqp2KvbjNixJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXZhtmC2LbbjCDYtNiv2YcnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LEg2YHYudin2YQnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZvti02KrbjNio2KfZhtuMINmIINmG2q/Zh9iv2KfYsduMJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbZhdmI2YbZhyDYotiy2YXYp9uM2LTbjCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2LHZhtin2YXZhyDYsduM2LLbjCDYtNiv2YcnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9ixINit2KfZhCDYqtmI2YTbjNivJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYudmF24zYsSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2KfYstmG2LTYs9iq2Ycg2LTYr9mHJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjYp9iy2KjbjNmG24wnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYqtiz2Kov2KrYttmF24zZhiDaqduM2YHbjNiqJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LnZhdmE24zYp9iq24wnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYsdiu2K/Yp9ivJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LHZiNmF24zYstuMJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2qnbjNmB24wnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LHZhyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2YTZgdmGJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPYsdmI2LEnOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZiNiz2KfbjNmEINm+2LTYqtuM2KjYp9mG4oCM2q/bjNix24wnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZvtix2KrZiCDYp9mB2qnZhic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iv2YjYsdio24zZhic7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in24zYs9iq2q/Yp9mHINin2KrYtdin2YQnOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYtdmB2K3ZhyDaqdmE24zYryc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2YjYr9mFJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LXZgdit2Ycg2YbZhdin24zYtCc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2KfZiNizJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LrbjNix2YcnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfaqdin2LHYqiBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfahtin2b7ar9ixJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYs9uM2LHbjNin2KgnOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9iz2qnZhtixJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YjYs9in24zZhCDYp9mF2YbbjNiq24wnOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYs9mI24zahic7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2KzZh9uM2LLYp9iqIFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ9mG2YLYp9i3INiv2LPYqtix2LPbjCBXTEFOJzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LrbjNix2YcnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxjbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9io2LLYp9ixINmF2K/bjNix24zYqtuMJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2KjYsdmG2KfZhdmH4oCM2YfYp9uMINqp2YTYp9uM2YbYqic7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iz24zYs9iq2YUg2LnYp9mF2YQg2qnZhNin24zZhtiqJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2K/Yp9iu2YTbjCc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF24zYp9mGINin2YHYstin2LEnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LHZhyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ9mG2LHZhSDYp9mB2LLYp9ixINiz2LHZiNixJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPbjNiz2KrZhSDYudin2YXZhCDYs9ix2YjYsSc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in2KjYstin2LEg2qnYp9ix2KjYsSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2KfYsdio2LHYp9mGINmF2YjYp9iy24wnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhtiz2K7ZhyDZhtmF2KfbjNi024wnOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2KrZiNiz2LnZhyDYr9mH2YbYr9mHJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAn2KfYrNin2LLZh+KAjNmG2KfZhdmHINiz2KfYstmF2KfZhtuMJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbYsdmFINin2YHYstin2LEg2YXYrNin2YbbjCc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2K8g2KjYp9iyJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDaqdin2YXZvtuM2YjYqtixJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDZvtix2K/Yp9iy2LTar9ixJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDYs9ix2YjYsSc7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2Ycg2KfYstin24wg2qnYp9ix2KjYsSc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in2KzYp9iy2YfigIzZhtin2YXZhyDYqtqp24wnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9in2LHYp9uMINmF2K3Yr9mI2K/ZhyDYstmF2KfZhtuMJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbYp9mF2K3Yr9mI2K8nOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2K3YrNmF24wnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhdiv2YQnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYtNmF2KfYsdmHINiz2LHbjNin2YQnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfYs9uM2LPYqtmFINi52KfZhdmEJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPbjOKAjNm+24zigIzbjNmIJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LHZhSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mH2KfYsdivINiv24zYs9qpJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAn2YfYp9ix2K8g2K/bjNiz2qk6Oti42LHZgduM2KonOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYuNix2YHbjNiqJzsKICAgICRMYW5nLT57J0ZRRE4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRlFETic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2KfYsdiqINi02KjaqdmHJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgPSAn2qnYp9ix2Kog2LTYqNqp2Yc6OklQINin2LIg2LfYsduM2YIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgID0gJ9qp2KfYsdiqINi02KjaqdmHOjrYotiv2LHYsyBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQINin2LIg2LfYsduM2YIgREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9ii2K/YsdizIElQJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2qnYp9ix2Kog2q/Ysdin2YHbjNqpJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYrNmH24zYstin2Kog2YXYqtmB2LHZgtmHJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYp9mG2YLYttin24wg2LbZhdin2YbYquKAjNmG2KfZhdmHJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDZhti12KgnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfYotiv2LHYsyDYtNio2qnZhyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ9ii2K/YsdizINi02KjaqdmHOjpTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgID0gJ9ii2K/YsdizINi02KjaqdmHOjpHYXRld2F5JzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3VibmV0IE1hc2snOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbZiNi5INin2KzYp9iy2YfigIzZhtin2YXZhyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhzo62KrYudiv2KfYryc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhzo62KrYp9ix24zYriDYp9mG2YLYttinJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYudiv2KfYryc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2KfYsduM2K4g2KfZhtmC2LbYpyc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9ix2LPYp9mG2YcnOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICA9ICfYrdiv2Kfaqdir2LEg2LTZhdin2LHZhyDbjNqpINi52YbYtdixJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYudix2YEnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhti02KfZhtuMJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPYp9iu2KrZhdin2YYnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYt9io2YLZhyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2LPZh9uM2YTYp9iqIElUJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KfYr9in2LHZhyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9m+2LHbjNiyJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YLZgdiz2YcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9iq2KfZgic7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2K3ZhCDaqdin2LEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjQxOjA2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnRWzpbWVudCBkZSBjb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdab25lIGRlcyBFbOltZW50cyBkZSBDb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGRlcyBFbOltZW50cyBkZSBDb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdE6WZpbml0aW9uIGR1IENoYW5nZW1lbnQnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ0NsYXNzZSc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnTW9udHJlciBsZXMgVmVyc2lvbnMnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ0NhY2hlciBsZXMgVmVyc2lvbnMnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ0Rlcm5p6HJlIG1vZGlmaWNhdGlvbiBlZmZlY3R16WUgcGFyJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICdEZXJuaehyZSBtb2RpZmljYXRpb24nOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ01vZGlmaWNhdGlvbiBkZSBsYSBk6WZpbml0aW9uIOljaG916WUhIFJlZ2FyZGV6IGxlcyBMb2cgU3lzdOhtZXMgcG91ciBwbHVzIGRlIGTpdGFpbHMuJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0NoZXJjaGVyIOlnYWxlbWVudCBkYW5zIGxlcyB2ZXJzaW9ucyBwculj6WRlbnRlcz8/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0Vs6W1lbnRzIGRlIGNvbmZpZ3VyYXRpb24gbW9udHLpcyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdFbOltZW50cyBkZSBjb25maWd1cmF0aW9uIGRpc3BvbmlibGVzJzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgID0gJ0NoZXJjaGVyIGRhbnMgbGVzIOls6W1lbnRzIGRlIGNvbmZpZ3VyYXRpb24nOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnRXRhdCBkZSBk6XBsb2llbWVudCc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICdFdGF0IGFjdHVlbCBkZSBk6XBsb2llbWVudCc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdFdGF0IGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0V0YXQgYWN0dWVsIGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0xlIG5vbSBkZSBjZXQg6WzpbWVudCBkZSBjb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0xcJ+l0YXQgZGUgZOlwbG9pZW1lbnQgZGUgY2V0IOls6W1lbnQgZGUgY29uZmlndXJhdGlvbic7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0xcJ+l0YXQgZFwnaW5jaWRlbnQgZGUgY2V0IOls6W1lbnQgZGUgY29uZmlndXJhdGlvbic7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlcm5p6HJlIG1vZGlmaWNhdGlvbic7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpcXVlcic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGly6Sc7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luYWN0aWYnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNYWludGVuYW5jZSc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90ZSc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BsYW5pZmnpJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZHVjdGlvbic7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VuIHLpcGFyYXRpb24nOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXRpcuknOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXZ1ZSc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcOlyYXRpb25uZWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudCc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09yZGluYXRldXInOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YWJsZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1dHJlJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVOls6XBob25lJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmV1cic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VsZW1lbnQgZGUgc2F1dmVnYXJkZSc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1LpdHJvcHJvamVjdGV1cic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhbelyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Jhc2UgcG91ciBQb3J0YWJsZSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NsYXZpZXInOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0ZXVyJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU291cmlzJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXV0cmUnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYXJ0ZSBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXByaW1hbnRlJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGV1cic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYW5uZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQ6XJpcGjpcmlxdWUgZGUgc+ljdXJpdOknOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTd2l0Y2gnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQ6XJpcGjpcmlxdWUgVVNCJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgPSAnUG9pbnQgZFwnYWNjZXNzIFdMQU4nOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdXRyZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dGlsIGRcJ0FkbWluaXN0cmF0aW9uJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQXBwbGljYXRpb24gQ2xpZW50ZSc7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09TIENsaWVudCc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmFycXXpJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1dHJlJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQXBwbGljYXRpb24gU2VydmV1cic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09TIFNlcnZlcic7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dGlsIFV0aWxpc2F0ZXVyJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVXRpbGlzYXRldXJzIGNvbmN1cnJlbnRzJzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVtbyc7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2Vuc2UgROl2ZWxvcHBldXInOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIEVudHJlcHJpc2UnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcmVld2FyZS9HcmF0aWNpZWwnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVuIFNvdXJjZSc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhciBub2V1ZCc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhciBwcm9jZXNzZXVyJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFyIFNlcnZldXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXIgVXRpbGlzYXRldXInOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIHVuaXF1ZSc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpbWl06WUgZGFucyBsZSB0ZW1wcyc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lsbGltaXTpJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5zZSBwYXIgdm9sdW1lJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9k6GxlJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTnVt6XJvIGRlIHPpcmllJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnU3lzdOhtZSBkXCdleHBsb2l0YXRpb24nOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDUFUnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSQU0nOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEaXNxdWUgZHVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAnRGlzcXVlIGR1cjo6Q2FwYWNpdOknOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYXBhY2l06Sc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBZGFwdGF0ZXVyIHLpc2VhdSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgID0gJ0FkYXB0YXRldXIgculzZWF1OjpJUCBzdXIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgID0gJ0FkYXB0YXRldXIgculzZWF1OjogQWRyZXNzZSBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIHN1ciBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBJUCc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkYXB0YXRldXIgZ3JhcGhpcXVlJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXV0cmUg6XF1aXBlbWVudCc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0RhdGUgZFwnZXhwaXJhdGlvbiBkZSBsYSBnYXJhbnRpZSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGUgZFwnaW5zdGFsbGF0aW9uJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBy6XNlYXUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICA9ICdBZHJlc3NlIHLpc2VhdTo6TWFzcXVlIGR1IHNvdXMgculzZWF1JzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBy6XNlYXU6OlBhc3NlcmVsbGUnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNYXNxdWUgZHUgc291cyBy6XNlYXUnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXNzZXJlbGxlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHlwZSBkZSBsaWNlbnNlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2zpIGRlIGxhIGxpY2Vuc2UnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdDbOkgZGUgbGEgbGljZW5zZTo6UXVhbnRpdOknOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICA9ICdDbOkgZGUgbGEgbGljZW5zZTo6RGF0ZSBkXCdleHBpcmF0aW9uJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUXVhbnRpdOknOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEYXRlIGRcJ2V4cGlyYXRpb24nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWRpYSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ1F1YW50aXTpIG1heGltYWxlIHBvdXIgdW4g6WzpbWVudCc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpYW50JzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVOls6XBob25lIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdU6WzpcGhvbmUgMic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkcmVzc2UnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYXRpbWVudCc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YWdlJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnROlwYXJ0ZW1lbnQgSVQnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCdXJlYXUnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcmlzZSc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaehjZSc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtcGxhY2VtZW50JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA3LzIwIDEzOjExOjE4IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnRWxlbWVudG8gZGkgQ29uZmlndXJhemlvbmUnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJ0FyZWEgZGkgQ29uZmlndXJhemlvbmUgZGVnbGkgRWxlbWVudGknOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb25lIGRlZ2xpIEVsZW1lbnRpIGRpIENvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdNb2RpZmljYSBEZWZpbml6aW9uZSc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdNb3N0cmEgVmVyc2lvbmknOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ05hc2NvbmRpIFZlcnNpb25pJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICdVbHRpbWEgbW9kaWZpY2EgZGknOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYSc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9ID0gJ0FnZ2lvcm5hbWVudG8gZGVsbGUgZGVmaW5pemlvbmkgZmFsbGl0YSEgR3VhcmRhIG5lbCBMb2cgZGVsIFNpc3RlbWEgcGVyIGRldHRhZ2xpJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0NlcmNhcmUgYW5jaGUgaW4gdmVyc2lvbmkgcHJlY2VkZW50aT8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUgbW9zdHJhdGknOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgPSAnRWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUgZGlzcG9uaWJpbGknOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgPSAnUmljZXJjYSBlbGVtZW50aSBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdTdGF0byBkaSBpbXBsZW1lbnRhemlvbmUnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnU3RhdG8gYXR0dWFsZSBkaSBpbXBsZW1lbnRhemlvbmUnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnU3RhdG8gZGVsbFwnSW5jaWRlbnRlJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ1N0YXRvIGF0dHVhbGUgZGVsbFwnSW5jaWRlbnRlJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0lsIG5vbWUgZGkgcXVlc3RvIGVsZW1lbnRvIGRpIGNvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdMbyBzdGF0byBkaSBpbXBsZW1lbnRhemlvbmUgZGkgcXVlc3RvIGVsZW1lbnRvIGRpIGNvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnTG8gc3RhdG8gZGkgaW5jaWRlbnRlIGRpIHF1ZXN0byBlbGVtZW50byBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYSc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpY2F0byc7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYWR1dG8nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmF0dGl2byc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgID0gJ01hbnV0ZW56aW9uZSc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90JzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGlhbmlmaWNhdG8nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdXppb25lJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmlwYXJhemlvbmUnOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdSaXRpcmF0byc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JldmlzaW9uYXRvJzsKICAgICRMYW5nLT57J1Rlc3QvUUEnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVzdCc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgID0gJ09wZXJhdGl2byc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50ZSc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YXRpbGUnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRybyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhbG1hcmUnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9ubyc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgID0gJ0Rpc3Bvc2l0aXZvIGRpIENvcGlhJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmlkZW8gQmVhbSc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZpZGVvY2FtZXJhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgPSAnRG9ja2luZyBTdGF0aW9uJzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGFzdGllcmEnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb3VzZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgPSAnU2NoZWRhIFBDTUNJQSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YW1wYW50ZSc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JvdXRlcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYW5uZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl2byBkaSBzaWN1cmV6emEnOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTd2l0Y2gnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl2byBVU0InOwogICAgJExhbmctPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSAgICAgICAgICAgICA9ICdXTEFOIEFjY2VzcyBQb2ludCc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgPSAnU3RydW1lbnRpIGRpIEFtbWluaXN0cmF6aW9uZSc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwcGxpY2F6aW9uZSBDbGllbnRlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgPSAnU08gQ2xpZW50ZSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmVkZGVkJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgPSAnQXBsaWNhemlvbmUgU2VydmVyJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgPSAnU08gU2VydmVyJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgPSAnU3RydW1lbnRpIFV0ZW50ZSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1V0ZW50aSBjb25jb3JyZW50aSc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RpbW9zdHJhdGl2byc7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgID0gJ0xpY2VuemEgZGkgU3ZpbHVwcG8nOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICA9ICdMaWNlbnphIEF6aWVuZGFsZSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgTm9kbyc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgID0gJ1BlciBQcm9jZXNzb3JlJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgPSAnUGVyIFNlcnZlcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBVdGVudGUnOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdTaW5nbGUgTGljZW5jZSc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ0xpbWl0YXRhIG5lbCB0ZW1wbyc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ0lsbGltaXRhdGEnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdMaWNlbnphIHBlciBWb2x1bWUnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbGxvJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTnVtZXJvIFNlcmlhbGUnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICA9ICdTaXN0ZW1hIE9wZXJhdGl2byc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NQVSc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhbSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc2NvIFJpZ2lkbyc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgID0gJ0Rpc2NvIFJpZ2lkbzo6Q2FwYWNpdOAnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICA9ICdDYXBhY2l04Cc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGF0dGF0b3JlIGRpIFJldGUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGF0dGF0b3JlIGRpIFJldGU6OklQIHN1IERIQ1AnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICA9ICdBZGF0dGF0b3JlIGRpIFJldGU6OkluZGlyaXp6byBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgID0gJ0lQIHN1IERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICA9ICdJbmRpcml6em8gSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdTY2hlZGEgR3JhZmljYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgID0gJ0FsdHJlIEFwcGFyZWNjaGlhdHVyZSc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgID0gJ0RhdGEgZGkgc2NhZGVuemEgZGVsbGEgZ2FyYW56aWEnOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIGluc3RhbGxhemlvbmUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICA9ICdJbmRpcml6em8gZGkgUmV0ZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gID0gJ0luZGlyaXp6byBkaSBSZXRlOjpTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgID0gJ0luZGlyaXp6byBkaSBSZXRlOjpHYXRld2F5JzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgPSAnU3VibmV0IE1hc2snOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgPSAnVGlwbyBkaSBMaWNlbnphJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgPSAnQ2hpYXZlIGRlbGxhIExpY2VuemEnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICA9ICdDaGlhdmUgZGVsbGEgTGljZW56YTo6UXVhbnRpdOAnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICA9ICdDaGlhdmUgZGVsbGEgTGljZW56YTo6RGF0YSBkaSBzY2FkZW56YSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1F1YW50aXTgJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAnRGF0YSBkaSBzY2FkZW56YSc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N1cHBvcnRvJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTnVtZXJvIG1hc3NpbW8gZGkgdW4gZWxlbWVudG8nOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWNhdGl2byc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjEgMjAwOS8wNy8yMCAxMzo1ODo0OSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0NvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdDb25maWd1cmF0aWUtaXRlbS1nZWJpZWQnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0NvbmZpZ3VyYXRpZS1pdGVtIGJlaGVlcic7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnRGVmaW5pdGllIHZlcmFuZGVyZW4nOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ0tsYXNzZSc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnVG9vbiB2ZXJzaWVzJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWZXJiZXJnIHZlcnNpZXMnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ0xhYXN0ZSB3aWp6aWdpbmcgZG9vcic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnTGFhc3RlIHdpanppZ2luZyc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnRGVmaW5pdGlld2lqemlnaW5nIG1pc2x1a3QhIFppZSBkZSBTeXN0ZW0gTG9nIHZvb3IgZGV0YWlscy4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnT29rIGluIGVlcmRlcmUgdmVyc2llcyB6b2VrZW4/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0dldG9vbmRlIGNvbmZpZ3VyYXRpZS1pdGVtcyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdCZXNjaGlrYmFyZSBjb25maWd1cmF0aWUtaXRlbXMnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnU3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ0FjdHVlbGUgc3RhdHVzJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50c3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0FjdHVlbGUgaW5jaWRlbnRzdGF0dXMnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnRGUgbmFhbSB2YW4gZGl0IGNvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0RlIHN0YXR1cyB2YW4gZGl0IGNvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRGUgaW5jaWRlbnRzdGF0dXMgdmFuIGRpdCBjb25maWd1cmF0aWUtaXRlbSc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhYXRzdGUgd2lqemlnaW5nJzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGljZXJlbic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZlcmxvcGVuJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5hY3RpZWYnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbiBvbmRlcmhvdWQnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dlcGxhbm5lZCc7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2R1a3RpZSc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luIHJlcGFyYXRpZSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VpdGdlZmFzZWVyZCc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Jldmlldyc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpb25lZWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudCc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMYXB0b3AnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdmVyaWdlJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvb24nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYWNrdXBhcHBhcmFhdCc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhbWVyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RvY2tpbmcgc3RhdGlvbic7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RvZXRzZW5ib3JkJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb25pdG9yJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTXVpcyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ092ZXJpZ2UnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga2FhcnQnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcmludGVyJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Nhbm5lcic7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlY3VyaXR5IGRldmljZSc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N3aXRjaCc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VTQiBhcHBhcmFhdCc7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4gQWNjZXNzIFBvaW50JzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkbWluIFRvb2wnOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDbGllbnR0b2VwYXNzaW5nJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2xpZW50IGJlc3R1cmluZ3NzeXN0ZWVtJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWRkZWQnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNaWRkbGV3YXJlJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcnRvZXBhc3NpbmcnOwogICAgJExhbmctPnsnU2VydmVyIE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgYmVzdHVyaW5nc3N5c3RlZW0nOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVc2VyIFRvb2wnOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHZWxpamt0aWpkaWdlIGdlYnJ1aWtlcnMnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnT250d2lra2VsYWFyc2xpY2VudGllJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRW50ZXJwcmlzZWxpY2VudGllJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRnJlZXdhcmUnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVuIFNvdXJjZSc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBub2RlJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGVyIENQVSc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBzZXJ2ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgZ2VicnVpa2VyJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2luZ2xlIExpY2VuY2UnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdUaW1lIHJlc3RyaWN0ZWQnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPbmdlbGltaXRlZXJkJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lIExpY2VudGllJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJpZW51bW1lcic7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0Jlc3R1cmluZ3NzeXN0ZWVtJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ1BVJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUkFNJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSGFyZGUgc2NoaWpmJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAnSGFyZGUgc2NoaWpmOjpDYXBhY2l0ZWl0JzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FwYWNpdGVpdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR3ZXJrIGFkYXB0ZXInOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICdOZXR3ZXJrIGFkYXB0ZXI6OklQIHZpYSBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnTmV0d2VyayBhZGFwdGVyOjpJUCBhZHJlcyc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIHZpYSBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgYWRyZXMnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWaWRlb2thYXJ0JzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSB1aXRydXN0aW5nJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAnRWluZGRhdHVtIGdhcmFudGllJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5zdGFsbGF0aWVkYXR1bSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ05ldHdlcmthZHJlcyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ05ldHdlcmthZHJlczo6U3VibmV0IE1hc2snOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICdOZXR3ZXJrYWRyZXM6OkdhdGV3YXknOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGV3YXknOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXR5cGUnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXNsZXV0ZWwnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXNsZXV0ZWw6OkhvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAnTGljZW50aWVzbGV1dGVsOjpFeHBpcmF0aWVkYXR1bSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0hvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXhwaXJhdGllZGF0dW0nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWRpYSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ01heGltYWxlIGhvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSWRlbnRpZmljYXRpZSc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb29uIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9vbiAyJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXMnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHZWJvdXcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFdGFnZSc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcnJ1aW10ZSc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbnRvb3InOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBYW5zbHVpdGluZyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcic7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dlcmtwbGVrJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0lUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnUG9rYb8gd2Vyc2plJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdVa3J5aiB3ZXJzamUnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ09zdGF0bmlvIHptaWVuaW9uZSBwcnpleic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnT3N0YXRuaW8gem1pZW5pb25lJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ICAgICAgICA9ICdVd3pnbOpkbmnmIHBvcHJ6ZWRuaWUgd2Vyc2plPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3RhbiB3ZHJvv2VuaWEnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgID0gJ0FrdHVhbG55IHN0YW4gd2Ryb79lbmlhJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGFuIHpkYXJ6ZW5pYSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgPSAnQWt0dWFsbnkgc3RhbiB6ZGFyemVuaWEnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICcnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bmlhIHptaWFuYSc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGlrYXQnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1d5Z2Fzs28nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05pZWFrdHl3bnknOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFub3dhbnknOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2R1a2NqYSc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmFwcmF3YSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhcHRvcCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ3ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VyerFkemVuaWUgZG8gYmFja3VwdSc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NhbWVyYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YWNqYSBkb2t1arFjYSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2xhd2lhdHVyYSc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ015c3prYSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2FydGEgUENNQ0lBJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEcnVrYXJrYSc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTa2FuZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3dpdGNoJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVcnqxZHplbmllIFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWNjZXNzIFBvaW50JzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hcnrqZHppZSBhZG1pbmlzdHJhdG9yc2tpZSc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQXBsaWthY2phIGtsaWVuY2thJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTeXN0ZW0ga2xpZW5ja2knOwogICAgJExhbmctPnsnRW1iZWRkZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQXBsaWthY2phIHNlcndlcm93YSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3lzdGVtIHNlcndlcm93eSc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmFyeupkemllIHW/eXRrb3duaWthJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2phIGRldmVsb3BlcnNrYSc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcmVld2FyZSc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlbiBzb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHVyerFkemVuaWUnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHByb2Nlc29yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdOYSBzZXJ3ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHW/eXRrb3duaWthJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2plZHnxY3phIGxpY2VuY2phJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDemFzb3dvIG9ncmFuaWN6b25hJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXogbGltaXR1JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdaYmlvcmN6YSBsaWNlbmNqYSc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ051bWVyIHNlcnlqbnknOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N5c3RlbSBvcGVyYWN5am55JzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9jZXNvcic7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUkFNJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEeXNrIHR3YXJkeSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAnUG9qZW1ub7bmIGR5c2t1IHR3YXJkZWdvJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2plbW5vtuYnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hendhIEZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcnRhIHNpZWNpb3dhJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICdLYXJ0YSBzaWVjaW93YTo6QWRyZXMgSVAgeiBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICdLYXJ0YSBzaWVjaW93YTo6QWRyZXMgSVAnOwogICAgJExhbmctPnsnSVAgb3ZlciBESENQJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkcmVzIElQIHogREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXMgSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcnRhIGdyYWZpY3puYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG96b3N0YbNlIHd5cG9zYb9lbmllJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdEYXRhIHd5Z2G2bmnqY2lhIGd3YXJhbmNqaSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBpbnN0YWxhY2ppJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZHJlcyBzaWVjaW93eSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnQWRyZXMgc2llY2lvd3k6Ok1hc2thIHNpZWNpJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgICA9ICdBZHJlcyBzaWVjaW93eTo6QnJhbWEnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hc2thIHNpZWNpJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCcmFtYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHlwIGxpY2Vuc2ppJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLbHVjeiBsaWNlbmN5am55JzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdLbHVjeiBsaWNlbmN5am55OjpJbG+25ic7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnS2x1Y3ogbGljZW5jeWpueTo6RGF0YSB3eWdhtm5p6mNpYSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSWxvtuYnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGEgd3lnYbZuaepjaWEnOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05vtm5payc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBCcmF6aWxpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDEwIENyaXN0aWFubyBLb3JuZPZyZmVyLCBodHRwOi8vd3d3LmRvcmZlci5jb20uYnIvCiMgLS0KIyAkSWQ6IHB0X0JSX0lUU01Db25maWdJdGVtLnBtLHYgMS4xIDIwMTAvMDMvMDEgMDk6NDg6MjAgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICdJdGVtIGRlIENvbmZpZ3VyYefjbyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnSXRlbnMgZGUgQ29uZmlndXJh5+NvJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRlIEl0ZW5zIGRlIENvbmZpZ3VyYefjbyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnTXVkYXIgRGVmaW5p5+NvJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICdDbGFzc2UnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1Zpc3VhbGl6YXIgVmVyc/Vlcyc7CiAgICAkTGFuZy0+eydIaWRlIFZlcnNpb25zJ30gICAgICAgICAgPSAnT2N1bHRhciBWZXJz9WVzJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfabHRpbWEgbW9kaWZpY2Hn428gcG9yJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICfabHRpbWEgbW9kaWZpY2Hn428nOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ011ZGFu52EgZGEgZGVmaW5p5+NvIGZhbGhvdSEgQ29uc3VsdGUgbyBMb2cgZG8gU2lzdGVtYSBwYXJhIGRldGFsaGVzLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICdQcm9jdXJhciBuYXMgdmVy9WVzIGFudGVyaW9yZXMgdGFtYultPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICA9ICdJdGVucyBkZSBDb25maWd1cmHn428gdmlzdWFsaXphZG9zJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0l0ZW5zIGRlIENvbmZpZ3VyYefjbyBkaXNwb27tdmVpcyc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICdQZXNxdWlzYXIgSXRlbnMgZGUgQ29uZmlndXJh5+NvJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0VzdGFkbyBkYSBJbXBsYW50Yefjbyc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICdFc3RhZG8gZGEgSW1wbGFudGHn428gQXR1YWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnRXN0YWRvIGRvIEluY2lkZW50ZSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICdFc3RhZG8gZG8gSW5jaWRlbnRlIEF0dWFsJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ08gbm9tZSBkZXN0ZSBpdGVtIGRlIGNvbmZpZ3VyYefjbyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdPIGVzdGFkbyBkZSBpbXBsYW50YefjbyBkZXN0ZSBpdGVtIGRlIGNvbmZpZ3VyYefjbyc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ08gZXN0YWRvIGRlIGluY2lkZW50ZSBkZXN0ZSBpdGVtIGRlIGNvbmZpZ3VyYefjbyc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9psdGltYSBBbHRlcmHn428nOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaWNhcic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGlyYWRvJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5hdGl2byc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hbnV0ZW7n428nOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdG8nOwogICAgJExhbmctPnsnUGxhbm5lZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFuZWphZG8nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdefjbyc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcGFybyc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JldGlyYWRvJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmV2aXPjbyc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3RlIGRlIFF1YWxpZGFkZSc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09wZXJhY2lvbmFsJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5jaWRlbnRlJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3V0cm8nOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZpZG9yJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gZGUgQmFja3VwJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NhbWVyYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVjbGFkbyc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dHJvJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FydONvIFBDTUNJQSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcHJlc3NvcmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSb3RlYWRvcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc3Bvc2l0aXZvIGRlIFNlZ3VyYW7nYSc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc3Bvc2l0aXZvIFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JFREUnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdXRybyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZlcnJhbWVudGEgZGUgQWRtaW5pc3RyYefjbyc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0FwbGljYefjbyBDbGllbnRlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU08gQ2xpZW50ZSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dHJvJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQXBsaWNh5+NvIFNlcnZpZG9yJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU08gU2Vydmlkb3InOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGZXJyYW1lbnRhIGRvIFVzdeFyaW8nOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdVc3XhcmlvcyBDb25jb3JyZW50ZXMnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbudhIGRlIERlc2Vudm9sdmVkb3InOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbudhIENvcnBvcmF0aXZhJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9yIE7zJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9yIFByb2Nlc3NhZG9yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9yIFNlcnZpZG9yJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9yIFVzdeFyaW8nOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbudhINpuaWNhJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVtcG8gUmVzdHJpdG8nOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbGltaXRhZGEnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbudhIHBvciBWb2x1bWUnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbG8nOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdO+m1lcm8gZGUgU+lyaWUnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTaXN0ZW1hIE9wZXJhY2lvbmFsJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvY2Vzc2Fkb3InOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZW3zcmlhIFJBTSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc2NvIFLtZ2lkbyc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ0Rpc2NvIFLtZ2lkbzo6Q2FwYWNpZGFkZSc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhcGFjaWRhZGUnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBZGFwdGFkb3IgZGUgUmVkZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgID0gJ0FkYXB0YWRvciBkZSBSZWRlOjpESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnQWRhcHRhZG9yIGRlIFJlZGU6OkVuZGVyZedvIElQJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VuZGVyZedvIElQJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRhcHRhZG9yIEdy4WZpY28nOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdPdXRybyBFcXVpcGFtZW50byc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0RhdGEgZGUgRXhwaXJh5+NvIGRhIEdhcmFudGlhJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBJbnN0YWxh5+NvJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW5kZXJl528gZGUgUmVkZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ0VuZGVyZedvIGRlIFJlZGU6Ok3hc2NhcmEgZGUgU3VicmVkZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgID0gJ0VuZGVyZedvIGRlIFJlZGU6OlJvdGVhZG9yIFBhZHLjbyc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ03hc2NhcmEgZGUgU3VicmVkZSc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JvdGVhZG9yIFBhZHLjbyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RpcG8gZGUgTGljZW7nYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NoYXZlIGRlIExpY2Vu52EnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdDaGF2ZSBkZSBMaWNlbudhOjpRdWFudGlkYWRlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAnQ2hhdmUgZGUgTGljZW7nYTo6RGF0YSBkZSBFeHBpcmHn428nOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdRdWFudGlkYWRlJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBkZSBFeHBpcmHn428nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN7WRpYSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ076bWVybyBt4XhpbW8gZGUgdW0gZWxlbWVudG8nOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWNhZG9yJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbmUgMSc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb25lIDInOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFbmRlcmXnbyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1By6WRpbyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FuZGFyJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVwYXJ0YW1lbnRvIGRlIFRJJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXNjcml083Jpbyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RvbWFkYSc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NhbGEnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMb2NhbCBkZSBUcmFiYWxobyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0lUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICfO8e3u4u375SDx8OXk8fLi4Cc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnzuHn7vAg7vHt7uLt+/Ug8fDl5PHy4ic7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDu8e3u4u377Ogg8fDl5PHy4uDs6Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnyOfs5e3o8vwg7u/o8eDt6OUnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ8rr4PHxJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICfP7urg5+Dy/CDi5fDx6OgnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ9Hq8Pvy/CDi5fDx6OgnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ8Di8u7wIO/u8evl5O3l4+4g6Ofs5e3l7ej/JzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICfC8OXs/yDv7vHr5eTt5ePuIOjn7OXt5e3o/yc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnzeXi7ufs7ubt7iDo5+zl7ejy/CDu7+jx4O3o5SEgxOv/IO/u5PDu4e3u6SDo7fTu8Ozg9ujoIPHs7vLw6CBTeXN0ZW0gTG9nLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICfI8erg8vwg4iDv8OXk++Tz+ej1IOLl8PHo//U/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ8/u6uDn4O3uIO7x7e7i7fv1IPHw5eTx8uInOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgPSAnxO7x8vPv7e4g7vHt7uLt+/Ug8fDl5PHy4ic7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICfP7ujx6iDu8e3u4u379SDx8OXk8fLiJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ9Hu8fLu/+3o5SDo8e/u6/zn7uLg7ej/JzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ9Ll6vP55eUg8e7x8u7/7ejlIOjx7+7r/Ofu4uDt6P8nOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAn0e7x8u7/7ejlIOjt9ujk5e3y4Cc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICfS5erz+eXlIPHu8fLu/+3o5SDo7fbo5OXt8uAnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnyOz/IP3y7uPuIPP35fLt7uPuIP3r5ezl7fLgJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ9Hu8fLu/+3o5SDo8e/u6/zn7uLg7ej/IP3y7uPuIO7x7e7i7e7j7iDx8OXk8fLi4Cc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9Hy4PLz8Sc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Lw5ez/IO/u8evl5O3l4+4g6Ofs5e3l7ej/JzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0OXn5fDiJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0/Hy4PDl6+4nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN5eDq8uji7e4nOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5fXt6Pfl8eru5SDu4fHr8+bo4uDt6OUnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfd6vHv5fDo7OXt8ic7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8fg7+vg7ejw7uLg7e3uJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Du6Ofi7uTx8uLuJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0OXs7u3yJzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0e/o8eDt7ic7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ93q8e/l8PLo5+AnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5fHy6PDu4uDt6OUnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfCIP3q8e/r8+Dy4Pbo6Cc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jt9ujk5e3yJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzeDx8u7r/O376SDPyic7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83u8/Lh8+onOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5evl9O7tJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXw4uXwJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0/Hy8O7p8fLi7iDh/erg7+AnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP8O7l6vLu8Cc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8rg7OXw4Cc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tu6i3x8uDt9uj/JzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuvg4ujg8vPw4Cc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu5OXsJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7t6PLu8Cc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8z7+OrgJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+7lJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUENNQ0lBIOrg8PLgJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Do7fLl8Cc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zg8Pjw8/Lo5+Dy7vAnOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR6uDt5fAnOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR7ODw8i3q4PDy4Cc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8ru7Ozz8uDy7vAnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVU0Ig8/Hy8O7p8fLi7ic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4g8u736uAg5O7x8vPv4Cc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8uXi4P8g6uDw8uAnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0ejx8uXs7fvlIPPy6Ovo8vsnOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6u7lIO/w6Ovu5uXt6OUnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6uD/IM7RJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwvHy8O7l7e376Sc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7uzl5vPy7vft7uUgz84nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfR5fDi5fDt7uUg7/Do6+7m5e3o5Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8OLl8O3g/yDO0Sc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u6/zn7uLg8uXr/PHq6OUg8/Lo6+jy+yc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8ru7erz8OXt8uD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxOXs7i3i5fDx6P8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo/yDk6/8g8ODn8ODh7vL36OrgJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnyu7w7+7w4PLo4u3g/yDr6Pbl7efo/yc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Hl8e/r4PLt7uUgz84nOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfPziDxIO7y6vD78vvsIOru5O7sJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzeAg7e7k8yjz5+XrKSc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gINbP0yc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gIPHl8OLl8Cc7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gIO/u6/zn7uLg8uXr/yc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87k7e7q8ODy7eD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnzuPw4O3o9+Xt7eD/IO/uIOLw5ezl7egnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB5ecg7uPw4O3o9+Xt6OknOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7vDv7vDg8uji7eD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7k5ev8JzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXw6Ont++kg7e7s5fAnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfO7+Xw4Pbo7u3t4P8g8ejx8uXs4Cc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9bP0yc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87H0yc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8bl8fLq6Okg5Ojx6ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ8bl8fLq6Okg5Ojx6jo6zuH65ewnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfO4frl7Cc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fAnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fA6OklQIO/uIERIQ1AnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fA6OklQIODk8OXxJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAg7+4gREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIODk8OXxJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnwujk5e4g4OTg7/Ll8Cc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+Pu5SDu4e7w8+Tu4uDt6OUnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICfR8O7qIOjx8uX35e3o/yDj4PDg7fLo6Cc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tg8uAg8/Hy4O3u4uroJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXy5eLu6SDg5PDl8Sc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ9Hl8uXi7ukg4OTw5fE6Oszg8ergIO/u5PHl8ugnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICfR5fLl4u7pIODk8OXxOjrY6/7nJzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzODx6uAg7+7k8eXy6Cc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9jr/ucnOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS6O8g6+j25e3n6OgnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo7u3t++kg6uv+9yc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+ju7e376SDq6/73OjrK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAny+j25e3n6O7t7fvpIOrr/vc6OtHw7uog6+j25e3n6OgnOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn0fDu6iDr6Pbl7efo6Cc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zz6/zy6Ozl5Ojp7fvlIPHw5eTx8uLgJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgPSAnzODq8ejs4Ov87e7lIOru6+j35fHy4u4g7uTt7uPuIP3r5ezl7fLgJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyOTl7fLo9Ojq4PLu8Cc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBDaGluZXNlIHNpbXBsZSB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwOSBOZXZlciBNaW4gPG5ldmVyIGF0IHFub2ZhZS5vcmc+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiB6aF9DTl9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzEwLzE0IDIwOjQ3OjQyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnxeTWw8/uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICfF5NbDz+7H+NPyJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICe53MDtxeTWw8/uJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICfQ3rjEtqjS5Sc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnvLax8Cc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnz9TKvrDmsb4nOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ9L+stiw5rG+JzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfX7rrz0N64xNPaJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICfX7rrz0N64xCc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9ICAgICAgICA9ICfQ3rjEtqjS5cqnsNwhz+rPuNDFz6LH67LOv7zPtc2zyNXWvi4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnzazKscvRy/fS1MewtcSw5rG+Pyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICA9ICfP1Mq+xeTWw8/uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ9PQ0Ke1xMXk1sPP7ic7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICfL0cv3xeTWw8/uJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ7K/yvDXtMysJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ7Wxx7C1xLK/yvDXtMysJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgID0gJ8rCvP7XtMysJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ7Wxx7C1xMrCvP7XtMysJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ86q1eK49sXk1sPP7sP8w/snOwogICAgJExhbmctPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICA9ICfTptPD1eK49rK/yvDXtMystb3F5NbDz+4nOwogICAgJExhbmctPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICfTptPD1eK49srCvP7XtMystb3F5NbDz+4nOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfX7rrzuPy4xCc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7i01sYnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICe1vcbaJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnt8e77ravtcQnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfOrLukJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0v21vCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9LRuea7ric7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7L6yfonOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ3ri0JzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnu9jK1Sc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7i0yfMnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICey4srUL1FBJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnv8nTw7XEJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnysK8/ic7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8yoyr2158TUJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnscq8x7G+JzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxuTL/Cc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7Xnu7AnOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICe3/s7xxvcnOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICexuLfdyeixuCc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ82207DSxyc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9XVz+C7+ic7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ87r1b4nOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICe8/MXMJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAntfe94rX3xvcnOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP1Mq+xvcnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK87HqJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxuTL/Cc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BDTUNJQSC/qCc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7Ty06G7+ic7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8K308nG9yc7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8mow+jSxyc7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ7CyyKvJ6LG4JzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnvbu7u7v6JzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIMnosbgnOwogICAgJExhbmctPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOIM7ez9+3w87KteMnOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfG5Mv8JzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAntee7sLmry74nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfO3s/fzfjC5yc7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7ncwO3Usbmkvt8nOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICe/zbuntsvTptPDs8zQ8ic7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7/Nu6ey2df3z7XNsyc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8e2yOvKvSc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9bQvOS8/ic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8bky/wnOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICe3/s7xxvfTptPDs8zQ8ic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7f+zvHG97LZ1/fPtc2zJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn08O7p7mkvt8nOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICeyorei08O7p8r9JzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0d3Kvic7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ7+qt6LQ7b/JJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnxvPStda01dUnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfD4rfRyO28/ic7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7+q1LQnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfDv73ateMnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfDv7SmwO3G9yc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8O/t/7O8cb3JzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw7/Tw7unJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAntaXSu9Dtv8knOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfKsbzkz97Wxic7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87ez97WxrXEJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnxfrBv8rayKgnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQzbrFJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0PLB0LrFJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnstnX98+1zbMnOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDUFUnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE2rTmJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn07LFzCc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ9Oyxcw6Osjdwb8nOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfI3cG/JzsKICAgICRMYW5nLT57J0ZRRE4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRlFETic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ834v6gnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICfN+L+oOjq00yBESENQILvxyKEgSVAnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICAgICAgICAgICA9ICfN+L+oOjpJUCC12Na3JzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAntNMgREhDUCC78cihIElQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgtdjWtyc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8280M60psDtxvcnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICfG5Mv81KrL2Cc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ7Gj0N65/cbayNXG2ic7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7Cy17DI1cbaJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnzfjC57XY1rcnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICA9ICfN+MLntdjWtzo619PN+NHawusnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICfN+MLntdjWtzo6zfi52Cc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9fTzfjR2sLrJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzfi52Cc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Dtv8nA4LHwJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0O2/ycPc1L8nOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICfQ7b/Jw9zUvzo6yv3Bvyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ9Dtv8nD3NS/Ojq1vcbayrG85Cc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8r9wb8nOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICe5/cbayNXG2ic7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ73p1sonOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICA9ICe0y9Sqy9i1xNfutPPK/cG/JzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn08O7p7Hqyra3+yc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7Xnu7AgMSc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7Xnu7AgMic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7XY1rcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICe088/DJzsKICAgICRMYW5nLT57J0Zsb29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwqWy4yc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIMnoyqknOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICew7LmrytInOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICey5df5JzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnu/q83Cc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ7e/vOQnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICeztbzkJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhZG1pbiBmcm9udGVuZCB0byBtYW5hZ2UgY29uZmlnIGl0ZW1zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISRDbGFzc0xpc3Q7CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISV7JENsYXNzTGlzdH07CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWZpbml0aW9uIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uTGlzdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvbkxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkZWZpbml0aW9uIGxpc3QKICAgICAgICBteSAkRGVmaW5pdGlvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJERlZmluaXRpb24gKCByZXZlcnNlIEB7JERlZmluaXRpb25MaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZGVmaW5pdGlvbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvbkxpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiB2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVmaW5pdGlvblZpZXcnICkgewoKICAgICAgICAjIGdldCBkZWZpbml0aW9uIGlkCiAgICAgICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlZmluaXRpb25JRCcgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkRGVmaW5pdGlvbklEOwoKICAgICAgICAjIGdldCBkZWZpbml0aW9uCiAgICAgICAgbXkgJERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25JRCwKICAgICAgICApOwogICAgICAgICREZWZpbml0aW9uLT57RGVmaW5pdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICREZWZpbml0aW9uLT57RGVmaW5pdGlvbn0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZWZpbml0aW9uLT57Q2xhc3NJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvblZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uQ2hhbmdlJyApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgaWQKICAgICAgICBteSAkQ2xhc3NJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJENsYXNzSUQ7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlZmluaXRpb24KICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25DaGFuZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlZmluaXRpb24gc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlZmluaXRpb25TYXZlJyApIHsKICAgICAgICBteSAlRGVmaW5pdGlvbjsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KENsYXNzSUQgRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgJERlZmluaXRpb257JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KENsYXNzSUQgRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgaWYgKCAhJERlZmluaXRpb257JEZvcm1QYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkRm9ybVBhcmFtISIgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgdG8gZGF0YWJhc2UKICAgICAgICBteSAkRGVmaW5pdGlvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkFkZCgKICAgICAgICAgICAgJURlZmluaXRpb24sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKSBpZiAhJERlZmluaXRpb25JRDsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBjbGFzcyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgJENsYXNzTGlzdC0+eyRhfSBjbXAgJENsYXNzTGlzdC0+eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjcgMjAwOS8xMC8xMyAxNzozMToxMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYWdlCiAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BhZ2UnICkgfHwgMTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgb3V0cHV0IG1lbnUKICAgIG15ICVDbGFzc0NvdW50OwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgIENMQVNTSUQ6CiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgJHskQ2xhc3NMaXN0fXskYX0gY21wICR7JENsYXNzTGlzdH17JGJ9IH0ga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIHNob3cgbWVudSBsaW5rIG9ubHkgaWYgdXNlciBoYXMgYWNjZXNzIHJpZ2h0cwogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NJRCBpZiAhJEhhc0FjY2VzczsKCiAgICAgICAgIyBjb3VudCBhbGwgcmVjb3JkcyBvZiB0aGlzIGNsYXNzCiAgICAgICAgJENsYXNzQ291bnR7JENsYXNzSUR9ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUNvdW50KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbWVudSBpdGVtIHNwbGl0CiAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICBDb3VudCAgID0+ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgaWQKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICBteSAlU2VhcmNoUmVzdWx0ID0gKAogICAgICAgIFJlc3VsdCAgICAgICAgICAgPT4gMCwKICAgICAgICBDb25maWdJdGVtc0F2YWlsID0+IDAsCiAgICApOwoKICAgIGlmICgkQ2xhc3NJRCkgewoKICAgICAgICAjIGlmIHVzZXIgZG9lc24ndCBiZWxvbmcgdG8gdGhlIGdyb3VwIHRoYXQgYmVsb25ncyB0byB0aGlzIGNsYXNzLCBzaG93IGVycm9yIHBhZ2UKICAgICAgICBteSAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkSGFzQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIGFjY2VzcyB0byBDbGFzcyBpcyBnaXZlbiEnLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjbGFzcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSA9ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwOwoKICAgICAgICBteSAkU2VhcmNoU3RhcnQgPSAwOwogICAgICAgIGlmICggJFBhZ2UgJiYgJFBhZ2UgPiAxICkgewogICAgICAgICAgICAkU2VhcmNoU3RhcnQgPSAoICRQYWdlIC0gMSApICogMTAwOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gbGlzdAogICAgICAgIG15ICRDb25maWdJdGVtUmVzdWx0TGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1SZXN1bHRMaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBTdGFydCAgID0+ICRTZWFyY2hTdGFydCwKICAgICAgICAgICAgTGltaXQgICA9PiAxMDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc2VhcmNoIHJlc3VsdAogICAgICAgICRTZWFyY2hSZXN1bHR7UmVzdWx0fSA9IEB7JENvbmZpZ0l0ZW1SZXN1bHRMaXN0fTsKICAgICAgICAkU2VhcmNoUmVzdWx0e1BhZ2V9ICAgPSBpbnQoICRTZWFyY2hSZXN1bHR7Q29uZmlnSXRlbXNBdmFpbH0gLyAxMDAgKTsKICAgICAgICBpZiAoICggJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSAvIDEwMCApIC0gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlfSsrOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtICggQHskQ29uZmlnSXRlbVJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDbGFzc1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IHBhZ2UKICAgIGlmICggJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICBmb3IgbXkgJFBhZ2VDb3VudCAoIDEgLi4gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHBhZ2UgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTmFtZSA9ICRQYWdlQ291bnQgZXEgJFBhZ2UgPyAnUGFnZUJvbGQnIDogJ1BhZ2VOb3JtYWwnOwoKICAgICAgICAgICAgIyBvdXRwdXQgcGFnZSBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRUZW1wbGF0ZU5hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgIFBhZ2UgICAgPT4gJFBhZ2VDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlTnVsbH0gPSAwOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlICAgPT4gJ092ZXJ2aWV3JywKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZWFyY2hSZXN1bHQsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLnBtLHYgMS41IDIwMDkvMTAvMTMgMTc6MzE6MTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZWRpcmVjdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZDbGFzc0lEPSRDbGFzc0lEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICAgICAgZm9yIG15ICRDbGFzc0lEICgga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgICAgICBteSAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlICAgICA9PiAnZG9jdW1lbnQuY29uZmlnaXRlbWNsYXNzLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7JywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdBZGQnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtLHYgMS4xMCAyMDEwLzAzLzAyIDEyOjI0OjEwIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZ2l0ZW0gaWQgYW5kIGNsYXNzIGlkCiAgICBteSAkQ29uZmlnSXRlbSA9IHt9OwogICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApIHx8IDA7CiAgICAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9ICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApICAgICAgfHwgMDsKICAgIG15ICREdXBsaWNhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0R1cGxpY2F0ZUlEJyApIHx8IDA7CgogICAgbXkgJEhhc0FjY2VzczsKCiAgICAjIGdldCBuZWVkZWQgZGF0YQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gJiYgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJER1cGxpY2F0ZUlEKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIHRvIGR1cGxpY2F0ZQogICAgICAgICRDb25maWdJdGVtID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICREdXBsaWNhdGVJRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNvbmZpZyBpdGVtIGlkIGFuZCBudW1iZXIKICAgICAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAnTkVXJzsKICAgICAgICAkQ29uZmlnSXRlbS0+e051bWJlcn0gICAgICAgPSAnTkVXJzsKICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9ICdORVcnOwoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHVzZXIgaGFzIG5vIGFjY2VzcyByaWdodHMgc2hvdyBlcnJvciBwYWdlCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBhY2Nlc3MgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkZWZpbml0aW9uCiAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICAjIGFib3J0LCBpZiBubyBkZWZpbml0aW9uIGlzIGRlZmluZWQKICAgIGlmICggISRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gRGVmaW5pdGlvbiB3YXMgZGVmaW5lZCBmb3IgY2xhc3MgJENvbmZpZ0l0ZW0tPntDbGFzc30hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzdWJtaXQgc2F2ZQogICAgbXkgJFN1Ym1pdFNhdmUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXRTYXZlJyApOwoKICAgICMgZ2V0IHhtbCBkYXRhCiAgICBteSAkVmVyc2lvbiA9IHt9OwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZlcnNpb25TYXZlJyApIHsKICAgICAgICBteSAkQWxsUmVxdWlyZWQgPSAxOwoKICAgICAgICAjIGdldCBnZW5lcmFsIGZvcm0gZGF0YQogICAgICAgIGZvciBteSAkRm9ybVBhcmFtIChxdyhOYW1lIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEKSkgewogICAgICAgICAgICAkVmVyc2lvbi0+eyRGb3JtUGFyYW19ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRm9ybVBhcmFtICk7CiAgICAgICAgICAgIGlmICggISRWZXJzaW9uLT57JEZvcm1QYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkQWxsUmVxdWlyZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB4bWwgZm9ybSBkYXRhCiAgICAgICAgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSA9ICRTZWxmLT5fWE1MRm9ybUdldCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBBbGxSZXF1aXJlZCAgID0+IFwkQWxsUmVxdWlyZWQsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB2ZXJzaW9uIHRvIGRhdGFiYXNlCiAgICAgICAgaWYgKCAkU3VibWl0U2F2ZSAmJiAkQWxsUmVxdWlyZWQgKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB2ZXJzaW9uCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25BZGQoCiAgICAgICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSBtYXNrCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJER1cGxpY2F0ZUlEKSB7CiAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKICAgICAgICBpZiAoJFZlcnNpb25JRCkgewoKICAgICAgICAgICAgIyBnZXQgdmVyc2lvbiBkYXRhIHRvIGR1cGxpY2F0ZSBjb25maWcgaXRlbQogICAgICAgICAgICAkVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24gZGF0YSB0byBkdXBsaWNhdGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICREdXBsaWNhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEKICAgICAgICAkVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlWE1MRm9ybU91dHB1dFBhcmFtOwogICAgaWYgKCAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdICkgewogICAgICAgICRYTUxGb3JtT3V0cHV0UGFyYW17WE1MRGF0YX0gPSAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdOwogICAgfQoKICAgICMgb3V0cHV0IG5hbWUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93TmFtZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IG5hbWUgaW52YWxpZCBibG9jawogICAgaWYgKCAhJFZlcnNpb24tPntOYW1lfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZlcnNpb25TYXZlJyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdSb3dOYW1lSW52YWxpZCcgKTsKICAgIH0KCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIERlcGxTdGF0ZU9wdGlvblN0cmcKICAgIG15ICREZXBsU3RhdGVPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXBsU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd0RlcGxTdGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIERlcGxTdGF0ZU9wdGlvblN0cmcgPT4gJERlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBpbnZhbGlkIGJsb2NrCiAgICBpZiAoICEkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZlcnNpb25TYXZlJyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dEZXBsU3RhdGVJbnZhbGlkJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAnb3BlcmF0aW9uYWwnLCAnaW5jaWRlbnQnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBJbmNpU3RhdGVPcHRpb25TdHJnCiAgICBteSAkSW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93SW5jaVN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkSW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57SW5jaVN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Jvd0luY2lTdGF0ZUludmFsaWQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgeG1sIGZvcm0KICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAkU2VsZi0+X1hNTEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgJVhNTEZvcm1PdXRwdXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxGb3JtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17QWxsUmVxdWlyZWR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0FsbFJlcXVpcmVkfSBuZSAnU0NBTEFSJzsKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgbXkgJEZvcm1EYXRhID0ge307CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIG15ICRDb3VudGVySW5zZXJ0ID0gMTsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkgYW5kIGFkZGtleQogICAgICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CiAgICAgICAgICAgIG15ICRBZGRLZXkgICA9ICRJdGVtLT57S2V5fSAuICc6OkFkZCc7CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgICAgICAkQWRkS2V5ICAgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkQWRkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwYXJhbQogICAgICAgICAgICBteSAkRm9ybVZhbHVlcyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNvbmZpZ0l0ZW1Gb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEZvcm1WYWx1ZXMtPntWYWx1ZX0gKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayByZXF1aXJlZCB2YWx1ZQogICAgICAgICAgICAgICAgaWYgKCAkRm9ybVZhbHVlcy0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgICAgICR7ICRQYXJhbXtBbGxSZXF1aXJlZH0gfSA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkSW5wdXRLZXkgLiAnOjpEZWxldGUnICk7CgogICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1YkZvcm1EYXRhID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gJFBhcmFte0FsbFJlcXVpcmVkfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTdWJGb3JtRGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XS0+e0NvbnRlbnR9ID0gJEZvcm1WYWx1ZXMtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAkQ291bnRlckluc2VydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgYWRkIGJ1dHRvbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRBZGRLZXkgKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZvcm1EYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJJbnNlcnRdID0gJFNlbGYtPl9YTUxEZWZhdWx0U2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XS0+e0NvbnRlbnR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKc3ViIF9YTUxEZWZhdWx0U2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICBteSAkRGVmYXVsdERhdGEgPSB7fTsKCiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnREZWZhdWx0fSApIHsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAkRGVmYXVsdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0gPSAkU2VsZi0+X1hNTERlZmF1bHRTZXQoCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGVmYXVsdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERlZmF1bHREYXRhOwp9CgpzdWIgX1hNTEZvcm1PdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgIyBzZXQgZGF0YSBwcmVzZW50IG1vZGUKICAgIG15ICREYXRhUHJlc2VudE1vZGUgPSAwOwogICAgaWYgKCAkUGFyYW17WE1MRGF0YX0gJiYgcmVmICRQYXJhbXtYTUxEYXRhfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJERhdGFQcmVzZW50TW9kZSA9IDE7CiAgICB9CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIG91dHB1dCByb3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdYTUxSb3cnICk7CgogICAgICAgICMgc2V0IGxvb3AKICAgICAgICBteSAkTG9vcCA9ICRJdGVtLT57Q291bnREZWZhdWx0fTsKICAgICAgICBpZiAoJERhdGFQcmVzZW50TW9kZSkgewogICAgICAgICAgICAkTG9vcCA9IDA7CgogICAgICAgICAgICAjIHNlYXJjaCB0aGUgbGFzdCBjb250ZW50CiAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAkTG9vcCA9ICRDb3VudGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBhYnNvbHV0IG1pbmltdW0KICAgICAgICAgICAgaWYgKCAkTG9vcCA8ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAgICAgJExvb3AgPSAkSXRlbS0+e0NvdW50TWlufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVsZXRlCiAgICAgICAgbXkgJERlbGV0ZSA9IDA7CiAgICAgICAgaWYgKCAkTG9vcCA+ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAkRGVsZXRlID0gMTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNvbnRlbnQgcm93cwogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJExvb3AgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlJyApOwoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGNvbnRlbnQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiAgICAgPT4gNCAtICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGJsdWUgcmVxdWlyZWQgc3RhcgogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93VmFsdWVDb250ZW50UmVxdWlyZWQnICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJlZCBpbnZhbGlkIHN0YXIKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57JElucHV0S2V5fS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93VmFsdWVDb250ZW50SW52YWxpZCcgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGNvbnRlbnQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudFNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgIGlmICgkRGVsZXRlKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudERlbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0S2V5ID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudERlbGV0ZUR1bW15JyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgcnVsZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93VmFsdWVSdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gNiAtICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHJ1bGUgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlUnVsZVNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgbXkgJVhNTEZvcm1PdXRwdXRQYXJhbTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YVByZXNlbnRNb2RlCiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkWE1MRm9ybU91dHB1dFBhcmFte1hNTERhdGF9ID0gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5fWE1MRm9ybU91dHB1dCgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAlWE1MRm9ybU91dHB1dFBhcmFtLAogICAgICAgICAgICAgICAgICAgIExldmVsICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHRvIHNvcnQgcm93cyBjb3JyZWN0bHkKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93JyApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYWRkIGJ1dHRvbgogICAgICAgIGlmICggJExvb3AgPCAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc2V0IHByZWZpeAogICAgICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93QWRkJyApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IGFkZCBjb250ZW50IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dBZGRDb250ZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuICAgICA9PiA0IC0gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgICAgICBJbnB1dEtleSAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IGFkZCBjb250ZW50IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dBZGRDb250ZW50U3BhY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+ICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgcnVsZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkUnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+IDYgLSAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgcnVsZSBzcGFjZSwgaWYgbGV2ZWwgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmICggJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkUnVsZVNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtIC0gdGlja2V0IGhpc3RvcnkKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtLHYgMS4xMCAyMDA5LzEwLzEzIDE3OjMxOjExIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoIERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDb25maWdPYmplY3QKICAgICAgICBQYXJhbU9iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57Q29uZmlnSXRlbUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbmZpZ0l0ZW1JRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntDb25maWdJdGVtSUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgbXkgJEhhc0FjY2VzcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICBJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgKTsKCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHNob3cgaGlzdG9yeSwgbm8gYWNjZXNzIHJpZ2h0cyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtTmFtZSA9ICRDb25maWdJdGVtLT57TnVtYmVyfTsKCiAgICAjIGdldCBhbGwgZW50cmllcyBpbiB0aGUgaGlzdG9yeSBmb3IgdGhpcyBjb25maWcgaXRlbQogICAgbXkgJExpbmVzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+SGlzdG9yeUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICAjIGdldCBzaG93biB1c2VyIGluZm8KICAgIG15IEBOZXdMaW5lcyA9IEB7JExpbmVzfTsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyJykgZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBOZXdMaW5lcyA9IHJldmVyc2UgQHskTGluZXN9OwogICAgfQoKICAgICMgZ2V0IGRlZmluaXRpb24gZm9yIENJJ3MgY2xhc3MKICAgIG15ICREZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIG15ICRUYWJsZSAgID0gJyc7CiAgICBteSAkQ291bnRlciA9IDE7CiAgICBteSAkVmVyc2lvbiA9IDA7CiAgICBmb3IgbXkgJERhdGFUbXAgKEBOZXdMaW5lcykgewogICAgICAgICRDb3VudGVyKys7CiAgICAgICAgbXkgJURhdGEgPSAoCiAgICAgICAgICAgICV7JERhdGFUbXB9LAogICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb24sCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmltIHRoZSBjb21tZW50IHRvIG9ubHkgc2hvdyB2ZXJzaW9uIG51bWJlcgogICAgICAgIGlmICggJERhdGF7SGlzdG9yeVR5cGV9IGVxICdWZXJzaW9uQ3JlYXRlJyApIHsKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPX4gcy9cRC8vZzsKICAgICAgICAgICAgJERhdGF7VmVyc2lvbklEfSA9ICREYXRhe0NvbW1lbnR9OwogICAgICAgICAgICAkVmVyc2lvbiA9ICREYXRhe0NvbW1lbnR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXRhe0hpc3RvcnlUeXBlfSBlcSAnVmFsdWVVcGRhdGUnICkgewoKICAgICAgICAgICAgIyBiZWF1dGlmeSBjb21tZW50CiAgICAgICAgICAgIG15IEBQYXJ0cyA9IHNwbGl0IC8lJS8sICREYXRhe0NvbW1lbnR9OwogICAgICAgICAgICAkUGFydHNbMF0gPX4gc3sgXEEgXFsuKj9cXSBceydWZXJzaW9uJ1x9IFxbLio/XF0gXHsnIH17fXhtczsKICAgICAgICAgICAgJFBhcnRzWzBdID1+IHN7ICdcfSBcWy4qP1xdIFx7JyB9ezo6fXhtc2c7CiAgICAgICAgICAgICRQYXJ0c1swXSA9fiBzeyAnXH0gXFsuKj9cXSBceiB9e314bXM7CgogICAgICAgICAgICAjIGdldCBpbmZvIGFib3V0IGF0dHJpYnV0ZQogICAgICAgICAgICBteSAkQXR0cmlidXRlSW5mbyA9ICRTZWxmLT5fR2V0QXR0cmlidXRlSW5mbygKICAgICAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgICAgIFBhdGggICAgICAgPT4gJFBhcnRzWzBdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlSW5mbyAmJiAkQXR0cmlidXRlSW5mby0+e0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CiAgICAgICAgICAgICAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEF0dHJpYnV0ZUluZm8tPntJbnB1dH0tPntDbGFzc30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJ0c1sxXSA9ICRJdGVtTGlzdC0+eyAkUGFydHNbMV0gfSB8fCAnJzsKICAgICAgICAgICAgICAgICRQYXJ0c1syXSA9ICRJdGVtTGlzdC0+eyAkUGFydHNbMl0gfSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NlbWJsZSBwYXJ0cwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9IGpvaW4gJyUlJywgQFBhcnRzOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXRhe0hpc3RvcnlUeXBlfSBlcSAnRGVwbG95bWVudFN0YXRlVXBkYXRlJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IG5hbWVzCiAgICAgICAgICAgIG15IEBQYXJ0cyA9IHNwbGl0IC8lJS8sICREYXRhe0NvbW1lbnR9OwogICAgICAgICAgICBmb3IgbXkgJFBhcnQgKEBQYXJ0cykgewogICAgICAgICAgICAgICAgJFBhcnQgPSAkRGVwbFN0YXRlTGlzdC0+eyRQYXJ0fSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NlbWJsZSBwYXJ0cwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9IGpvaW4gJyUlJywgQFBhcnRzOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXRhe0hpc3RvcnlUeXBlfSBlcSAnSW5jaWRlbnRTdGF0ZVVwZGF0ZScgKSB7CgogICAgICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbmFtZXMKICAgICAgICAgICAgbXkgQFBhcnRzID0gc3BsaXQgLyUlLywgJERhdGF7Q29tbWVudH07CiAgICAgICAgICAgIGZvciBteSAkUGFydCAoQFBhcnRzKSB7CiAgICAgICAgICAgICAgICAkUGFydCA9ICREZXBsU3RhdGVMaXN0LT57JFBhcnR9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFzc2VtYmxlIHBhcnRzCiAgICAgICAgICAgICREYXRhe0NvbW1lbnR9ID0gam9pbiAnJSUnLCBAUGFydHM7CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgdGV4dAogICAgICAgIGlmICggJERhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgIG15ICVJbmZvID0gKCk7CiAgICAgICAgICAgICREYXRhe0NvbW1lbnR9ID1+IHMvXiUlLy9nOwogICAgICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQoIC8lJS8sICREYXRhe0NvbW1lbnR9ICk7CiAgICAgICAgICAgICREYXRhe0NvbW1lbnR9ID0gJyc7CiAgICAgICAgICAgIGZvciAoQFZhbHVlcykgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtDb21tZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtDb21tZW50fSAuPSAiXCIsICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXtDb21tZW50fSAuPSAiXCIkXyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJERhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9ICciICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICdDSUhpc3Rvcnk6OicgLiAkRGF0YXtIaXN0b3J5VHlwZX0gLiAnIiwgJyAuICREYXRhe0NvbW1lbnR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9fiBzL1wlcy8vZzsKICAgICAgICB9CgogICAgICAgICMgc2VwZXJhdGUgZWFjaCBzZWFyY2hyZXN1bHQgbGluZSBieSB1c2luZyBzZXZlcmFsIGNzcwogICAgICAgIGlmICggJENvdW50ZXIgJSAyICkgewogICAgICAgICAgICAkRGF0YXtjc3N9ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7Y3NzfSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJENvbmZpZ0l0ZW1OYW1lICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlbGYtPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICBWZXJzaW9uSUQgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmVyc2lvbklEJyApLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldEF0dHJpYnV0ZUluZm8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRGVmaW5pdGlvbiBQYXRoKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3VidHJlZSA9ICRQYXJhbXtEZWZpbml0aW9ufTsKICAgIG15ICRJbmZvOwoKICAgIFBBUlQ6CiAgICBmb3IgbXkgJFBhcnQgKCBzcGxpdCAvOjovLCAkUGFyYW17UGF0aH0gKSB7CiAgICAgICAgbXkgKCRGb3VuZCkgPSBncmVwIHsgJF8tPntLZXl9IGVxICRQYXJ0IH0gQHskU3VidHJlZX07CgogICAgICAgIGxhc3QgUEFSVCBpZiAhJEZvdW5kOwoKICAgICAgICAkU3VidHJlZSA9ICRGb3VuZC0+e1N1Yn07CiAgICAgICAgJEluZm8gICAgPSAkRm91bmQ7CiAgICB9CgogICAgcmV0dXJuICRJbmZvOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBjb25maWcgaXRlbSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSx2IDEuOCAyMDEwLzAyLzExIDIxOjUxOjMzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHM7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMtPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbmZpZ0l0ZW1JRCcgKTsKICAgIG15ICRWZXJzaW9uSUQgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWZXJzaW9uSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDb25maWdJdGVtSUQgfHwgISRWZXJzaW9uSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICBteSAkSGFzQWNjZXNzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgKTsKCiAgICBpZiAoICEkSGFzQWNjZXNzICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHNob3cgY29uZmlnIGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgIGlmICggISRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbklELAogICAgKTsKICAgIGlmICggISRWZXJzaW9uLT57VmVyc2lvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiVmVyc2lvbklEICRWZXJzaW9uSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICBteSAkTGFzdFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgICRDb25maWdJdGVtLT57Q3VycmVudE5hbWV9ID0gJExhc3RWZXJzaW9uLT57TmFtZX07CgogICAgIyBnZXQgdmVyc2lvbiBsaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgbXkgJFZlcnNpb25OdW1iZXIgPSAxOwogICAgTElTVFZFUlNJT05JRDoKICAgIGZvciBteSAkTGlzdFZlcnNpb25JRCAoIEB7JFZlcnNpb25MaXN0fSApIHsKCiAgICAgICAgbGFzdCBMSVNUVkVSU0lPTklEIGlmICRWZXJzaW9uSUQgZXEgJExpc3RWZXJzaW9uSUQ7CiAgICAgICAgJFZlcnNpb25OdW1iZXIrKzsKICAgIH0KCiAgICAjIGdldCB1c2VyIGRhdGEgb2YgY29uZmlnIGl0ZW0gKGNyZWF0ZSBieSkKICAgIG15ICVDb25maWdJdGVtQ3JlYXRlQnkgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJENvbmZpZ0l0ZW0tPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZGF0YSBvZiBjb25maWcgaXRlbSAoY2hhbmdlIGJ5KQogICAgbXkgJUNvbmZpZ0l0ZW1DaGFuZ2VCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ29uZmlnSXRlbS0+e0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBkYXRhIG9mIHZlcnNpb24gKGNyZWF0ZSBieSkKICAgIG15ICVWZXJzaW9uQ3JlYXRlQnkgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFZlcnNpb24tPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgS2V5ICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0eXBlIGxpc3QKICAgIG15ICVMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5UeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgbGluayBkYXRhCiAgICBteSAlTGlua0RhdGE7CiAgICBpZiAoICRMaW5rTGlzdFdpdGhEYXRhICYmIHJlZiAkTGlua0xpc3RXaXRoRGF0YSBlcSAnSEFTSCcgJiYgJXskTGlua0xpc3RXaXRoRGF0YX0gKSB7CiAgICAgICAgJUxpbmtEYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJ1NpbXBsZVJhdycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewoKICAgICAgICBteSAlUGFnZTsKICAgICAgICBteSAkVXJsID0gJyAnOwoKICAgICAgICBpZiAoICRFTlZ7UkVRVUVTVF9VUkl9ICkgewogICAgICAgICAgICAkVXJsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvbmZpZ0l0ZW0nKSAuICcjJwogICAgICAgICAgICAuICRDb25maWdJdGVtLT57TnVtYmVyfTsKICAgICAgICAkUGFnZXtIZWFkbGluZUxlZnR9ICA9ICRWZXJzaW9uLT57TmFtZX07CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgncHJpbnRlZCBieScpIC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAkVXJsOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50TmV3KAogICAgICAgICAgICBUaXRsZSAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICc6JyAuICRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgIEVuY29kZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgZmlyc3QgcGRmIHBhZ2UKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwoKICAgICAgICAjIG91dHB1dCBnZW5lcmFsIGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRHZW5lcmFsSW5mb3MoCiAgICAgICAgICAgIFBhZ2UgICAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IFwlQ29uZmlnSXRlbUNyZWF0ZUJ5LAogICAgICAgICAgICBDaGFuZ2VCeSAgID0+IFwlQ29uZmlnSXRlbUNoYW5nZUJ5LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgaWYgKCVMaW5rRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgTGlua0RhdGEgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgPT4gXCVMaW5rVHlwZUxpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCB2ZXJzaW9uIGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRWZXJzaW9uSW5mb3MoCiAgICAgICAgICAgIFBhZ2UgICAgICAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBWZXJzaW9uICAgICAgID0+ICRWZXJzaW9uLAogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+ICRWZXJzaW9uTnVtYmVyLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IFwlVmVyc2lvbkNyZWF0ZUJ5LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpbGUgbmFtZQogICAgICAgIG15ICRGaWxlbmFtZSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVuYW1lQ2xlYW5VcCgKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgICAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgICAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2NvbmZpZ2l0ZW1fJyAuICRGaWxlbmFtZSAuICJfJFktJE0tJERcXyRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9wZGYnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCksCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgaHRtbCBvdXRwdXQKICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFZlcnNpb24tPntOYW1lfSApOwoKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAlTGlua0RhdGEgKSB7CgogICAgICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgICAgICAgICAgbXkgQExpbmtEYXRhID0gc3BsaXQgcXs6On0sICRMaW5rVHlwZUxpbmtEaXJlY3Rpb247CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayB0eXBlIGRhdGEKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZU5hbWUgPT4gJExpbmtUeXBlTGlzdHsgJExpbmtEYXRhWzBdIH0tPnsgJExpbmtEYXRhWzFdIC4gJ05hbWUnIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IG9iamVjdCBsaXN0CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRMaW5rRGF0YXskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkT2JqZWN0TGlzdC0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1R5cGVSb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1N0cmcgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgdmVyc2lvbiBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIlZlcnNpb24iLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICAgICAgVmVyc2lvbk51bWJlciAgICAgICAgID0+ICRWZXJzaW9uTnVtYmVyLAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTG9naW4gICAgID0+ICRWZXJzaW9uQ3JlYXRlQnl7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckZpcnN0bmFtZSA9PiAkVmVyc2lvbkNyZWF0ZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTGFzdG5hbWUgID0+ICRWZXJzaW9uQ3JlYXRlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB4bWwgc3RydWN0dXJlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkVmVyc2lvbgogICAgICAgICAgICAmJiByZWYgJFZlcnNpb24gZXEgJ0hBU0gnCiAgICAgICAgICAgICYmICRWZXJzaW9uLT57WE1MRGVmaW5pdGlvbn0KICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfQogICAgICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9ICAgICAgIGVxICdBUlJBWScKICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdCiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0gZXEgJ0hBU0gnCiAgICAgICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259CiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT5fSFRNTE91dHB1dFhNTFN0cnVjdHVyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtUHJpbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJENvbmZpZ0l0ZW1DcmVhdGVCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyRmlyc3RuYW1lID0+ICRDb25maWdJdGVtQ3JlYXRlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMYXN0bmFtZSAgPT4gJENvbmZpZ0l0ZW1DcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTG9naW4gICAgID0+ICRDb25maWdJdGVtQ2hhbmdlQnl7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5VXNlckZpcnN0bmFtZSA9PiAkQ29uZmlnSXRlbUNoYW5nZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTGFzdG5hbWUgID0+ICRDb25maWdJdGVtQ2hhbmdlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0R2VuZXJhbEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgQ29uZmlnSXRlbSBDcmVhdGVCeSBDaGFuZ2VCeSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NsYXNzJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDb25maWdJdGVtfS0+e0NsYXNzfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NvbmZpZ0l0ZW0nKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NvbmZpZ0l0ZW19LT57Q3VycmVudE5hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJFBhcmFte0NvbmZpZ0l0ZW19LT57Q3VyRGVwbFN0YXRlfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbX0tPntDdXJJbmNpU3RhdGV9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xhc3QgY2hhbmdlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JFdmVufSAgPSAnI0FBQUFBQSc7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JPZGR9ICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRMaW5rZWRPYmplY3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgTGlua0RhdGEgTGlua1R5cGVMaXN0KSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVQYWdlICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUeXBlTGlzdCA9ICV7ICRQYXJhbXtMaW5rVHlwZUxpc3R9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgIGZvciBteSAkTGlua1R5cGVMaW5rRGlyZWN0aW9uICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXsgJFBhcmFte0xpbmtEYXRhfSB9ICkgewoKICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgbXkgQExpbmtEYXRhID0gc3BsaXQgcXs6On0sICRMaW5rVHlwZUxpbmtEaXJlY3Rpb247CiAgICAgICAgbXkgJExpbmtUeXBlTmFtZSA9ICRUeXBlTGlzdHsgJExpbmtEYXRhWzBdIH0tPnsgJExpbmtEYXRhWzFdIC4gJ05hbWUnIH07CiAgICAgICAgJExpbmtUeXBlTmFtZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRMaW5rVHlwZU5hbWUpOwoKICAgICAgICAjIGRlZmluZSBoZWFkbGluZQogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMaW5rVHlwZU5hbWUgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICcnOwoKICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRQYXJhbXtMaW5rRGF0YX0tPnskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gfHw9ICcnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgewogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGlua2VkIE9iamVjdHMnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgdGFibGUgcGFyYW1zCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VmVyc2lvbkluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgVmVyc2lvbiBWZXJzaW9uTnVtYmVyKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ZlcnNpb24nKSAuICcgJwogICAgICAgICAgICAuICRQYXJhbXtWZXJzaW9uTnVtYmVyfSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkVGFibGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte1ZlcnNpb259IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICcgJywKICAgICAgICAgICAgVmFsdWUgPT4gJyAnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTmFtZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VmVyc2lvbn0tPntOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0RlcGxveW1lbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWZXJzaW9ufS0+e0RlcGxTdGF0ZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0luY2lkZW50IFN0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17VmVyc2lvbn0tPntJbmNpU3RhdGV9ICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgeG1sIGRhdGEgdG8gdGFibGUKICAgIGlmICgKICAgICAgICByZWYgJFBhcmFte1ZlcnNpb259IGVxICdIQVNIJwogICAgICAgICYmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERlZmluaXRpb259CiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0KICAgICAgICAmJiByZWYgJFBhcmFte1ZlcnNpb259LT57WE1MRGVmaW5pdGlvbn0gZXEgJ0FSUkFZJwogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfSAgICAgICBlcSAnQVJSQVknCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0tPlsxXQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdIGVxICdIQVNIJwogICAgICAgICYmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFhNTE91dHB1dCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkUGFyYW17VmVyc2lvbn0tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICAgICAgVGFibGVEYXRhICAgICA9PiAkVGFibGUsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3dzID0gQHskVGFibGV9OwoKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSAxMDA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MTE7CiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSAgICAgID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0WE1MT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1RhYmxlRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17VGFibGVEYXRhfSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIHN0b3AgbG9vcCwgaWYgbm8gY29udGVudCB3YXMgZ2l2ZW4KICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwoKICAgICAgICAgICAgIyBsb29rdXAgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MVmFsdWVMb29rdXAoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBQcmludCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHZhbHVlIHRvIGFzY2lpCiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9Bc2NpaSggU3RyaW5nID0+ICRWYWx1ZSApOwoKICAgICAgICAgICAgIyBuZXcgcm93CiAgICAgICAgICAgIG15ICROZXdSb3cgPSB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJEl0ZW0tPntOYW1lfSApIC4gJzonLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgIyBvdXRwdXQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE5ld1Jvdy0+e0tleX0gICA9ICcgICAgJyAuICROZXdSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgICAgICROZXdSb3ctPntWYWx1ZX0gPSAnICAgICcgLiAkTmV3Um93LT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByb3cgZGF0YQogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtUYWJsZURhdGF9IH0sICROZXdSb3c7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRYTUxPdXRwdXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgVGFibGVEYXRhICAgICA9PiAkUGFyYW17VGFibGVEYXRhfSwKICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxPdXRwdXRYTUxTdHJ1Y3R1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZGF0YSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvblJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgZm9yICggMSAuLiAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1ZlcnNpb25Sb3dOYW1lUHJlJyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1ZlcnNpb25Sb3dWYWx1ZVByZScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgICRTZWxmLT5fSFRNTE91dHB1dFhNTFN0cnVjdHVyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBzZWFyY2ggbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtLHYgMS4xMyAyMDEwLzA0LzI3IDExOjIzOjEyIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzIG9uIHRoZSBjbGFzc2VzCiAgICBmb3IgbXkgJENsYXNzSUQgKCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gaWYgISRIYXNBY2Nlc3M7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgaWQKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1NlYXJjaCcgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBzZWFyY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBdHRyaWJ1dGUnICkgewoKICAgICAgICAjIENsYXNzSUQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzZWFyY2ggbWFzayBhbmQgZm9yIGFjdHVhbCBzZWFyY2hpbmcKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdObyBDbGFzc0lEIGlzIGdpdmVuIScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdXNlciBpcyBhbGxvd2VkIHRvIHNlYXJjaCBjbGFzcwogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4KICAgICAgICBpZiAoICEkSGFzQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uCiAgICAgICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgICAgIGlmICggISRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJObyBEZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAkQ2xhc3NJRCEiLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGF0dHJpYnV0ZXMgdXNlZCBmb3Igc2VhcmNoaW5nIGFuZCBmb3IgcmVzdG9yaW5nIHByZXZpb3VzIGlucHV0CiAgICAgICAgbXkgJUdldFBhcmFtOwoKICAgICAgICAjIGdldCBzY2FsYXIgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBGT1JNVkFMVUU6CiAgICAgICAgZm9yIG15ICRGb3JtVmFsdWUgKHF3KE51bWJlciBOYW1lIFByZXZpb3VzVmVyc2lvblNlYXJjaCkpIHsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZvcm1WYWx1ZSApOwoKICAgICAgICAgICAgbmV4dCBGT1JNVkFMVUUgaWYgISRWYWx1ZTsKCiAgICAgICAgICAgICRHZXRQYXJhbXskRm9ybVZhbHVlfSA9ICRWYWx1ZTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFycmF5IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgRk9STUFSUkFZOgogICAgICAgIGZvciBteSAkRm9ybUFycmF5IChxdyhEZXBsU3RhdGVJRHMgSW5jaVN0YXRlSURzKSkgewoKICAgICAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkRm9ybUFycmF5ICk7CgogICAgICAgICAgICBuZXh0IEZPUk1BUlJBWSBpZiAhQEFycmF5OwoKICAgICAgICAgICAgJEdldFBhcmFteyRGb3JtQXJyYXl9ID0gXEBBcnJheTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIHNob3VsZCBiZSBwZXJmb3JtZWQKICAgICAgICBteSAkU3VibWl0U2VhcmNoID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0U2VhcmNoJyApOwoKICAgICAgICBpZiAoJFN1Ym1pdFNlYXJjaCkgewoKICAgICAgICAgICAgIyBnZXQgeG1sIHNlYXJjaCBmb3JtCiAgICAgICAgICAgIG15ICRYTUxGb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1HZXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgICAgICBYTUxGb3JtRGF0YSAgID0+ICRYTUxGb3JtRGF0YSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggQHskWE1MRm9ybURhdGF9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1doYXR9ID0gJFhNTEZvcm1EYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0YXJ0IHNlYXJjaAogICAgICAgICAgICBteSAkU2VhcmNoUmVzdWx0TGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzSURzID0+IFskQ2xhc3NJRF0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByZXN1bHQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVG90YWxIaXRzID0+IHNjYWxhciggQHskU2VhcmNoUmVzdWx0TGlzdH0gKSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgdGhlIGZvdW5kIGNvbmZpZyBpdGVtcwogICAgICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JFNlYXJjaFJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKICAgICAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkSGFzQWNjZXNzOwoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAgICAgICAgICMgZ2V0IHZlcnNpb24KICAgICAgICAgICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyRMYXN0VmVyc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkTGFzdFZlcnNpb24tPntDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGlucHV0IG1hc2sKCiAgICAgICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZW5lcmF0ZSBkcm9wZG93biBmb3Igc2VsZWN0aW5nIHRoZSB3YW50ZWQgZGVwbG95bWVudCBzdGF0ZXMKICAgICAgICAgICAgbXkgJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkRGVwbFN0YXRlTGlzdCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0RlcGxTdGF0ZUlEcycsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtEZXBsU3RhdGVJRHN9IHx8IFtdLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgICAgICAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGluY2lkZW50IHN0YXRlcwogICAgICAgICAgICBteSAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0luY2lTdGF0ZUlEc30gfHwgW10sCiAgICAgICAgICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdlbmVyYXRlIFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcKICAgICAgICAgICAgbXkgJFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJldmlvdXNWZXJzaW9uU2VhcmNoJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIDAgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gfHwgJzAnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRyaWJ1dGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgICAgPT4gJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyAgICA9PiAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnID0+ICRQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHhtbCBzZWFyY2ggZm9ybQogICAgICAgICAgICBpZiAoICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBjbGFzcyBzZWxlY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdlbmVyYXRlIGRyb3Bkb3duIGZvciBzZWxlY3RpbmcgdGhlIGNsYXNzCiAgICAgICAgIyBhdXRvbWF0aWNhbGx5IHNob3cgc2VhcmNoIG1hc2sgYWZ0ZXIgc2VsZWN0aW5nIGEgY2xhc3MKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQgfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY2xhc3MgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgIyBvdXRwdXQgdGVtcGxhdGUKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICk7CgogICAgIyBvdXRwdXQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfWE1MU2VhcmNoRm9ybU91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgc2V0IHByZWZpeAogICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fTsKICAgICAgICBteSAkTmFtZSAgICAgPSAkSXRlbS0+e05hbWV9OwogICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgJE5hbWUgICAgID0gJFBhcmFte1ByZWZpeE5hbWV9IC4gJzo6JyAuICROYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlLCBpZiBtYXJrZWQgYXMgc2VhcmNoYWJsZQogICAgICAgIGlmICggJEl0ZW0tPntTZWFyY2hhYmxlfSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNvbmZpZ0l0ZW1TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEtleSAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dHJpYnV0ZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSB8fCAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIElucHV0U3RyaW5nID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fWE1MU2VhcmNoRm9ybU91dHB1dCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICBQcmVmaXhOYW1lICAgID0+ICROYW1lLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfWE1MU2VhcmNoRm9ybUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTEZvcm1EYXRhfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxGb3JtRGF0YX0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VhcmNoIGZvcm0gZGF0YQogICAgICAgIG15ICRWYWx1ZXMgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgICAgIEtleSAgPT4gJElucHV0S2V5LAogICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHNlYXJjaCBrZXkKICAgICAgICBteSAkU2VhcmNoS2V5ID0gJElucHV0S2V5OwogICAgICAgICRTZWFyY2hLZXkgPX4gc3sgOjogfXtcJ1x9WyVdXHtcJ314bXNnOwogICAgICAgICRTZWFyY2hLZXkgPSAiWzFdeydWZXJzaW9uJ31bMV17JyRTZWFyY2hLZXknfVslXXsnQ29udGVudCd9IjsKCiAgICAgICAgIyBJVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0KCkgY2FuIHJldHVybiBzdHJpbmcsIGFycmF5cmVmIG9yIGhhc2hyZWYKICAgICAgICBpZiAoIHJlZiAkVmFsdWVzIGVxICdBUlJBWScgKSB7CgogICAgICAgICAgICAjIGZpbHRlciBlbXB0eSBlbGVtZW50cwogICAgICAgICAgICBteSBAU2VhcmNoVmFsdWVzID0gZ3JlcCB7JF99IEB7JFZhbHVlc307CgogICAgICAgICAgICBpZiAoQFNlYXJjaFZhbHVlcykgewogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17WE1MRm9ybURhdGF9IH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hLZXkgPT4gXEBTZWFyY2hWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFZhbHVlcykgewoKICAgICAgICAgICAgIyBlLmcuIGZvciBEYXRlIGJldHdlZW4gc2VhcmNoZXMKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17WE1MRm9ybURhdGF9IH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VhcmNoS2V5ID0+ICRWYWx1ZXMsCiAgICAgICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1HZXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBYTUxGb3JtRGF0YSAgID0+ICRQYXJhbXtYTUxGb3JtRGF0YX0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtLHYgMS43IDIwMDkvMTAvMTMgMTc6MzE6MTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICkgfHwgMDsKICAgIG15ICRWZXJzaW9uSUQgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWZXJzaW9uSUQnICkgICAgfHwgMDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgbXkgJEhhc0FjY2VzcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICk7CgogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBzaG93IGl0ZW0sIG5vIGFjY2VzcyByaWdodHMgZm9yIENvbmZpZ0l0ZW0gYXJlIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc2hvdyB2ZXJzaW9ucwogICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAwOwogICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTaG93VmVyc2lvbnMnICkgKSB7CiAgICAgICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAxOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CiAgICBpZiAoICEkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZlcnNpb24gbGlzdAogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvblpvb21MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgIGlmICggISRWZXJzaW9uTGlzdC0+WzBdLT57VmVyc2lvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gVmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB2ZXJzaW9uIGlkCiAgICBpZiAoICEkVmVyc2lvbklEICkgewogICAgICAgICRWZXJzaW9uSUQgPSAkVmVyc2lvbkxpc3QtPlstMV0tPntWZXJzaW9uSUR9OwogICAgfQogICAgaWYgKCAkVmVyc2lvbklEIG5lICRWZXJzaW9uTGlzdC0+Wy0xXS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAxOwogICAgfQoKICAgICMgc2V0IHZlcnNpb24gaWQgaW4gcGFyYW0gaGFzaCAob25seSBmb3IgbWVudSBtb2R1bGUpCiAgICBpZiAoJFZlcnNpb25JRCkgewogICAgICAgICRQYXJhbXtWZXJzaW9uSUR9ID0gJFZlcnNpb25JRDsKICAgIH0KCiAgICAjIHJ1biBjb25maWcgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB2ZXJzaW9uIHRyZWUKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RyZWUnICk7CiAgICBteSAkQ291bnRlciA9IDE7CiAgICBpZiAoICEkUGFyYW17U2hvd1ZlcnNpb25zfSAmJiAkVmVyc2lvbklEIGVxICRWZXJzaW9uTGlzdC0+Wy0xXS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgJENvdW50ZXIgICAgID0gQHskVmVyc2lvbkxpc3R9OwogICAgICAgICRWZXJzaW9uTGlzdCA9IFsgJFZlcnNpb25MaXN0LT5bLTFdIF07CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICBteSAkTGFzdFZlcnNpb24gPSAkVmVyc2lvbkxpc3QtPlstMV07CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyBvdXRwdXQgdmVyc2lvbiB0cmVlCiAgICBmb3IgbXkgJFZlcnNpb25IYXNoICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICApOwogICAgICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFZlcnNpb25IYXNoLT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMQogICAgICAgICk7CiAgICAgICAgaWYgKCAkVmVyc2lvbkhhc2gtPntWZXJzaW9uSUR9IGVxICRWZXJzaW9uSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUFjdGl2ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVVzZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICAgICAgICAgICV7JFZlcnNpb25IYXNofSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIEluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkVmVyc2lvbkhhc2gtPntJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUluYWN0aXZlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlVXNlckluZm8sCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgJXskVmVyc2lvbkhhc2h9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgSW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRWZXJzaW9uSGFzaC0+e0luY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkQ29uZmlnSXRlbS0+e051bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbklELAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgJFZlcnNpb24KICAgICAgICAmJiByZWYgJFZlcnNpb24gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufQogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0KICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSBlcSAnQVJSQVknCiAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0gICAgICAgZXEgJ0FSUkFZJwogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXQogICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0KICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICkKICAgIHsKCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWZXJzaW9uLT57TmFtZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbmFtZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdGFydCB4bWwgb3V0cHV0CiAgICAgICAgJFNlbGYtPl9YTUxPdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJENvbmZpZ0l0ZW0tPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRDb25maWdJdGVtLT57ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRMYXN0VmVyc2lvbn0sCiAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJExhc3RWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgbGluayB0YWJsZQogICAgaWYgKCRMaW5rVGFibGVTdHJnKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlJyAuICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0KICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZGF0YSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0YScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgZm9yICggMSAuLiAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0RhdGFOYW1lUHJlJyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0RhdGFWYWx1ZVByZScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5fWE1MT3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtLHYgMS43IDIwMTAvMDIvMTUgMTQ6MDk6MzkgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGN1c3RvbWVyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRDdXN0b21lci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgJFBhcmFte1ZhbHVlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ID0+ICRQYXJhbXtWYWx1ZX0gfHwgJycsCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgc2VsZWN0ZWQgY3VzdG9tZXIgdXNlcgogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIGNoZWNrIHNlYXJjaCBidXR0b24KICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlYXJjaCcgKSApIHsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICk7CiAgICB9CgogICAgIyBjaGVjayBzZWxlY3QgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWxlY3QnICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWxlY3QnICk7CiAgICB9CgogICAgIyBjaGVjayBjbGVhciBidXR0b24KICAgIGVsc2lmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvbkNsZWFyJyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHJlc2V0IHZhbHVlIGlmIHNlYXJjaCBmaWVsZCBpcyBlbXR5CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlYXJjaCcgKQogICAgICAgICAgICAmJiBkZWZpbmVkICRGb3JtRGF0YXtWYWx1ZX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBvcHRpb24KICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgICAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAnJzsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIH0KICAgIG15ICRTaXplICAgICAgICAgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA1MDsKICAgIG15ICRTZWFyY2ggICAgICAgPSAnJzsKICAgIG15ICRTdHJpbmdPcHRpb24gPSAnJzsKICAgIG15ICRTdHJpbmdTZWxlY3QgPSAnJzsKCiAgICAjIGN1c3RvbWVyIHNlYXJjaAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofSApIHsKCiAgICAgICAgIyBzdGFydCBzZWFyY2gKICAgICAgICBteSAlQ3VzdG9tZXJTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVDdXN0b21lclNlYXJjaExpc3QpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIG9wdGlvbiBsaXN0CiAgICAgICAgICAgICRTdHJpbmdPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17S2V5fSAuICc6OlNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlQ3VzdG9tZXJTZWFyY2hMaXN0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU3RyaW5nT3B0aW9uIC49ICc8YnI+JzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlbGVjdCBidXR0b24KICAgICAgICAgICAgJFN0cmluZ1NlbGVjdCA9ICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgICAgICAuICc6OkJ1dHRvblNlbGVjdCIgJwogICAgICAgICAgICAgICAgLiAndmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+Jm5ic3A7JzsKCiAgICAgICAgICAgICMgc2V0IHNlYXJjaAogICAgICAgICAgICAkU2VhcmNoID0gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH07CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGN1c3RvbWVyIHN0cmluZwogICAgZWxzaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIGdldCBjdXN0b21lciBkYXRhCiAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkVmFsdWUsCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRTZWFyY2ggPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoTGlzdHskVmFsdWV9IHx8ICcnLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nCiAgICAgICAgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgLiAkVmFsdWUgLiAnIj4nCiAgICAgICAgLiAnPGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IicKICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgLiAnOjpTZWFyY2giIHNpemU9IicKICAgICAgICAuICRTaXplCiAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgIC4gJFNlYXJjaCAuICciPicgLiAnPGJyPicKICAgICAgICAuICRTdHJpbmdPcHRpb24KICAgICAgICAuICRTdHJpbmdTZWxlY3QKICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgIC4gJzo6QnV0dG9uU2VhcmNoIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij4nCiAgICAgICAgLiAnJm5ic3A7JwogICAgICAgIC4gJzxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicKICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEtleSA9ICRQYXJhbXtLZXl9OwoKICAgICMgaGFzaCB3aXRoIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZpZWxkCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgc2VsZWN0ZWQgY3VzdG9tZXIgdXNlcgogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwoKICAgICMgY2hlY2sgc2VhcmNoIGJ1dHRvbgogICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnskS2V5fS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgLiAnOjpTZWFyY2gnICk7CiAgICB9CgogICAgIyBjaGVjayBzZWxlY3QgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSAuICc6OkJ1dHRvblNlbGVjdCcgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSAuICc6OkJ1dHRvbkNsZWFyJyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHJlc2V0IHZhbHVlIGlmIHNlYXJjaCBmaWVsZCBpcyBlbXR5CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5IC4gJzo6U2VhcmNoJyApCiAgICAgICAgICAgICYmIGRlZmluZWQgJEZvcm1EYXRhe1ZhbHVlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIG9wdGlvbgogICAgICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyRLZXl9LT57SW52YWxpZH0gPSAxOwogICAgICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBpbnB1dCBmaWVsZCwgaW5jbHVkaW5nIHRoZSBzZWFyY2ggYW5kIGNsZWFyIGJ1dHRvbnMKICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT5JbnB1dENyZWF0ZSgKICAgICAgICAlRm9ybURhdGEsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBJdGVtID0+ICRQYXJhbXtJdGVtfSwKICAgICk7CgogICAgcmV0dXJuICRJbnB1dFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDEwLzAyLzE1IDE0OjA5OjM5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGUucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0RGF0ZS5wbSx2IDEuOSAyMDEwLzAyLzE1IDE0OjA5OjM5IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGRhdGUgb2JqZWN0cy4KCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMS0wMScsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte1ZhbHVlfSAuICcgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte1ZhbHVlfSA9fiBzLzAwOjAwOjAwLy87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX0gfHwgJyc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRGF5ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6RGF5JyApOwogICAgbXkgJE1vbnRoID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1vbnRoJyApOwogICAgbXkgJFllYXIgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlllYXInICk7CgogICAgaWYgKCAkRGF5ICYmICRNb250aCAmJiAkWWVhciApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gc3ByaW50ZiAnJTAyZC0lMDJkLSUwMmQnLCAkWWVhciwgJE1vbnRoLCAkRGF5OwogICAgfQoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYnLCAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWYWx1ZXM7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgICAgIGlmICggJFZhbHVlID1+IC9eKFxkXGRcZFxkKS0oXGRcZHxcZCktKFxkXGR8XGQpJC9pICkgewogICAgICAgICAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6OlllYXInIH0gID0gJDE7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnIH0gPSAkMjsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpEYXknIH0gICA9ICQzOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUGFyYW17S2V5fSAuICc6OicsCiAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJVZhbHVlcywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVXNlZCAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIG15ICRTdGFydERheSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6RGF5JyApOwogICAgbXkgJFN0YXJ0TW9udGggPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpNb250aCcgKTsKICAgIG15ICRTdGFydFllYXIgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdGFydDo6WWVhcicgKTsKICAgIG15ICRTdG9wRGF5ICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpEYXknICk7CiAgICBteSAkU3RvcE1vbnRoICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6TW9udGgnICk7CiAgICBteSAkU3RvcFllYXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RvcDo6WWVhcicgKTsKCiAgICBpZiAoCiAgICAgICAgJFVzZWQKICAgICAgICAmJiAkU3RhcnREYXkgJiYgJFN0YXJ0TW9udGggJiYgJFN0YXJ0WWVhcgogICAgICAgICYmICRTdG9wRGF5ICAmJiAkU3RvcE1vbnRoICAmJiAkU3RvcFllYXIKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFN0YXJ0RGF0ZSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkJywgJFN0YXJ0WWVhciwgJFN0YXJ0TW9udGgsICRTdGFydERheTsKICAgICAgICBteSAkU3RvcERhdGUgID0gc3ByaW50ZiAnJTAyZC0lMDJkLSUwMmQnLCAkU3RvcFllYXIsICAkU3RvcE1vbnRoLCAgJFN0b3BEYXk7CgogICAgICAgIHJldHVybiB7ICctYmV0d2VlbicgPT4gWyAkU3RhcnREYXRlLCAkU3RvcERhdGUgXSB9OwogICAgfQoKICAgIHJldHVybiBbXTsgICAgIyBubyBjb25kaXRpb25zIGJ5IGRlZmF1bHQKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMganVzdCBmb3IgY29udmVuaWVuY2UKICAgIG15ICRLZXkgICAgICAgICA9ICRQYXJhbXtLZXl9OwogICAgbXkgJFByZWZpeFN0YXJ0ID0gJEtleSAuICc6OlRpbWVTdGFydDo6JzsKICAgIG15ICRQcmVmaXhTdG9wICA9ICRLZXkgLiAnOjpUaW1lU3RvcDo6JzsKCiAgICAjIGdldCB0aW1lIHJlbGF0ZWQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICAkR2V0UGFyYW17JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIGZvciBteSAkVGltZVR5cGUgKCAkUHJlZml4U3RhcnQsICRQcmVmaXhTdG9wICkgewogICAgICAgIGZvciBteSAkUGFydCAocXcoIFllYXIgTW9udGggRGF5ICkpIHsKICAgICAgICAgICAgbXkgJFBhcmFtS2V5ID0gJFRpbWVUeXBlIC4gJFBhcnQ7CiAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtS2V5ICk7CgogICAgICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBvbiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgICBpZiAoJFBhcmFtVmFsKSB7CiAgICAgICAgICAgICAgICAkUGFyYW1WYWwgPX4gc3sgXEEgXHMrIH17fXhtczsKICAgICAgICAgICAgICAgICRQYXJhbVZhbCA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0b3JlIGluICVHZXRQYXJhbQogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtS2V5fSA9ICRQYXJhbVZhbDsKICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCBzZWxlY3Rpb24gZm9yIHRoZSBzdGFydCBhbmQgc3RvcCB0aW1lLgogICAgIyBOb3RlIHRoYXQgc2VhcmNoaW5nIGlzIGJ5IGRhdGUsIHdoaWxlIGlucHV0IGlzIGJ5IHRpbWUgYXMgd2VsbAogICAgbXkgJFRpbWVTdGFydFNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFByZWZpeFN0YXJ0LAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAxMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDEwLAogICAgICAgICVHZXRQYXJhbSwKICAgICk7CiAgICBteSAkVGltZVN0b3BTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBPcHRpb25hbCAgICAgICAgID0+IDAsCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUHJlZml4U3RvcCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlR2V0UGFyYW0sCiAgICApOwoKICAgIG15ICRDaGVja2VkICA9ICRHZXRQYXJhbXskS2V5fSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKICAgIG15ICRDaGVja2JveCA9IHFxezxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJEtleSIgdmFsdWU9ImNoZWNrZWQiICRDaGVja2VkLz59OwogICAgbXkgJEJldHdlZW4gID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0JldHdlZW4nKTsKICAgIG15ICRBbmQgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdhbmQnKTsKCiAgICByZXR1cm4gIiRDaGVja2JveCAkQmV0d2VlbiAkVGltZVN0YXJ0U2VsZWN0aW9uU3RyaW5nICRBbmQgJFRpbWVTdG9wU2VsZWN0aW9uU3RyaW5nIjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDEwLzAyLzE1IDE0OjA5OjM5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtLHYgMS45IDIwMTAvMDIvMTUgMTQ6MDk6MzkgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlVGltZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBkYXRldGltZSBvYmplY3RzLgoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMS0wMSAxMjowMCcsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte1ZhbHVlfSAuICc6MDAnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJERheSAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpEYXknICk7CiAgICBteSAkTW9udGggID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1vbnRoJyApOwogICAgbXkgJFllYXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwogICAgbXkgJEhvdXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpIb3VyJyApIHx8IDA7CiAgICBteSAkTWludXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1pbnV0ZScgKSB8fCAwOwoKICAgIGlmICggJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkICUwMmQ6JTAyZCcsICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlOwogICAgfQoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYgMTI6MDAnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVZhbHVlczsKICAgIGlmICggJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKCiAgICAgICAgaWYgKCAkVmFsdWUgPX4gL14oXGRcZFxkXGQpLShcZFxkfFxkKS0oXGRcZHxcZCkgKFxkXGR8XGQpOihcZFxkfFxkKSQvaSApIHsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpZZWFyJyB9ICAgPSAkMTsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpNb250aCcgfSAgPSAkMjsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpEYXknIH0gICAgPSAkMzsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpIb3VyJyB9ICAgPSAkNDsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpNaW51dGUnIH0gPSAkNTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFBhcmFte0tleX0gLiAnOjonLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRVc2VkICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwogICAgbXkgJFN0YXJ0RGF5ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpEYXknICk7CiAgICBteSAkU3RhcnRNb250aCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpUaW1lU3RhcnQ6Ok1vbnRoJyApOwogICAgbXkgJFN0YXJ0WWVhciAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0YXJ0OjpZZWFyJyApOwogICAgbXkgJFN0b3BEYXkgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6VGltZVN0b3A6OkRheScgKTsKICAgIG15ICRTdG9wTW9udGggID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpNb250aCcgKTsKICAgIG15ICRTdG9wWWVhciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlRpbWVTdG9wOjpZZWFyJyApOwoKICAgIGlmICgKICAgICAgICAkVXNlZAogICAgICAgICYmICRTdGFydERheSAmJiAkU3RhcnRNb250aCAmJiAkU3RhcnRZZWFyCiAgICAgICAgJiYgJFN0b3BEYXkgICYmICRTdG9wTW9udGggICYmICRTdG9wWWVhcgogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBhZGQgaG91ciwgbWludXRlcyBhbmQgc2Vjb25kcywKICAgICAgICAjIHNvIHRoYXQgdGhhdCB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGRheSBpcyBzZWxlY3RlZCBhcyB3ZWxsCiAgICAgICAgbXkgJFN0YXJ0RGF0ZSA9IHNwcmludGYgJyUwMmQtJTAyZC0lMDJkIDAwOjAwOjAwJywgJFN0YXJ0WWVhciwgJFN0YXJ0TW9udGgsICRTdGFydERheTsKICAgICAgICBteSAkU3RvcERhdGUgID0gc3ByaW50ZiAnJTAyZC0lMDJkLSUwMmQgMjM6NTk6NTknLCAkU3RvcFllYXIsICAkU3RvcE1vbnRoLCAgJFN0b3BEYXk7CgogICAgICAgIHJldHVybiB7ICctYmV0d2VlbicgPT4gWyAkU3RhcnREYXRlLCAkU3RvcERhdGUgXSB9OwogICAgfQoKICAgIHJldHVybiBbXTsgICAgIyBubyBjb25kaXRpb25zIGJ5IGRlZmF1bHQKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMganVzdCBmb3IgY29udmVuaWVuY2UKICAgIG15ICRLZXkgICAgICAgICA9ICRQYXJhbXtLZXl9OwogICAgbXkgJFByZWZpeFN0YXJ0ID0gJEtleSAuICc6OlRpbWVTdGFydDo6JzsKICAgIG15ICRQcmVmaXhTdG9wICA9ICRLZXkgLiAnOjpUaW1lU3RvcDo6JzsKCiAgICAjIGdldCB0aW1lIHJlbGF0ZWQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICAkR2V0UGFyYW17JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIGZvciBteSAkVGltZVR5cGUgKCAkUHJlZml4U3RhcnQsICRQcmVmaXhTdG9wICkgewogICAgICAgIGZvciBteSAkUGFydCAocXcoIFllYXIgTW9udGggRGF5ICkpIHsKICAgICAgICAgICAgbXkgJFBhcmFtS2V5ID0gJFRpbWVUeXBlIC4gJFBhcnQ7CiAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtS2V5ICk7CgogICAgICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBvbiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgICBpZiAoJFBhcmFtVmFsKSB7CiAgICAgICAgICAgICAgICAkUGFyYW1WYWwgPX4gc3sgXEEgXHMrIH17fXhtczsKICAgICAgICAgICAgICAgICRQYXJhbVZhbCA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0b3JlIGluICVHZXRQYXJhbQogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtS2V5fSA9ICRQYXJhbVZhbDsKICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCBzZWxlY3Rpb24gZm9yIHRoZSBzdGFydCBhbmQgc3RvcCB0aW1lLgogICAgbXkgJFRpbWVTdGFydFNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFByZWZpeFN0YXJ0LAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAxMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDEwLAogICAgICAgICVHZXRQYXJhbSwKICAgICk7CiAgICBteSAkVGltZVN0b3BTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBPcHRpb25hbCAgICAgICAgID0+IDAsCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUHJlZml4U3RvcCwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlR2V0UGFyYW0sCiAgICApOwoKICAgIG15ICRDaGVja2VkICA9ICRHZXRQYXJhbXskS2V5fSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKICAgIG15ICRDaGVja2JveCA9IHFxezxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJEtleSIgdmFsdWU9ImNoZWNrZWQiICRDaGVja2VkLz59OwogICAgbXkgJEJldHdlZW4gID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0JldHdlZW4nKTsKICAgIG15ICRBbmQgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdhbmQnKTsKCiAgICByZXR1cm4gIiRDaGVja2JveCAkQmV0d2VlbiAkVGltZVN0YXJ0U2VsZWN0aW9uU3RyaW5nICRBbmQgJFRpbWVTdG9wU2VsZWN0aW9uU3RyaW5nIjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDEwLzAyLzE1IDE0OjA5OjM5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtLHYgMS40IDIwMTAvMDIvMTUgMDg6NDI6MjkgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dER1bW15OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREdW1teSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBkdW1teSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RHVtbXktPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgcmV0dXJuICcmbmJzcDsnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgcmV0dXJuIHt9Owp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICByZXR1cm4gJyZuYnNwOyc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgcmV0dXJuIFtdOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgcmV0dXJuICcmbmJzcDsnOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMTAvMDIvMTUgMDg6NDI6MjkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMTAvMDIvMTAgMTY6NTM6NDcgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0R2VuZXJhbENhdGFsb2cgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ZhbHVlfSB8fD0gJyc7CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZhbHVlfSApOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU2VsZWN0ZWRJRCA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSB8fCAnJzsKCiAgICAjIHRyYW5zbGF0aW9uIG9uIG9yIG9mZgogICAgbXkgJFRyYW5zbGF0aW9uID0gMDsKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRUcmFuc2xhdGlvbiA9IDE7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmFuc2xhdGlvbiwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkSUQsCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlcyA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwoKICAgICMgdHJhbnNsYXRpb24gb24gb3Igb2ZmCiAgICBteSAkVHJhbnNsYXRpb24gPSAwOwogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFRyYW5zbGF0aW9uID0gMTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uID0+ICRUcmFuc2xhdGlvbiwKICAgICAgICBTZWxlY3RlZElEICA9PiAkVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDEwLzAyLzEwIDE2OjUzOjQ3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXIucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0SW50ZWdlci5wbSx2IDEuNyAyMDEwLzA0LzI3IDExOjIzOjEyIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRJbnRlZ2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRJbnRlZ2VyIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGludGVnZXIgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXItPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAnJzsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbWluLCBtYXggYW5kIGRlZmF1bHQKICAgIG15ICRWYWx1ZU1pbiA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWlufSB8fCAxOwogICAgbXkgJFZhbHVlTWF4ID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNYXh9IHx8IDE7CiAgICBpZiAoICRWYWx1ZU1pbiA+ICRWYWx1ZU1heCApIHsKICAgICAgICAkVmFsdWVNaW4gPSAkVmFsdWVNYXg7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fQogICAgICAgICYmICgKICAgICAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA8ICRWYWx1ZU1pbgogICAgICAgICAgICB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ID4gJFZhbHVlTWF4CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ID0gJyc7CiAgICB9CgogICAgIyBjcmVhdGUgZGF0YSBhcnJheQogICAgbXkgJEludGVnZXJMaXN0ID0gW107CiAgICBmb3IgbXkgJENvdW50ZXIgKCAkVmFsdWVNaW4gLi4gJFZhbHVlTWF4ICkgewogICAgICAgIHB1c2ggQHskSW50ZWdlckxpc3R9LCAkQ291bnRlcjsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbnRlZ2VyTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBtaW4sIG1heAogICAgbXkgJFZhbHVlTWluID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNaW59IHx8IDE7CiAgICBteSAkVmFsdWVNYXggPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1heH0gfHwgMTsKICAgIGlmICggJFZhbHVlTWluID4gJFZhbHVlTWF4ICkgewogICAgICAgICRWYWx1ZU1pbiA9ICRWYWx1ZU1heDsKICAgIH0KCiAgICAjIHNldCBwcmVzZWxlY3RlZCB2YWx1ZSwgZWl0aGVyIGZyb20gcHJldmlvdXMgc2VsZWN0aW9uIG9yIHRoZSBkZWZhdWx0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+U2VhcmNoRm9ybURhdGFHZXQoJVBhcmFtKTsKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwogICAgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKSB7CiAgICAgICAgJFZhbHVlID0gJyc7CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBwcmVzZWxlY3RlZCB2YWx1ZSBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlCiAgICBpZiAoIGRlZmluZWQgJFZhbHVlICYmICggJFZhbHVlIDwgJFZhbHVlTWluIHx8ICRWYWx1ZSA+ICRWYWx1ZU1heCApICkgewogICAgICAgICRWYWx1ZSA9ICcnOwogICAgfQoKICAgICMgY3JlYXRlIGRhdGEgYXJyYXkKICAgIG15IEBJbnRlZ2VyTGlzdCA9ICggJFZhbHVlTWluIC4uICRWYWx1ZU1heCApOwoKICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiBcQEludGVnZXJMaXN0LAogICAgICAgIE5hbWUgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17VmFsdWV9IHx8ICRWYWx1ZSB8fCAnJywKICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDEwLzA0LzI3IDExOjIzOjEyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHQucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0VGV4dC5wbSx2IDEuMTEgMjAxMC8wNS8xOCAxODoyMTowOSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAnJzsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgbXkgJExpbmtGZWF0dXJlICAgID0gMTsKICAgIG15ICRIVE1MUmVzdWx0TW9kZSA9IDE7CgogICAgIyBkbyBub3QgdHJhbnNmb3JtIGxpbmtzIGluIHByaW50IHZpZXcKICAgIGlmICggJFBhcmFte1ByaW50fSApIHsKICAgICAgICAkTGlua0ZlYXR1cmUgPSAwOwoKICAgICAgICAjIGRvIG5vdCBjb252ZXJ0IHdoaXRlc3BhY2UgYW5kIG5ld2xpbmVzIGluIFBERiBtb2RlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGJykgKSB7CiAgICAgICAgICAgICRIVE1MUmVzdWx0TW9kZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAkSFRNTFJlc3VsdE1vZGUsCiAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gJExpbmtGZWF0dXJlLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnOwogICAgfQogICAgbXkgJFNpemUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA0MDsKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIiRTaXplXCIgIjsKCiAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU3RyaW5nIC49ICJ2YWx1ZT1cIiRWYWx1ZVwiICI7CgogICAgIyBhZGQgbWF4aW11bSBsZW5ndGgKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofSApIHsKICAgICAgICAkU3RyaW5nIC49ICJtYXhsZW5ndGg9XCIkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9XCIgIjsKICAgIH0KCiAgICAkU3RyaW5nIC49ICI+ICI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwogICAgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKSB7CiAgICAgICAgJFZhbHVlID0gJyc7CiAgICB9CgogICAgbXkgJFN0cmluZyA9IHFxezxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSIkUGFyYW17S2V5fSIgdmFsdWU9IiRWYWx1ZSIgc2l6ZT0iNjAiPn07CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMTAvMDUvMTggMTg6MjE6MDkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtLHYgMS4xMCAyMDEwLzA1LzE4IDE4OjIxOjA5IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dEFyZWEgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGV4dGFyZWEgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAnJzsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgbXkgJExpbmtGZWF0dXJlICAgID0gMTsKICAgIG15ICRIVE1MUmVzdWx0TW9kZSA9IDE7CgogICAgIyBkbyBub3QgdHJhbnNmb3JtIGxpbmtzIGluIHByaW50IHZpZXcKICAgIGlmICggJFBhcmFte1ByaW50fSApIHsKICAgICAgICAkTGlua0ZlYXR1cmUgPSAwOwoKICAgICAgICAjIGRvIG5vdCBjb252ZXJ0IHdoaXRlc3BhY2UgYW5kIG5ld2xpbmVzIGluIFBERiBtb2RlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGJykgKSB7CiAgICAgICAgICAgICRIVE1MUmVzdWx0TW9kZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAkSFRNTFJlc3VsdE1vZGUsCiAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gJExpbmtGZWF0dXJlLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbHMgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDb2xzfSB8fCA1ODsKICAgIG15ICRSb3dzID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Um93c30gfHwgMTA7CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnOwogICAgfQoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgfQogICAgbXkgJFN0cmluZyA9ICI8dGV4dGFyZWEgbmFtZT1cIiRQYXJhbXtLZXl9XCIgY29scz1cIiRDb2xzXCIgcm93cz1cIiRSb3dzXCI+JFZhbHVlPC90ZXh0YXJlYT4iOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJFNlbGYtPlNlYXJjaEZvcm1EYXRhR2V0KCVQYXJhbSk7CiAgICBpZiAoICFkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAkVmFsdWUgPSAnJzsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gcXF7PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IiRQYXJhbXtLZXl9IiB2YWx1ZT0iJFZhbHVlIiBzaXplPSI2MCI+fTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTAgJCAkRGF0ZTogMjAxMC8wNS8xOCAxODoyMTowOSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtLHYgMS41IDIwMTAvMDIvMjUgMTI6NDI6NTEgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDb25maWdJdGVtT2JqZWN0IFVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDb25maWdJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBncmFudCBhY2Nlc3MgYnkgZGVmYXVsdAogICAgbXkgJEFjY2VzcyA9IDE7CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkQWN0aW9uID0gJFBhcmFte0NvbmZpZ30tPntBY3Rpb259OwogICAgaWYgKCAkQWN0aW9uIGVxICdBZ2VudExpbmtPYmplY3QnICkgewoKICAgICAgICAjIFRoZSBMaW5rLWxpbmsgaXMgYSBzcGVjaWFsIGNhc2UsIGFzIGl0IGlzIG5vdCBzcGVjaWZpYyB0byBJVFNNQ29uZmlnSXRlbS4KICAgICAgICAjIEFzIGEgd29ya2Fyb3VuZCB3ZSBoYXJkY29kZSB0aGF0IEFnZW50TGlua09iamVjdCBpcyB0cmVhdGVkIGxpa2UgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKICAgICAgICAkQWN0aW9uID0gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0JzsKICAgIH0KICAgIG15ICRHcm91cHNSbyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufS0+e0dyb3VwUm99IHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259LT57R3JvdXB9ICAgfHwgW107CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRBY3Rpb24gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgZGVueSBhY2Nlc3MgYnkgZGVmYXVsdCwgd2hlbiB0aGVyZSBhcmUgZ3JvdXBzIHRvIGNoZWNrCiAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICMgY2hlY2sgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlYWQgd3JpdGUgZ3JvdXBzCiAgICAgICAgUldHUk9VUDoKICAgICAgICBmb3IgbXkgJFJ3R3JvdXAgKCBAeyRHcm91cHNSd30gKSB7CgogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVWZXJzaW9ucy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnMucG0sdiAxLjQgMjAwOS8wOC8xOCAyMjoxODoxOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENvbmZpZ0l0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwogICAgaWYgKCAkUGFyYW17Q291bnRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KICAgIGlmICggJFBhcmFte1Nob3dWZXJzaW9uc30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdIaWRlIFZlcnNpb25zJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdIaWRlIFZlcnNpb25zJywKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7U2hvd1ZlcnNpb25zPTAnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1Nob3cgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Nob3cgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtTaG93VmVyc2lvbnM9MScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgSFRNTCBvdXRwdXQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSx2IDEuNyAyMDEwLzA0LzI3IDExOjIzOjEyIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWl0ZW0gSVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoKQoKcmV0dXJucyBhIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFByaW50ID0+IDEsICAgICAgICAjIChvcHRpb25hbCwgZGVmYXVsdCAwKQogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KCkKCnJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBodG1sIGZvcm0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KAogICAgICAgIEtleSAgICAgICAgICA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSAgICAgICAgID0+ICRJdGVtUmVmLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0gQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiB7fSBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoKQoKcmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIHNlYXJjaCBodG1sIGZvcm0KCiAgICBteSAkQXJyYXlSZWYgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1TZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gW10gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkVmFsdWVzOwp9Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbVNlYXJjaElucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBzZWFyY2ggaW5wdXQgZmllbGQgaHRtbCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIF9JVFNNTG9hZExheW91dEJhY2tlbmQoKQoKbG9hZCBhIGlucHV0IHR5cGUgYmFja2VuZCBtb2R1bGUKCiAgICAkQmFja2VuZE9iamVjdCA9ICRMYXlvdXRPYmplY3QtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgKTsKCj1jdXQKCnN1YiBfSVRTTUxvYWRMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0JFBhcmFte1R5cGV9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJEJhY2tlbmRPYmplY3Q7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0SVRTTUNvbmZpZ0l0ZW0ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExpbmtPYmplY3RJVFNNQ29uZmlnSXRlbS5wbSx2IDEuNyAyMDA5LzA1LzE4IDEwOjAwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNQ29uZmlnSXRlbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoY29uZmlnIGl0ZW0pCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBFbmNvZGVPYmplY3QKICAgICAgICBRdWV1ZU9iamVjdCBHcm91cE9iamVjdCBQYXJhbU9iamVjdCBUaW1lT2JqZWN0IExhbmd1YWdlT2JqZWN0IFVzZXJMYW5ndWFnZSBVc2VySUQpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBSZWFsbmFtZSA9PiAnQ29uZmlnSXRlbScsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICBAQmxvY2tEYXRhID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0ICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEJsb2NrbmFtZSA9PiAnQ29uZmlnSXRlbSBDb21wdXRlcicsCiAgICAgICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdDdXJJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAnMTIzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcxMjMnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPTEyMycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnVGhlIE5hbWUgb2YgdGhlIENvbmZpZyBJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0luIFJlcGFpcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnQ3VySW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJzIzNCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjM0JywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0yMzQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1RoZSBOYW1lIG9mIHRoZSBDb25maWcgSXRlbSAyMzQnLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnUHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDctMTEtMTEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGNsYXNzCiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgPSAkRGlyZWN0aW9uTGlzdC0+eyRDb25maWdJdGVtSUR9LT57Q2xhc3N9IHx8ICcnOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkQ2xhc3M7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRDbGFzc30tPnskQ29uZmlnSXRlbUlEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskQ29uZmlnSXRlbUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBAQmxvY2tEYXRhOwogICAgZm9yIG15ICRDbGFzcyAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rTGlzdCApIHsKCiAgICAgICAgIyBleHRyYWN0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbUxpc3QgPSAkTGlua0xpc3R7JENsYXNzfTsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdAogICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoCiAgICAgICAgICAgIHNvcnQgeyAkQ29uZmlnSXRlbUxpc3QtPnskYX0tPntEYXRhfS0+e05hbWV9IGNtcCAkQ29uZmlnSXRlbUxpc3QtPnskYn0tPntEYXRhfS0+e05hbWV9IH0KICAgICAgICAgICAga2V5cyAleyRDb25maWdJdGVtTGlzdH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB2ZXJzaW9uIGRhdGEKICAgICAgICAgICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbUxpc3QtPnskQ29uZmlnSXRlbUlEfS0+e0RhdGF9OwoKICAgICAgICAgICAgbXkgQEl0ZW1Db2x1bW5zID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0N1ckluY2lTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFZlcnNpb24tPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFZlcnNpb24tPntDdXJEZXBsU3RhdGV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVmVyc2lvbi0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgICAgICMgZGVmaW5lIHRoZSBibG9jayBkYXRhCiAgICAgICAgbXkgJUJsb2NrID0gKAogICAgICAgICAgICBPYmplY3QgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIEJsb2NrbmFtZSA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9IC4gJyAoJyAuICRDbGFzcyAuICcpJywKICAgICAgICAgICAgSGVhZGxpbmUgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NvbmZpZ0l0ZW0jJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0RlcGxveW1lbnQgU3RhdGUnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTMwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEl0ZW1MaXN0ID0+IFxASXRlbUxpc3QsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQmxvY2tEYXRhLCBcJUJsb2NrOwogICAgfQoKICAgIHJldHVybiBAQmxvY2tEYXRhOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSTo1NTU1NScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ29uZmlnSXRlbSMgNTU1NTU1OiBUaGUgY29uZmlnIGl0ZW0gbmFtZScsCiAgICAgICAgICAgICAgICAgICAgQ3NzICAgICA9PiAnc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NJOjIyMjIyJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDb25maWdJdGVtIyAyMjIyMjogVGl0bGUgb2YgY29uZmlnIG5hbWUgMjIyMjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0k6Nzc3NzcnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NvbmZpZ0l0ZW0jIDc3Nzc3OiBDb25maWdJdGVtIG5hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUxpbmtPdXRwdXREYXRhOwogICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJFZlcnNpb24gPSAkRGlyZWN0aW9uTGlzdC0+eyRDb25maWdJdGVtSUR9OwoKICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJUl0ZW0gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0k6JyAuICRWZXJzaW9uLT57TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb24tPntOdW1iZXJ9ICgkVmVyc2lvbi0+e0NsYXNzfSk6ICRWZXJzaW9uLT57TmFtZX0iLAogICAgICAgICAgICAgICAgICAgIExpbmsgID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFwlSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaXRlbSBsaXN0IHRvIGxpbmsgb3V0cHV0IGRhdGEKICAgICAgICAgICAgJExpbmtPdXRwdXREYXRheyAkTGlua1R5cGUgLiAnOjonIC4gJERpcmVjdGlvbiB9LT57SVRTTUNvbmZpZ0l0ZW19ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWl0ZW0gQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDb250ZW50RGF0YSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgcmV0dXJuIGlmICRDb250ZW50LT57VHlwZX0gbmUgJ0N1ckluY2lTaWduYWwnOwoKICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgdW5rbm93biAgICAgPT4gJ2dyYXlsZWQnLAogICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgKTsKCiAgICAjIGludmVzdGlnYXRlIGN1cnJlbnQgaW5jaWRlbnQgc2lnbmFsCiAgICAkQ29udGVudC0+e0N1ckluY2lTdGF0ZVR5cGV9IHx8PSAndW5rbm93bic7CiAgICBteSAkQ3VySW5jaVNpZ25hbCA9ICRJbmNpU2lnbmFsc3sgJENvbnRlbnQtPntDdXJJbmNpU3RhdGVUeXBlfSB9OwogICAgJEN1ckluY2lTaWduYWwgfHw9ICRJbmNpU2lnbmFsc3t1bmtub3dufTsKCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJzxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiAnCiAgICAgICAgICAgIC4gJ3RpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEN1ckluY2lTaWduYWwsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSA9PiAkQ29udGVudC0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWxlY3RhYmxlT2JqZWN0TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlbGVjdGFibGUgb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJy0nLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbTo6MjUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ29uZmlnSXRlbTo6Q29tcHV0ZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSVRTTUNvbmZpZ0l0ZW06OjI2JywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NvbmZpZ0l0ZW06OlNvZnR3YXJlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Db25maWdJdGVtOjoyNycsCiAgICAgICAgICAgIFZhbHVlID0+ICdDb25maWdJdGVtOjpOZXR3b3JrJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAkTGlua09iamVjdC0+U2VsZWN0YWJsZU9iamVjdExpc3QoCiAgICAgICAgU2VsZWN0ZWQgPT4gJElkZW50aWZpZXIsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgU2VsZWN0YWJsZU9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBoZWFkbGluZQogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAnLScsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfQogICAgKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdDsKICAgIHJldHVybiBpZiByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBnZXQgdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0IHN1Ym9iamVjdHMKICAgIG15ICREZWZhdWx0U3Vib2JqZWN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OkRlZmF1bHRTdWJPYmplY3QnKSB8fCB7fTsKCiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgbGMgJENsYXNzTGlzdC0+eyRhfSBjbXAgbGMgJENsYXNzTGlzdC0+eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgbXkgJENsYXNzID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSB8fCAnJzsKICAgICAgICBteSAkSWRlbnRpZmllciA9ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9IC4gJzo6JyAuICRDbGFzc0lEOwoKICAgICAgICAjIHNldCBzZWxlY3RlZCBmbGFnCiAgICAgICAgbXkgJFNlbGVjdGVkOwogICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSApIHsKCiAgICAgICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSBlcSAkSWRlbnRpZmllciApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFBhcmFte1NlbGVjdGVkfSBlcSAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fQogICAgICAgICAgICAgICAgJiYgJERlZmF1bHRTdWJvYmplY3QtPnsgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGRlZmF1bHQgY2xhc3MgbmFtZQogICAgICAgICAgICAgICAgbXkgJERlZmF1bHRDbGFzcyA9ICREZWZhdWx0U3Vib2JqZWN0LT57SVRTTUNvbmZpZ0l0ZW19IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgY2xhc3MKICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDbGFzcyBlcSAkQ2xhc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgcm93CiAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgS2V5ICAgICAgPT4gJElkZW50aWZpZXIsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0gLiAnOjonIC4gJENsYXNzLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0U2VsZWN0TGlzdCwgXCVSb3c7CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aXRlbSBTZWFyY2hPcHRpb25MaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VhcmNoIG9wdGlvbnMKClJldHVybgoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NvbmZpZ0l0ZW0jJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyMzQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnQmxhQmxhJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KAogICAgICAgIFN1Yk9iamVjdCA9PiAnMjUnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNlYXJjaCBvcHRpb24gbGlzdAogICAgbXkgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdOdW1iZXInLAogICAgICAgICAgICBOYW1lID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgVHlwZSA9PiAnTGlzdCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIE5hbWUgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgVHlwZSA9PiAnTGlzdCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgb2JqZWN0IGRlcGVuZGVuY2UgYXR0cmlidXRlcwogICAgI2lmICggJFBhcmFte1N1Yk9iamVjdH0gKSB7CiAgICAjCiAgICAjICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICMgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICMgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAjICAgICk7CiAgICAjCiAgICAjICAgIGlmICggJENsYXNzTGlzdCAmJiAkQ2xhc3NMaXN0IGVxICdIQVNIJyApIHsKICAgICMKICAgICMgICAgICAgICMgYWRkIGhlcmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJvYmplY3QhCiAgICAjICAgIH0KICAgICN9CgogICAgIyBhZGQgZm9ybWtleQogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CiAgICAgICAgJFJvdy0+e0Zvcm1LZXl9ID0gJ1NFQVJDSDo6JyAuICRSb3ctPntLZXl9OwogICAgfQoKICAgICMgYWRkIGZvcm0gZGF0YSBhbmQgaW5wdXQgc3RyaW5nCiAgICBST1c6CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKCiAgICAgICAgIyBwcmVwYXJlIHRleHQgaW5wdXQgZmllbGRzCiAgICAgICAgaWYgKCAkUm93LT57VHlwZX0gZXEgJ1RleHQnICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwoKICAgICAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5wdXRUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFJvdy0+e0Zvcm1EYXRhfSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xpbmtPYmplY3QnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBST1c7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgbGlzdCBib3hlcwogICAgICAgIGlmICggJFJvdy0+e1R5cGV9IGVxICdMaXN0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICBteSBARm9ybURhdGEgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gXEBGb3JtRGF0YTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgbXkgJUxpc3REYXRhOwogICAgICAgICAgICBpZiAoICRSb3ctPntLZXl9IGVxICdEZXBsU3RhdGVJRHMnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJERlcGxTdGF0ZUxpc3QgJiYgcmVmICREZXBsU3RhdGVMaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAlTGlzdERhdGEgPSAleyREZXBsU3RhdGVMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcmVwYXJlIGluY2lkZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57S2V5fSBlcSAnSW5jaVN0YXRlSURzJyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICAgICAgICAgICAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJEluY2lTdGF0ZUxpc3QgJiYgcmVmICRJbmNpU3RhdGVMaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAlTGlzdERhdGEgPSAleyRJbmNpU3RhdGVMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTGlzdERhdGEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFJvdy0+e0Zvcm1EYXRhfSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gMywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgUk9XOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAwOS8wNS8xOCAxMDowMDo1MyAkCgo9Y3V0Cg==
IyAtLQojIEFkbWluSVRTTUNvbmZpZ0l0ZW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbklUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Db25maWdJdGVtLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDb25maWcgSXRlbSBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uQ2hhbmdlIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UgRGVmaW5pdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkNoYW5nZSJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNjAlIj4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVmaW5pdGlvbkxpc3QmQ2xhc3NJRD0kUURhdGF7IkNsYXNzSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25MaXN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjUwJSI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmVyc2lvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25MaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVmaW5pdGlvblZpZXcmRGVmaW5pdGlvbklEPSRRRGF0YXsiRGVmaW5pdGlvbklEIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7IlZlcnNpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpEZWZpbml0aW9uTGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6RGVmaW5pdGlvbkxpc3QgLS0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25WaWV3IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlZpZXcifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmVyc2lvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVmVyc2lvbiJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9In0pPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVmaW5pdGlvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEZWZpbml0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25WaWV3IC0tPgo8IS0tIGR0bDpibG9jazpEZWZpbml0aW9uQ2hhbmdlIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uU2F2ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiRRRGF0YXsiQ2xhc3NJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEZWZpbml0aW9uIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iRGVmaW5pdGlvbiIgcm93cz0iNTAiIGNvbHM9IjgwIiB3cmFwPSJvZmYiPiRRRGF0YXsiRGVmaW5pdGlvbiJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25DaGFuZ2UgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtLmR0bCx2IDEuMyAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICRUZXh0eyJDb25maWcgSXRlbXMgc2hvd24ifTogJFFEYXRheyJSZXN1bHQifSAtCiAgICAgICRUZXh0eyJQYWdlIn06ICRRRGF0YXsiUGFnZU51bGwifQo8IS0tIGR0bDpibG9jazpQYWdlIC0tPgo8IS0tIGR0bDpibG9jazpQYWdlTm9ybWFsIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+JFFEYXRheyJQYWdlIn08L2E+CjwhLS0gZHRsOmJsb2NrOlBhZ2VOb3JtYWwgLS0+CjwhLS0gZHRsOmJsb2NrOlBhZ2VCb2xkIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+PGI+JFFEYXRheyJQYWdlIn08L2I+PC9hPgo8IS0tIGR0bDpibG9jazpQYWdlQm9sZCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFnZSAtLT4KICAgICAgLQogICAgICAkVGV4dHsiQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSJ9OiAkUURhdGF7IkNvbmZpZ0l0ZW1zQXZhaWwifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAkVGV4dHsiQ2xhc3MifToKPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDbGFzc0lEPSRRRGF0YXsiQ2xhc3NJRCJ9Ij4kUURhdGF7IkNsYXNzIn0gKCRRRGF0YXsiQ291bnQifSk8L2E+Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzc1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkN1ckluY2lTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSI+JFFEYXRheyJOdW1iZXIifTwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJOYW1lIiwiNDAifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiQ3VyRGVwbFN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzc1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPC90YWJsZT4=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtQWRkCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCIgbmFtZT0iY29uZmlnaXRlbWNsYXNzIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUmVkaXJlY3QiPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb25maWcgSXRlbSJ9ICRUZXh0eyJDbGFzcyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJDbGFzcyJ9OgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VsZWN0In0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCx2IDEuMyAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkVkaXQifTogJFRleHR7IkNvbmZpZyBJdGVtIn06ICRRRGF0YXsiTnVtYmVyIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSIgb25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWZXJzaW9uU2F2ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiRRRGF0YXsiQ2xhc3NJRCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb25maWdJdGVtSUQiIHZhbHVlPSIkUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTglIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTclIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjExJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvd05hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlRoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5hbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iTmFtZSIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iPgo8IS0tIGR0bDpibG9jazpSb3dOYW1lSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dOYW1lSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvd05hbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlJvd0RlcGxTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIxIiBjb2xvcj0iI0JCQkJCQiIgbm9zaGFkZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZXBsU3RhdGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6Um93RGVwbFN0YXRlSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dEZXBsU3RhdGVJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93RGVwbFN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpSb3dJbmNpU3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlRoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJJbmNpZGVudCBTdGF0ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbmNpU3RhdGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6Um93SW5jaVN0YXRlSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dJbmNpU3RhdGVJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93SW5jaVN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZVJ1bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlU3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlU3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+PGhyIHdpZHRoPSIxMDAlIiBzaXplPSIxIiBjb2xvcj0iI0JCQkJCQiIgbm9zaGFkZT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250Pgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJpbmcifQo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnRJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiSW52YWxpZCJ9IiBzaXplPSItMiI+KiZuYnNwOyRUZXh0eyJpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudEludmFsaWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudERlbGV0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJFFEYXRheyJJbnB1dEtleSJ9OjpEZWxldGUiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnREZWxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudERlbGV0ZUR1bW15IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50RGVsZXRlRHVtbXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGQgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZFJ1bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkUnVsZVNwYWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPiZuYnNwOzwvdGQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZFJ1bGVTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij48aHIgd2lkdGg9IjEwMCUiIHNpemU9IjEiIGNvbG9yPSIjQkJCQkJCIiBub3NoYWRlPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRSdWxlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRDb250ZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZENvbnRlbnRTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4mbmJzcDs8L3RkPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSIkUURhdGF7IklucHV0S2V5In06OkFkZCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkQ29udGVudCAtLT4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPjxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0U2F2ZSIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgaGlzdG9yeQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkuZHRsLHYgMS4yIDIwMDkvMDgvMjAgMTQ6MjU6MTkgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIHN0YXJ0IGZvcm0gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiSGlzdG9yeSBvZiJ9IENvbmZpZyBJdGVtOiAkRGF0YXsiTmFtZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JERhdGF7IkNvbmZpZ0l0ZW1JRCJ9JlZlcnNpb25JRD0kRGF0YXsiVmVyc2lvbklEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiQWN0aW9uIn06CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiQ29tbWVudCJ9OgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBXSURUSD0iNjAiIEFMSUdOPSJDRU5URVIiPgogICAgICAgICAgICAkVGV4dHsiWm9vbSJ9OgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IlVzZXIifToKICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJDcmVhdGV0aW1lIn06CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KIyBzaG91bGQgaSBzaG93ICB0aGUgem9vbSBsaW5rPwogICAgICAgIDxkdGwgc2V0ICREYXRheyJMaW5rIn0gPSAiIj4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiVmVyc2lvbklEIn0gbmUgIjAiKSB7ICREYXRheyJMaW5rIn0gPSAiJlZlcnNpb25JRD0kRGF0YXsiVmVyc2lvbklEIn0iOyB9PgogICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJjc3MifSI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRRdW90ZXsiJERhdGF7Ikhpc3RvcnlUeXBlIn0ifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDb21tZW50In0iPiRRRGF0YXsiQ29tbWVudCIsIjEwMCJ9PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJDRU5URVIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kRGF0YXsiQ29uZmlnSXRlbUlEIn0kRGF0YXsiTGluayJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiWm9vbSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+eDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9ICgkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSkifSI+CiAgICAgICAgICAgICRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIyMCJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+Cg==
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5kdGwgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5kdGwsdiAxLjIgMjAwOS8wNS8xOCAxMDowMToxOCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFRleHR7IkNvbmZpZ0l0ZW0ifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJDb25maWdJdGVtLUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2xhc3MifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb25maWdJdGVtIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkN1cnJlbnROYW1lIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDcmVhdGVCeVVzZXJMb2dpbiJ9ICgkUURhdGF7IkNyZWF0ZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ3JlYXRlQnlVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDdXJEZXBsU3RhdGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3VycmVudCBJbmNpZGVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2hhbmdlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDaGFuZ2VCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNoYW5nZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJMaW5rZWQtT2JqZWN0In06CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZSAtLT4KICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiJERhdGF7IkxpbmtUeXBlTmFtZSJ9In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICREYXRheyJMaW5rU3RyZyJ9PGJyPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZVJvdyAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlZlcnNpb24gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IlZlcnNpb24ifSZuYnNwOyRRRGF0YXsiVmVyc2lvbk51bWJlciJ9CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ3JlYXRlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDcmVhdGVCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNyZWF0ZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiRGVwbFN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmNpZGVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiSW5jaVN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgo8IS0tIGR0bDpibG9jazpWZXJzaW9uUm93TmFtZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dOYW1lUHJlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJOYW1lIn0ifTombmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dWYWx1ZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dWYWx1ZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0KICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvbiAtLT4K
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2guZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLmR0bCx2IDEuNSAyMDEwLzAyLzEwIDE1OjQ5OjIxIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6Q2xhc3MgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBuYW1lPSJjb25maWdpdGVtY2xhc3MiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQXR0cmlidXRlIj4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImNvbnRlbnZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0U2VsZWN0IiB2YWx1ZT0iJFRleHR7IlNlbGVjdCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNsYXNzIC0tPgo8IS0tIGR0bDpibG9jazpBdHRyaWJ1dGUgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkF0dHJpYnV0ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzc0lEIiB2YWx1ZT0iJERhdGF7IkNsYXNzSUQifSI+CiAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJjb250ZW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTnVtYmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJOdW1iZXIiIHZhbHVlPSIkUURhdGF7Ik51bWJlciJ9IiBzaXplPSI4MCIgbWF4bGVuZ3RoPSIyNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iY29udGVudmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik5hbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjUwIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkN1ckRlcGxTdGF0ZU9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSW5jaWRlbnQgU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkN1ckluY2lTdGF0ZU9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJJbnB1dFN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRyaWJ1dGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImNvbnRlbnZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdFNlYXJjaCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpBdHRyaWJ1dGUgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3VsdCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJPdmVydmlldyJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifSAkRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omhpc3RvcnkuYmFjaygpIj4KICAgICAgICAgICAgJFRleHR7IkNoYW5nZSBzZWFyY2ggb3B0aW9ucyJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgLSAkVGV4dHsiVG90YWwgaGl0cyJ9OiA8Yj4kRGF0YXsiVG90YWxIaXRzIn08L2I+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiQ2xhc3MifTogJFFEYXRheyJDbGFzcyJ9ICRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOdW1iZXIifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEZXBsb3ltZW50IFN0YXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgQ2hhbmdlIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0Um93IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0iPiRRRGF0YXsiTnVtYmVyIn08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSIsIjQwIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiQ3VyRGVwbFN0YXRlIn0ifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0Um93IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0IC0tPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCx2IDEuMyAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifSAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUFjdGl2ZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgdmFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkluY2lTaWduYWwifS1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDt8LS0mZ3Q7Jmd0OyZndDsmbmJzcDsKICAgICAgICAgICAgICAgICAgPGk+CiAgICAgICAgICAgICAgICAgIDxiPgogICAgICAgICAgICAgICAgICA8dT4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJDb3VudCJ9LgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JlZlcnNpb25JRD0kUURhdGF7IlZlcnNpb25JRCJ9JlNob3dWZXJzaW9ucz0kUURhdGF7IlNob3dWZXJzaW9ucyJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0gKCRUZXh0eyIkUURhdGF7IkRlcGxTdGF0ZSJ9In0pCiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIzMCJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMzAifSkgLSAkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgICAgICAgICAgPC91PgogICAgICAgICAgICAgICAgICA8L2I+CiAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQWN0aXZlIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUluYWN0aXZlIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiB2YWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiSW5jaVNpZ25hbCJ9LXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiSW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwO3wtLSZndDsmbmJzcDskUURhdGF7IkNvdW50In0uCiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0mVmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn0mU2hvd1ZlcnNpb25zPSRRRGF0YXsiU2hvd1ZlcnNpb25zIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifSAoJFRleHR7IiRRRGF0YXsiRGVwbFN0YXRlIn0ifSkKICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjMwIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIzMCJ9KSAtICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVUaW1lIn0ifQogICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1JbmFjdGl2ZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW0gLS0+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgIDxociBzaXplPSIyIj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkRhdGEgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjUlIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4KPCEtLSBkdGw6YmxvY2s6RGF0YU5hbWVQcmUgLS0+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwo8IS0tIGR0bDpibG9jazpEYXRhTmFtZVByZSAtLT4KICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTmFtZSJ9In06Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6RGF0YVZhbHVlUHJlIC0tPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6RGF0YVZhbHVlUHJlIC0tPgogICAgICAgICAgICAkRGF0YXsiVmFsdWUifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpEYXRhIC0tPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVDb21wbGV4IC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICREYXRheyJMaW5rVGFibGVTdHJnIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjUlIiB2YWxpZ249InRvcCIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZXRhIC0tPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkNsYXNzIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPiRRRGF0YXsiQ2xhc3MiLCIyNSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJOYW1lIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiTmFtZSJ9Ij4kUURhdGF7Ik5hbWUiLCIyNSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPiRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJEZXBsU3RhdGUifSJ9IiwiMjUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUifTogPC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0iLCIyNSJ9Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDcmVhdGVVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0gLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMjAgMjAxMC8wMy8wMiAxNDowOTo0OCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdyhtaW4pOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW0gLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIElUU01Db25maWdJdGVtCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgdG8gaW1wb3J0IGFuZCBleHBvcnQgSVRTTSBjb25maWcgaXRlbXMuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGEgcmVmIHRvIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcwoKICAgIG15ICRBdHRyaWJ1dGVzID0gJE9iamVjdEJhY2tlbmQtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApIHx8IHt9OwoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBOYW1lICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvdW50TWF4JywKICAgICAgICAgICAgTmFtZSAgPT4gJ01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnMTAnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZWdleCAgICAgICAgPT4gcXJ7IFxBIFxkKyBceiB9eG1zLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiA1LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIG1hcHBpbmcgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YTsKICAgIHJldHVybiBbXSBpZiByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YS0+e0NsYXNzSUR9OwoKICAgICMgZ2V0IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb247CiAgICByZXR1cm4gW10gaWYgcmVmICRYTUxEZWZpbml0aW9uIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSBuZSAnQVJSQVknOwoKICAgIG15ICRFbGVtZW50TGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAnTnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ05hbWUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnTmFtZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHhtbCBlbGVtZW50cwogICAgJFNlbGYtPl9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgRWxlbWVudExpc3QgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgQ291bnRNYXhMaW1pdCA9PiAkT2JqZWN0RGF0YS0+e0NvdW50TWF4fSB8fCAxMCwKICAgICk7CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnS2V5JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0tleScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBTZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgc2VhcmNoIG9iamVjdCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVMaXN0ID0gJE9iamVjdEJhY2tlbmQtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YTsKICAgIHJldHVybiBbXSBpZiByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YS0+e0NsYXNzSUR9OwoKICAgICMgZ2V0IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb247CiAgICByZXR1cm4gW10gaWYgcmVmICRYTUxEZWZpbml0aW9uIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSBuZSAnQVJSQVknOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApIHx8IHt9OwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICkgfHwge307CgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gODAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjU1LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTmFtZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdOYW1lJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyNTUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJbmNpU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHhtbCBhdHRyaWJ1dGVzCiAgICAkU2VsZi0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIEF0dHJpYnV0ZUxpc3QgPT4gJEF0dHJpYnV0ZUxpc3QsCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlTGlzdDsKfQoKPWl0ZW0gRXhwb3J0RGF0YUdldCgpCgpnZXQgZXhwb3J0IGRhdGEgYXMgMkQtYXJyYXktaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDbGFzc0xpc3QgfHwgcmVmICRDbGFzc0xpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGNsYXNzIGlkCiAgICBpZiAoICEkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IHx8ICEkQ2xhc3NMaXN0LT57ICRPYmplY3REYXRhLT57Q2xhc3NJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBjbGFzcyBpZCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIG1hcHBpbmcgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBtYXBwaW5nIGxpc3QKICAgIGlmICggISRNYXBwaW5nTGlzdCB8fCByZWYgJE1hcHBpbmdMaXN0IG5lICdBUlJBWScgfHwgIUB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgaWYgKCAhJE1hcHBpbmdPYmplY3REYXRhIHx8IHJlZiAkTWFwcGluZ09iamVjdERhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQE1hcHBpbmdPYmplY3RMaXN0LCAkTWFwcGluZ09iamVjdERhdGE7CiAgICB9CgogICAgIyBnZXQgc2VhcmNoIGRhdGEKICAgIG15ICRTZWFyY2hEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFNlYXJjaERhdGEgfHwgcmVmICRTZWFyY2hEYXRhIG5lICdIQVNIJzsKCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJERlcGxTdGF0ZUxpc3QgfHwgcmVmICREZXBsU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBnZXQgdGhlIGdlbmVyYWwgY2F0YWxvZyBsaXN0IElUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyBjaGVjayBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdCB8fCByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZ2VuZXJhbCBjYXRhbG9nIGxpc3QgSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGN1cnJlbnQgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzCiAgICBteSAkRGVmaW5pdGlvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoUGFyYW1zOwoKICAgICMgYWRkIG51bWJlciB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgaWYgKCAkU2VhcmNoRGF0YS0+e051bWJlcn0gKSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tOdW1iZXJ9ID0gZGVsZXRlICRTZWFyY2hEYXRhLT57TnVtYmVyfTsKICAgIH0KCiAgICAjIGFkZCBuYW1lIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tOYW1lfSA9IGRlbGV0ZSAkU2VhcmNoRGF0YS0+e05hbWV9OwogICAgfQoKICAgICMgYWRkIGRlcGxveW1lbnQgc3RhdGUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIGlmICggJFNlYXJjaERhdGEtPntEZXBsU3RhdGVJRHN9ICkgewogICAgICAgIG15IEBEZXBsU3RhdGVJRHMgPSBzcGxpdCAnIyMjIyMnLCAkU2VhcmNoRGF0YS0+e0RlcGxTdGF0ZUlEc307CiAgICAgICAgJFNlYXJjaFBhcmFtc3tEZXBsU3RhdGVJRHN9ID0gXEBEZXBsU3RhdGVJRHM7CiAgICAgICAgZGVsZXRlICRTZWFyY2hEYXRhLT57RGVwbFN0YXRlSURzfTsKICAgIH0KCiAgICAjIGFkZCBpbmNpZGVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgaWYgKCAkU2VhcmNoRGF0YS0+e0luY2lTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQEluY2lTdGF0ZUlEcyA9IHNwbGl0ICcjIyMjIycsICRTZWFyY2hEYXRhLT57SW5jaVN0YXRlSURzfTsKICAgICAgICAkU2VhcmNoUGFyYW1ze0luY2lTdGF0ZUlEc30gPSBcQEluY2lTdGF0ZUlEczsKICAgICAgICBkZWxldGUgJFNlYXJjaERhdGEtPntJbmNpU3RhdGVJRHN9OwogICAgfQoKICAgICMgYWRkIGFsbCBYTUwgZGF0YSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgbXkgQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAkU2VsZi0+X0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgV2hhdCAgICAgICAgICA9PiBcQFNlYXJjaFBhcmFtc1doYXQsCiAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkU2VhcmNoRGF0YSwKICAgICk7CgogICAgIyBhZGQgWE1MIHNlYXJjaCBwYXJhbXMgdG8gdGhlIHNlYXJjaCBoYXNoCiAgICBpZiAoQFNlYXJjaFBhcmFtc1doYXQpIHsKICAgICAgICAkU2VhcmNoUGFyYW1ze1doYXR9ID0gXEBTZWFyY2hQYXJhbXNXaGF0OwogICAgfQoKICAgICMgc2VhcmNoIHRoZSBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAlU2VhcmNoUGFyYW1zLAogICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRPYmplY3REYXRhLT57Q2xhc3NJRH0gXSwKICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBFeHBvcnREYXRhOwogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRDb25maWdJdGVtTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbgogICAgICAgIG15ICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkVmVyc2lvbkRhdGE7CiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgcmVmICRWZXJzaW9uRGF0YSBuZSAnSEFTSCc7CgogICAgICAgICMgdHJhbnNsYXRlIHhtbGRhdGEgdG8gYSAyZCBoYXNoCiAgICAgICAgbXkgJVhNTERhdGEyRDsKICAgICAgICAkU2VsZi0+X0V4cG9ydFhNTERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+IFwlWE1MRGF0YTJELAogICAgICAgICk7CgogICAgICAgICMgYWRkIGRhdGEgdG8gdGhlIGV4cG9ydCBkYXRhIGFycmF5CiAgICAgICAgbXkgQEl0ZW07CiAgICAgICAgTUFQUElOR09CSkVDVDoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3QgKEBNYXBwaW5nT2JqZWN0TGlzdCkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGtleQogICAgICAgICAgICBteSAkS2V5ID0gJE1hcHBpbmdPYmplY3QtPntLZXl9OwoKICAgICAgICAgICAgIyBoYW5kbGUgZW1wdHkga2V5CiAgICAgICAgICAgIGlmICggISRLZXkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAnJzsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnTnVtYmVyJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICRWZXJzaW9uRGF0YS0+e051bWJlcn07CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGN1cnJlbnQgY29uZmlnIGl0ZW0gbmFtZQogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ05hbWUnICkgewogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJFZlcnNpb25EYXRhLT57TmFtZX07CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGVsIGRlcGxveW1lbnQgc3RhdGUKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdEZXBsU3RhdGUnICkgewogICAgICAgICAgICAgICAgJFZlcnNpb25EYXRhLT57RGVwbFN0YXRlSUR9IHx8PSAnRFVNTVknOwogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJERlcGxTdGF0ZUxpc3QtPnsgJFZlcnNpb25EYXRhLT57RGVwbFN0YXRlSUR9IH07CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGVsIGluY2lkZW50IHN0YXRlCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnSW5jaVN0YXRlJyApIHsKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0luY2lTdGF0ZUlEfSB8fD0gJ0RVTU1ZJzsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICRJbmNpU3RhdGVMaXN0LT57ICRWZXJzaW9uRGF0YS0+e0luY2lTdGF0ZUlEfSB9OwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBhbGwgWE1MIGRhdGEgZWxlbWVudHMKICAgICAgICAgICAgcHVzaCBASXRlbSwgJFhNTERhdGEyRHskS2V5fTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEV4cG9ydERhdGEsIFxASXRlbTsKICAgIH0KCiAgICByZXR1cm4gXEBFeHBvcnREYXRhOwp9Cgo9aXRlbSBJbXBvcnREYXRhU2F2ZSgpCgppbXBvcnRzIGEgc2luZ2xlIGVudGl0eSBvZiB0aGUgaW1wb3J0IGRhdGEuIFRoZSBDPFRlbXBsYXRlSUQ+IHBvaW50cyB0byB0aGUgZGVmaW5pdGlvbgpvZiB0aGUgY3VycmVudCBpbXBvcnQuIEM8SW1wb3J0RGF0YVJvdz4gaG9sZHMgdGhlIGRhdGEuIEM8Q291bnRlcj4gaXMgb25seSB1c2VkIGluCmVycm9yIG1lc3NhZ2VzLCBmb3IgaW5kaWNhdGluZyB3aGljaCBpdGVtIHdhcyBub3QgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5LgoKVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgY29uZmlnIGl0ZW0gd2lsbCBuZXZlciBiZSBkZWxldGVkLiBXaGVuIHRoZXJlIGFyZSBubwpjaGFuZ2VzIGluIHRoZSBkYXRhLCB0aGUgaW1wb3J0IHdpbGwgYmUgc2tpcHBlZC4gV2hlbiB0aGVyZSBpcyBuZXcgb3IgY2hhbmdlZCBkYXRlLAp0aGUgYSBuZXcgY29uZmlnIGl0ZW0gb3IgYSBuZXcgdmVyc2lvbiBpcyBjcmVhdGVkLgoKSW4gdGhlIGNhc2Ugb2YgY2hhbmdlZCBkYXRhLCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGNvbmZpZyBpdGVtIHdpbGwgY29udGFpbiB0aGUKYXR0cmlidXRlcyBvZiB0aGUgQzxJbXBvcnREYXRhUm93PiBwbHVzIHRoZSBvbGQgYXR0cmlidXRlcyB0aGF0IGFyZQpub3QgcGFydCBvZiB0aGUgaW1wb3J0IGRlZmluaXRpb24uClRodXMgSW1wb3J0RGF0YVNhdmUoKSBndWFyYW50ZWVzIHRvIG5vdCBvdmVyd3JpdGUgdW5kZWNsYXJlZCBhdHRyaWJ1dGVzLgoKVGhlIGJlaGF2aW9yIHdoZW4gaW1wb3J0ZWQgYXR0cmlidXRlcyBhcmUgZW1wdHkgZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBpbiB0aGUgb2JqZWN0IGRhdGEuCldoZW4gQzxFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzPiBpcyBub3Qgc2V0LCB0aGVuIGVtcHR5IHZhbHVlcyB3aWxsIHdpcGUgb3V0CnRoZSBvbGQgZGF0YS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gV2hlbiBDPEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXM+IGlzIHNldCwKdGhlbiBlbXB0eSB2YWx1ZXMgd2lsbCBsZWF2ZSB0aGUgb2xkIHZhbHVlcy4KClRoZSBkZWNpc2lvbiB3aGF0IGNvbnN0aXR1dGUgYW4gZW1wdHkgdmFsdWUgaXMgYSBiaXQgaGFpcnkuCkhlcmUgYXJlIHRoZSBydWxlcy4KRmllbGRzIHRoYXQgYXJlIG5vdCBldmVuIG1lbnRpb25lZCBpbiB0aGUgSW1wb3J0IGRlZmluaXRpb24gYXJlIGVtcHR5LiBUaGVzZSBhcmUgdGhlICdub3QgZGVmaW5lZCcgZmllbGRzLgpFbXB0eSBzdHJpbmdzIGFuZCB1bmRlZmluZWQgdmFsdWVzIGNvbnN0aXR1dGUgZW1wdHkgZmllbGRzLgpGaWVsZHMgd2l0aCB3aXRoIG9ubHkgb25lIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBub3QgZW1wdHkuCkZpZWxkcyB3aXRoIHRoZSBkaWdpdCAnMCcgYXJlIG5vdCBlbXB0eS4KCiAgICBteSAoICRDb25maWdJdGVtSUQsICRSZXRDb2RlICkgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAkQXJyYXlSZWYsCiAgICAgICAgQ291bnRlciAgICAgICA9PiAzNjcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCkFuIGVtcHR5IEM8Q29uZmlnSXRlbUlEPiBpbmRpY2F0ZXMgZmFpbHVyZS4gT3RoZXJ3aXNlIGl0IGluZGljYXRlcyB0aGUKbG9jYXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEuCkM8UmV0Q29kZT4gaXMgZWl0aGVyICdDcmVhdGVkJywgJ1VwZGF0ZWQnIG9yICdTa2lwcGVkJy4gJ0NyZWF0ZWQnIG1lYW5zIHRoYXQgYSBuZXcKY29uZmlnIGl0ZW0gaGFzIGJlZW4gY3JlYXRlZC4gJ1VwZGF0ZWQnIG1lYW5zIHRoYXQgYSBuZXcgdmVyc2lvbiBoYXMgYmVlbiBhZGRlZCB0bwphbiBleGlzdGluZyBjb25maWcgaXRlbS4gJ1NraXBwZWQnIG1lYW5zIHRoYXQgbm8gbmV3IHZlcnNpb24gaGFzIGJlZW4gY3JlYXRlZCwKYXMgdGhlIG5ldyBkYXRhIGlzIGlkZW50aWNhbCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0uCgpObyBjb2RlcyBoYXZlIHlldCBiZWVuIGRlZmluZWQgZm9yIHRoZSBmYWlsdXJlIGNhc2UuCgo9Y3V0CgpzdWIgSW1wb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBJbXBvcnREYXRhUm93IENvdW50ZXIgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGltcG9ydCBkYXRhIHJvdwogICAgaWYgKCByZWYgJFBhcmFte0ltcG9ydERhdGFSb3d9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiSW1wb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAnJFBhcmFte1RlbXBsYXRlSUR9JyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgbXkgJEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPSAkT2JqZWN0RGF0YS0+e0VtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXN9OwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBjaGVjayBjbGFzcyBsaXN0CiAgICBpZiAoICEkQ2xhc3NMaXN0IHx8IHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAuICJDYW4ndCBnZXQgdGhlIGdlbmVyYWwgY2F0YWxvZyBsaXN0IElUU006OkNvbmZpZ0l0ZW06OkNsYXNzIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJE9iamVjdERhdGEtPntDbGFzc0lEfSB8fCAhJENsYXNzTGlzdC0+eyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIk5vIGNsYXNzIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJyRQYXJhbXtUZW1wbGF0ZUlEfSciLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICckUGFyYW17VGVtcGxhdGVJRH0nIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICggISRNYXBwaW5nT2JqZWN0RGF0YSB8fCByZWYgJE1hcHBpbmdPYmplY3REYXRhIG5lICdIQVNIJyApIHsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgICAgICAuICJObyBtYXBwaW5nIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgbWFwcGluZyBpZCAnJE1hcHBpbmdJRCciLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBNYXBwaW5nT2JqZWN0TGlzdCwgJE1hcHBpbmdPYmplY3REYXRhOwogICAgfQoKICAgICMgY2hlY2sgYW5kIHJlbWVtYmVyIHRoZSBJZGVudGlmaWVycwogICAgIyB0aGUgSWRlbnRpZmllcnMgaWRlbnRpZnkgdGhlIGNvbmZpZyBpdGVtIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15ICVJZGVudGlmaWVyOwogICAgbXkgJFJvd0luZGV4ID0gMDsKICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEEgaWYgISRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9OwoKICAgICAgICAjIGNoZWNrIGlmIGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoICRJZGVudGlmaWVyeyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgLiAiJyRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0nIGhhcyBiZWVuIHVzZWQgbXVsdGlwbGUgdGltZXMgYXMgYW4gaWRlbnRpZmllciIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGlkZW50aWZpZXIgdmFsdWUKICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJFJvd0luZGV4XTsKCiAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUREFUQSBpZiAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9ICYmICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRSb3dJbmRleF07CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIklkZW50aWZpZXIgZmllbGQgaXMgZW1wdHkiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkUm93SW5kZXgrKzsKICAgIH0KCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJERlcGxTdGF0ZUxpc3QgfHwgcmVmICREZXBsU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldmVyc2UgdGhlIGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJURlcGxTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyREZXBsU3RhdGVMaXN0fTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJEluY2lTdGF0ZUxpc3QgfHwgcmVmICRJbmNpU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgLiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldmVyc2UgdGhlIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICVJbmNpU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW5jaVN0YXRlTGlzdH07CgogICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uIG9mIHRoaXMgY2xhc3MKICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZGVmaW5pdGlvbiBkYXRhCiAgICBpZiAoICEkRGVmaW5pdGlvbkRhdGEgfHwgcmVmICREZWZpbml0aW9uRGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIkNhbid0IGdldCB0aGUgZGVmaW5pdGlvbiBvZiBjbGFzcyBpZCAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHRyeSB0byBnZXQgY29uZmlnIGl0ZW0gaWRzLCB3aGVuIHRoZXJlIGFyZSBpZGVudGlmaWVycwogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIGlmICglSWRlbnRpZmllcikgewoKICAgICAgICBteSAlU2VhcmNoUGFyYW1zOwoKICAgICAgICAjIGFkZCBudW1iZXIgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBpZiAoICRJZGVudGlmaWVye051bWJlcn0gKSB7CiAgICAgICAgICAgICRTZWFyY2hQYXJhbXN7TnVtYmVyfSA9IGRlbGV0ZSAkSWRlbnRpZmllcntOdW1iZXJ9OwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbmFtZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7TmFtZX0gKSB7CiAgICAgICAgICAgICRTZWFyY2hQYXJhbXN7TmFtZX0gPSBkZWxldGUgJElkZW50aWZpZXJ7TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBkZXBsb3ltZW50IHN0YXRlIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntEZXBsU3RhdGV9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRlcGxveW1lbnQgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJERlcGxTdGF0ZUxpc3RSZXZlcnNleyAkSWRlbnRpZmllcntEZXBsU3RhdGV9IH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAuICJUaGUgZGVwbG95bWVudCBzdGF0ZSAnJElkZW50aWZpZXJ7RGVwbFN0YXRlfScgaXMgaW52YWxpZCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0RlcGxTdGF0ZUlEc30gPSBbJERlcGxTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0RlcGxTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbmNpZGVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7SW5jaVN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBpbmNpZGVudCBzdGF0ZSBpZAogICAgICAgICAgICBteSAkSW5jaVN0YXRlSUQgPSAkSW5jaVN0YXRlTGlzdFJldmVyc2V7ICRJZGVudGlmaWVye0luY2lTdGF0ZX0gfSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggISRJbmNpU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlRoZSBpbmNpZGVudCBzdGF0ZSAnJElkZW50aWZpZXJ7SW5jaVN0YXRlfScgaXMgaW52YWxpZCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0luY2lTdGF0ZUlEc30gPSBbJEluY2lTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0luY2lTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgWE1MIGRhdGEgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBteSBAU2VhcmNoUGFyYW1zV2hhdDsKICAgICAgICAkU2VsZi0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+IFxAU2VhcmNoUGFyYW1zV2hhdCwKICAgICAgICAgICAgSWRlbnRpZmllciAgICA9PiBcJUlkZW50aWZpZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgWE1MIHNlYXJjaCBwYXJhbXMgdG8gdGhlIHNlYXJjaCBoYXNoCiAgICAgICAgaWYgKEBTZWFyY2hQYXJhbXNXaGF0KSB7CiAgICAgICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gPSBcQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNlYXJjaCBleGlzdGluZyBjb25maWcgaXRlbSB3aXRoIHRoZSBzYW1lIGlkZW50aWZpZXJzCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICAgICAlU2VhcmNoUGFyYW1zLAogICAgICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAwLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggc2NhbGFyIEB7JENvbmZpZ0l0ZW1MaXN0fSA+IDEgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgLiAiSWRlbnRpZmllciBmaWVsZHMgTk9UIHVuaXF1ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1MaXN0LT5bMF07CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbiBkYXRhIG9mIHRoZSBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb25EYXRhID0ge307CiAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewoKICAgICAgICAjIGdldCBsYXRlc3QgdmVyc2lvbgogICAgICAgICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIGVtcHR5IHhtbCBkYXRhCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFZlcnNpb25EYXRhLT57WE1MRGF0YX0KICAgICAgICAgICAgfHwgcmVmICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9IG5lICdBUlJBWScKICAgICAgICAgICAgfHwgIUB7ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgZGVsZXRlICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCB1cCBmaWVsZHMgaW4gVmVyc2lvbkRhdGEgYW5kIGluIHRoZSBYTUwgYXR0cmlidXRlcwogICAgbXkgJVhNTERhdGEyRDsKICAgICRSb3dJbmRleCA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhIChATWFwcGluZ09iamVjdExpc3QpIHsKCiAgICAgICAgIyBqdXN0IGZvciBjb252ZW5pZW5jZQogICAgICAgIG15ICRLZXkgICA9ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX07CiAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bICRSb3dJbmRleCsrIF07CgogICAgICAgIGlmICggJEtleSBlcSAnTnVtYmVyJyApIHsKCiAgICAgICAgICAgICMgZG8gbm90aGluZwogICAgICAgICAgICAjIEltcG9ydCBkb2VzIG5vdCBvdmVycmlkZSB0aGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEtleSBlcSAnTmFtZScgKSB7CgogICAgICAgICAgICBpZiAoICRFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzICYmICggIWRlZmluZWQgJFZhbHVlIHx8ICRWYWx1ZSBlcSAnJyApICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZywga2VlcCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVGhlIG5hbWUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+eyRLZXl9ID0gJFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEtleSBlcSAnRGVwbFN0YXRlJyApIHsKCiAgICAgICAgICAgIGlmICggJEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgJiYgKCAhZGVmaW5lZCAkVmFsdWUgfHwgJFZhbHVlIGVxICcnICkgKSB7CgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nLCBrZWVwIHRoZSBvbGQgdmFsdWUKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGVwbG95bWVudCBzdGF0ZSBpZAogICAgICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJERlcGxTdGF0ZUxpc3RSZXZlcnNleyRWYWx1ZX0gfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVGhlIGRlcGxveW1lbnQgc3RhdGUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSA9ICREZXBsU3RhdGVJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRLZXkgZXEgJ0luY2lTdGF0ZScgKSB7CgogICAgICAgICAgICBpZiAoICRFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzICYmICggIWRlZmluZWQgJFZhbHVlIHx8ICRWYWx1ZSBlcSAnJyApICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZywga2VlcCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICAgICAgICAgICAgICBteSAkSW5jaVN0YXRlSUQgPSAkSW5jaVN0YXRlTGlzdFJldmVyc2V7JFZhbHVlfSB8fCAnJzsKICAgICAgICAgICAgICAgIGlmICggISRJbmNpU3RhdGVJRCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBlbnRpdHkgJFBhcmFte0NvdW50ZXJ9OiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJUaGUgaW5jaWRlbnQgc3RhdGUgJyRWYWx1ZScgaXMgaW52YWxpZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0luY2lTdGF0ZUlEfSA9ICRJbmNpU3RhdGVJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgaGFuZGxlIHhtbCBkYXRhCiAgICAgICAgICAgICRYTUxEYXRhMkR7JEtleX0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHVwIGVtcHR5IGNvbnRhaW5lciwgaW4gY2FzZSB0aGVyZSBpcyBubyBwcmV2aW91cyBkYXRhCiAgICAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSB8fD0ge307CgogICAgIyBFZGl0IFhNTERhdGFQcmV2LCBzbyB0aGF0IHRoZSB2YWx1ZXMgaW4gWE1MRGF0YTJEIHRha2UgcHJlY2VkZW5jZS4KICAgIG15ICRNZXJnZU9rID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhTWVyZ2UoCiAgICAgICAgWE1MRGVmaW5pdGlvbiAgICAgICAgICAgICAgICA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBYTUxEYXRhUHJldiAgICAgICAgICAgICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgIFhNTERhdGEyRCAgICAgICAgICAgICAgICAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAkRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcywKICAgICk7CgogICAgIyBiYWlsIG91dCwgd2hlbiB0aGUgd2FzIGEgcHJvYmxlbSBpbiBfSW1wb3J0WE1MRGF0YU1lcmdlKCkKICAgIGlmICggISRNZXJnZU9rICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgICAgIC4gIkNvdWxkIG5vdCBwcmVwYXJlIHRoZSBpbnB1dCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRSZXRDb2RlID0gJENvbmZpZ0l0ZW1JRCA/ICdDaGFuZ2VkJyA6ICdDcmVhdGVkJzsKICAgIG15ICRMYXRlc3RWZXJzaW9uSUQgPSAwOwogICAgaWYgKCRDb25maWdJdGVtSUQpIHsKCiAgICAgICAgIyB0aGUgc3BlY2lmaWVkIGNvbmZpZyBpdGVtIGFscmVhZHkgZXhpc3RzCiAgICAgICAgIyBnZXQgaWQgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uLCBmb3IgY2hlY2tpbmcgbGF0ZXIgd2hldGhlciBhIHZlcnNpb24gd2FzIGNyZWF0ZWQKICAgICAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKSB8fCBbXTsKICAgICAgICBpZiAoIHNjYWxhciBAeyRWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgICAgICRMYXRlc3RWZXJzaW9uSUQgPSAkVmVyc2lvbkxpc3QtPlstMV07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gY29uZmlnIGl0ZW0gd2FzIGZvdW5kLCBzbyBhZGQgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRoZSBuZXcgY29uZmlnIGl0ZW0gaWQKICAgICAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgZW50aXR5ICRQYXJhbXtDb3VudGVyfTogIgogICAgICAgICAgICAgICAgICAgIC4gIkVycm9yIHdoZW4gYWRkaW5nIHRoZSBuZXcgY29uZmlnIGl0ZW0uIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBuZXcgdmVyc2lvbgogICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e05hbWV9LAogICAgICAgIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkVmVyc2lvbkRhdGEtPntEZXBsU3RhdGVJRH0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRWZXJzaW9uRGF0YS0+e0luY2lTdGF0ZUlEfSwKICAgICAgICBYTUxEYXRhICAgICAgPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHRoZSBpbXBvcnQgd2FzIHN1Y2Nlc3NmdWwsIHdoZW4gd2UgZ2V0IGEgdmVyc2lvbiBpZAogICAgaWYgKCRWZXJzaW9uSUQpIHsKCiAgICAgICAgIyBXaGVuIFZlcnNpb25BZGQoKSByZXR1cm5zIHRoZSBwcmV2aW91cyBsYXRlc3QgdmVyc2lvbiBJRCwgd2Uga25vdyB0aGF0CiAgICAgICAgIyBubyBuZXcgdmVyc2lvbiBoYXMgYmVlbiBhZGRlZC4KICAgICAgICAjIFRoZSBpbXBvcnQgb2YgdGhpcyBjb25maWcgaXRlbSBoYXMgYmVlbiBza2lwcGVkLgogICAgICAgIGlmICggJExhdGVzdFZlcnNpb25JRCAmJiAkVmVyc2lvbklEID09ICRMYXRlc3RWZXJzaW9uSUQgKSB7CiAgICAgICAgICAgICRSZXRDb2RlID0gJ1NraXBwZWQnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRDb25maWdJdGVtSUQsICRSZXRDb2RlOwogICAgfQoKICAgIGlmICggJFJldENvZGUgZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAjIGRlbGV0ZSB0aGUgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAiQ2FuJ3QgaW1wb3J0IGVudGl0eSAkUGFyYW17Q291bnRlcn06ICIKICAgICAgICAgICAgLiAiRXJyb3Igd2hlbiBhZGRpbmcgdGhlIG5ldyBjb25maWcgaXRlbSB2ZXJzaW9uLiIsCiAgICApOwoKICAgIHJldHVybjsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCnJlY3Vyc2lvbiBmdW5jdGlvbiBmb3IgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKS4KRGVmaW5pdGlvbnMgZm9yIG9iamVjdCBhdHRyaWJ1dGVzIGFyZSBwYXNzZWQgaW4gQzxYTUxEZWZpbml0aW9uPi4KVGhlIG5ldyBvYmplY3QgYXR0cmlidXRlcyBhcmUgYXBwZW5kZWQgdG8gQzxFbGVtZW50TGlzdD4uCkM8Q291bnRNYXhMaW1pdD4gbGltaXRzIHRoZSBtYXggbGVuZ3RoIG9mIGltcG9ydGFibGUgYXJyYXlzLgoKICAgICRPYmplY3RCYWNrZW5kLT5fTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgRWxlbWVudExpc3QgICA9PiAkQXJyYXlSZWYsCiAgICAgICAgQ291bnRNYXhMaW1pdCA9PiAxMCwKICAgICk7Cgo9Y3V0CgpzdWIgX01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17Q291bnRNYXhMaW1pdH07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte0VsZW1lbnRMaXN0fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtFbGVtZW50TGlzdH0gbmUgJ0FSUkFZJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgbGltaXQgdGhlIGxlbmd0aCBvZiBpbXBvcnRhYmxlIGFycmF5cywgZXZlbiBpZiBtb3JlIGVsZW1lbnRzIGNhbiBiZSBzZXQgdmlhIHRoZSBHVUkKICAgICAgICBteSAkQ291bnRNYXggPSBtaW4oICRJdGVtLT57Q291bnRNYXh9LCAkUGFyYW17Q291bnRNYXhMaW1pdH0gKTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJENvdW50TWF4ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUga2V5IHN0cmluZwogICAgICAgICAgICBteSAkS2V5ID0gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudDsKCiAgICAgICAgICAgICMgYWRkIHByZWZpeCB0byBrZXkKICAgICAgICAgICAgaWYgKCAkUGFyYW17S2V5UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRLZXkgPSAkUGFyYW17S2V5UHJlZml4fSAuICc6OicgLiAkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSB2YWx1ZSBzdHJpbmcKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEl0ZW0tPntLZXl9OwoKICAgICAgICAgICAgIyBhZGQgY291bnQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkQ291bnRNYXggPiAxIHx8ICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSAuPSAnOjonIC4gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBwcmVmaXggdG8ga2V5CiAgICAgICAgICAgIGlmICggJFBhcmFte1ZhbHVlUHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZVByZWZpeH0gLiAnOjonIC4gJFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByb3cKICAgICAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0VsZW1lbnRMaXN0fSB9LCBcJVJvdzsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgICAgICRTZWxmLT5fTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIEVsZW1lbnRMaXN0ICAgPT4gJFBhcmFte0VsZW1lbnRMaXN0fSwKICAgICAgICAgICAgICAgIEtleVByZWZpeCAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlUHJlZml4ICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQ291bnRNYXhMaW1pdCA9PiAkUGFyYW17Q291bnRNYXhMaW1pdH0gfHwgJzEwJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCnJlY3Vyc2lvbiBmdW5jdGlvbiBmb3IgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKICAgICRPYmplY3RCYWNrZW5kLT5fU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBBdHRyaWJ1dGVMaXN0ID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX1NlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtBdHRyaWJ1dGVMaXN0fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSBuZSAnQVJSQVknOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBzZXQgcHJlZml4CiAgICAgICAgbXkgJEtleSAgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgPSAkSXRlbS0+e05hbWV9OwoKICAgICAgICBpZiAoICRQYXJhbXtLZXlQcmVmaXh9ICkgewogICAgICAgICAgICAkS2V5ID0gJFBhcmFte0tleVByZWZpeH0gLiAnOjonIC4gJEtleTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte05hbWVQcmVmaXh9ICkgewogICAgICAgICAgICAkTmFtZSA9ICRQYXJhbXtOYW1lUHJlZml4fSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZSwgaWYgbWFya2VkIGFzIHNlYXJjaGFibGUKICAgICAgICBpZiAoICRJdGVtLT57U2VhcmNoYWJsZX0gKSB7CgogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHQnIHx8ICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHRBcmVhJyApIHsKCiAgICAgICAgICAgICAgICBteSAlUm93ID0gKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICRJdGVtLT57SW5wdXR9LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1NpemV9IHx8IDYwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggICA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e01heExlbmd0aH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0cmlidXRlTGlzdH0gfSwgXCVSb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIGxpc3QKICAgICAgICAgICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntJbnB1dH0tPntDbGFzc30sCiAgICAgICAgICAgICAgICApIHx8IHt9OwoKICAgICAgICAgICAgICAgIG15ICVSb3cgPSAoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkR2VuZXJhbENhdGFsb2dMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSB9LCBcJVJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ID0+ICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSwKICAgICAgICAgICAgS2V5UHJlZml4ICAgICA9PiAkS2V5LAogICAgICAgICAgICBOYW1lUHJlZml4ICAgID0+ICROYW1lLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgpCgpyZWN1cnNpb24gZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgZXhwb3J0IFhNTCBzZWFyY2ggcGFyYW1zCgogICAgJE9iamVjdEJhY2tlbmQtPl9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBXaGF0ICAgICAgICAgID0+ICRBcnJheVJlZiwKICAgICAgICBTZWFyY2hEYXRhICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtXaGF0fTsKICAgIHJldHVybiBpZiAhJFBhcmFte1NlYXJjaERhdGF9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1doYXR9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtTZWFyY2hEYXRhfSBuZSAnSEFTSCc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIGNyZWF0ZSBrZXkKICAgICAgICBteSAkS2V5ID0gJFBhcmFte1ByZWZpeH0gPyAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSXRlbS0+e0tleX0gOiAkSXRlbS0+e0tleX07CgogICAgICAgICMgcHJlcGFyZSB2YWx1ZQogICAgICAgIG15ICRWYWx1ZXMgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17U2VhcmNoRGF0YX0tPnskS2V5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFZhbHVlcykgewoKICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGtleQogICAgICAgICAgICBteSAkU2VhcmNoS2V5ID0gJEtleTsKICAgICAgICAgICAgJFNlYXJjaEtleSA9fiBzeyA6OiB9e1wnXH1bJV1ce1wnfXhtc2c7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggaGFzaAogICAgICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgICAgICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRTZWFyY2hLZXkgLiAnXCd9WyVde1wnQ29udGVudFwnfScgPT4gJFZhbHVlcywKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgV2hhdCAgICAgICAgICA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgICAgPT4gJFBhcmFte1NlYXJjaERhdGF9LAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0V4cG9ydFhNTERhdGFQcmVwYXJlKCkKCnJlY3Vyc2lvbiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBleHBvcnQgWE1MIGRhdGEKCiAgICAkT2JqZWN0QmFja2VuZC0+X0V4cG9ydFhNTERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJEhhc2hSZWYsCiAgICAgICAgWE1MRGF0YTJEICAgICA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cG9ydFhNTERhdGFQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhMkR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGEyRH0gbmUgJ0hBU0gnOwoKICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgJFBhcmFte1ByZWZpeH0gLj0gJzo6JzsKICAgIH0KICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgY3JlYXRlIGtleQogICAgICAgICAgICBteSAkS2V5ID0gJFBhcmFte1ByZWZpeH0gLiAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgJFBhcmFte1hNTERhdGEyRH0tPnskS2V5fSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTEV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKCkKCnJlY3Vyc2lvbiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBpbXBvcnQgWE1MIHNlYXJjaCBwYXJhbXMKCiAgICAkT2JqZWN0QmFja2VuZC0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFdoYXQgICAgICAgICAgPT4gJEFycmF5UmVmLAogICAgICAgIElkZW50aWZpZXIgICAgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9JbXBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte1doYXR9OwogICAgcmV0dXJuIGlmICEkUGFyYW17SWRlbnRpZmllcn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17V2hhdH0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0lkZW50aWZpZXJ9IG5lICdIQVNIJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgY3JlYXRlIGtleQogICAgICAgIG15ICRLZXkgPSAkUGFyYW17UHJlZml4fSA/ICRQYXJhbXtQcmVmaXh9IC4gJzo6XGQrOjonIC4gJEl0ZW0tPntLZXl9IDogJEl0ZW0tPntLZXl9OwogICAgICAgICRLZXkgLj0gJzo6XGQrJzsKCiAgICAgICAgbXkgJElkZW50aWZpZXJLZXk7CiAgICAgICAgSURFTlRJRklFUktFWToKICAgICAgICBmb3IgbXkgJElkZW50S2V5ICgga2V5cyAleyAkUGFyYW17SWRlbnRpZmllcn0gfSApIHsKCiAgICAgICAgICAgIG5leHQgSURFTlRJRklFUktFWSBpZiAkSWRlbnRLZXkgIX4gbXsgXEEgJEtleSBceiB9eG1zOwoKICAgICAgICAgICAgJElkZW50aWZpZXJLZXkgPSAkSWRlbnRLZXk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJElkZW50aWZpZXJLZXkpIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtJZGVudGlmaWVyfS0+eyRJZGVudGlmaWVyS2V5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICAgICAjIHByZXBhcmUga2V5CiAgICAgICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoICRJZGVudGlmaWVyS2V5ID1+IG17IDo6IH14bXMgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJENvdW50ZXIgJSAyICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWRlbnRpZmllcktleSA9fiBzeyA6OiB9e11ceyd9eG1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElkZW50aWZpZXJLZXkgPX4gc3sgOjogfXsnXH1bfXhtczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgICAgICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRJZGVudGlmaWVyS2V5IC4gJ117XCdDb250ZW50XCd9JyA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+ICRQYXJhbXtXaGF0fSwKICAgICAgICAgICAgSWRlbnRpZmllciAgICA9PiAkUGFyYW17SWRlbnRpZmllcn0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfSW1wb3J0WE1MRGF0YU1lcmdlKCkKCnJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBpbnBsYWNlIGVkaXQgdGhlIGltcG9ydCBYTUwgZGF0YS4KCiAgICBteSAkTWVyZ2VPayA9ICRPYmplY3RCYWNrZW5kLT5fSW1wb3J0WE1MRGF0YU1lcmdlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFhNTERhdGFQcmV2ICAgPT4gJEhhc2hSZWYsCiAgICAgICAgWE1MRGF0YTJEICAgICA9PiAkSGFzaFJlZiwKICAgICk7CgpUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0ZXIgdGhlIG1lcmdlIHdhcyBzdWNjZXNzZnVsLgpBIG1lcmdlIGZhaWxzIHdoZW4gZm9yIGV4YW1wbGUgYSBnZW5lcmFsIGNhdGFsb2cgaXRlbSBuYW1lIGNhbid0IGJlIG1hcHBlZCB0byBhbiBpZC4KCj1jdXQKCnN1YiBfSW1wb3J0WE1MRGF0YU1lcmdlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YTJEfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGFQcmV2fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7ICAgICMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbmZpZyBpdGVtIGNsYXNzCiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhMkR9IG5lICdIQVNIJzsgICAgICAgICAjIGhhc2ggd2l0aCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGFQcmV2fSBuZSAnSEFTSCc7ICAgICAgICMgaGFzaCB3aXRoIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb25maWcgaXRlbQoKICAgIG15ICRYTUxEYXRhID0gJFBhcmFte1hNTERhdGFQcmV2fTsKCiAgICAjIGRlZmF1bHQgdmFsdWUgZm9yIHByZWZpeAogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudGVyOwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRYTUxEYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdCiAgICAgICAgICAgICAgICAgICAgfHw9IHt9OyAgICAjIGVtcHR5IGNvbnRhaW5lciwgaW4gY2FzZSB0aGVyZSBpcyBubyBwcmV2aW91cyBkYXRhCiAgICAgICAgICAgICAgICBteSAkTWVyZ2VPayA9ICRTZWxmLT5fSW1wb3J0WE1MRGF0YU1lcmdlKAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gICAgICAgICAgICAgICAgPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEyRCAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1hNTERhdGEyRH0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YVByZXYgICAgICAgICAgICAgICAgICA9PiAkWE1MRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgID0+ICRLZXkgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJFBhcmFte0VtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXN9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRNZXJnZU9rOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFdoZW4gdGhlIGRhdGEgcG9pbnQgaXMgbm90IHBhcnQgb2YgdGhlIGlucHV0IGRlZmluaXRpb24sCiAgICAgICAgICAgICMgdGhlbiBkbyBub3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBzZXR0aW5nLgogICAgICAgICAgICAjIEZhbHNlIHZhbHVlcyBhcmUgT0suCiAgICAgICAgICAgIG5leHQgQ09VTlRFUiB1bmxlc3MgZXhpc3RzICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX07CgogICAgICAgICAgICBpZiAoICRQYXJhbXtFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBvdmVycmlkZSBvbGQgdmFsdWUgd2l0aCBhbiBlbXB0eSBmaWVsZCBpcyBpbXBvcnRlZAogICAgICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX07CiAgICAgICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgJFBhcmFte1hNTERhdGEyRH0tPnskS2V5fSBlcSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcmVwYXJlIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTEltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGEyRH0tPnskS2V5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbGV0IG1lcmdlIGZhaWwsIHdoZW4gYSB2YWx1ZSBjYW5ub3QgYmUgcHJlcGFyZWQKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgcHJlcGFyZWQgdmFsdWUKICAgICAgICAgICAgJFhNTERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yMCAkICREYXRlOiAyMDEwLzAzLzAyIDE0OjA5OjQ4ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhbGwgY29uZmlnIGl0ZW0gZnVuY3Rpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtLnBtLHYgMS4yOCAyMDEwLzA0LzEzIDE3OjQ0OjEyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5Owp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yOCAkKSBbMV07CgpASVNBID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0gLSBjb25maWcgaXRlbSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57WE1MT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgICAgID0+ICdJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0JywKICAgICAgICBCYXNlT2JqZWN0ID0+ICdDb25maWdJdGVtT2JqZWN0JywKICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb25maWdJdGVtQ291bnQoKQoKY291bnQgYWxsIHJlY29yZHMgb2YgYSBjb25maWcgaXRlbSBjbGFzcwoKICAgIG15ICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Db3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdwcmVwcm9kdWN0aXZlJywgJ3Byb2R1Y3RpdmUnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgISV7JFN0YXRlTGlzdH07CgogICAgIyBjcmVhdGUgc3RhdGUgc3RyaW5nCiAgICBteSAkRGVwbFN0YXRlU3RyaW5nID0gam9pbiBxeywgfSwga2V5cyAleyRTdGF0ZUxpc3R9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNsYXNzX2lkID0gPyBBTkQgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSIsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQ291bnQ7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1SZXN1bHRMaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVJlc3VsdExpc3QoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgU3RhcnQgICA9PiAxMDAsCiAgICAgICAgTGltaXQgICA9PiA1MCwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc3VsdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIHN0YXRlIHN0cmluZwogICAgbXkgJERlcGxTdGF0ZVN0cmluZyA9IGpvaW4gcXssIH0sIGtleXMgJXskU3RhdGVMaXN0fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtICIKICAgICAgICAgICAgLiAiV0hFUkUgY2xhc3NfaWQgPSA/IEFORCBjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gIk9SREVSIEJZIGNoYW5nZV90aW1lIERFU0MiLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgICAgIFN0YXJ0ID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlETGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlETGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb25zIGRhdGEKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlETGlzdCkgewoKICAgICAgICAjIGdldCB2ZXJzaW9uIGRhdGEKICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1MaXN0LCAkTGFzdFZlcnNpb247CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1HZXQoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICk7CgpBIGhhc2hyZWYgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgaXMgcmV0dXJuZWQ6CgogICAgJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfQogICAgJENvbmZpZ0l0ZW17TnVtYmVyfQogICAgJENvbmZpZ0l0ZW17Q2xhc3NJRH0KICAgICRDb25maWdJdGVte0NsYXNzfQogICAgJENvbmZpZ0l0ZW17TGFzdFZlcnNpb25JRH0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfQogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlfQogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlVHlwZX0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfQogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlfQogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlVHlwZX0KICAgICRDb25maWdJdGVte0NyZWF0ZVRpbWV9CiAgICAkQ29uZmlnSXRlbXtDcmVhdGVCeX0KICAgICRDb25maWdJdGVte0NoYW5nZVRpbWV9CiAgICAkQ29uZmlnSXRlbXtDaGFuZ2VCeX0KCj1jdXQKCnN1YiBDb25maWdJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGVuYWJsZSBjYWNoZSBwZXIgZGVmYXVsdAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q2FjaGV9ICkgewogICAgICAgICRQYXJhbXtDYWNoZX0gPSAxOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtR2V0fS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgaWYgJFBhcmFte0NhY2hlfSAmJiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1HZXR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25maWdpdGVtX251bWJlciwgY2xhc3NfaWQsIGxhc3RfdmVyc2lvbl9pZCwgJwogICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCwgY3VyX2luY2lfc3RhdGVfaWQsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlQ29uZmlnSXRlbTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfSAgID0gJFJvd1swXTsKICAgICAgICAkQ29uZmlnSXRlbXtOdW1iZXJ9ICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRDb25maWdJdGVte0NsYXNzSUR9ICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJENvbmZpZ0l0ZW17TGFzdFZlcnNpb25JRH0gID0gJFJvd1szXTsKICAgICAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0gPSAkUm93WzRdOwogICAgICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfSA9ICRSb3dbNV07CiAgICAgICAgJENvbmZpZ0l0ZW17Q3JlYXRlVGltZX0gICAgID0gJFJvd1s2XTsKICAgICAgICAkQ29uZmlnSXRlbXtDcmVhdGVCeX0gICAgICAgPSAkUm93WzddOwogICAgICAgICRDb25maWdJdGVte0NoYW5nZVRpbWV9ICAgICA9ICRSb3dbOF07CiAgICAgICAgJENvbmZpZ0l0ZW17Q2hhbmdlQnl9ICAgICAgID0gJFJvd1s5XTsKICAgIH0KCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtCiAgICBpZiAoICEkQ29uZmlnSXRlbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBDb25maWdJdGVtSUQgKCRQYXJhbXtDb25maWdJdGVtSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgJENvbmZpZ0l0ZW17Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbXtDbGFzc0lEfSB9OwoKICAgIHJldHVybiBcJUNvbmZpZ0l0ZW0gaWYgISRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfSB8fCAhJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9OwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJERlcGxTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0sCiAgICApOwoKICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZX0gICAgID0gJERlcGxTdGF0ZS0+e05hbWV9OwogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlVHlwZX0gPSAkRGVwbFN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJEluY2lTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlVHlwZX0gPSAkSW5jaVN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1HZXR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0gPSBcJUNvbmZpZ0l0ZW07CgogICAgcmV0dXJuIFwlQ29uZmlnSXRlbTsKfQoKPWl0ZW0gQ29uZmlnSXRlbUFkZCgpCgphZGQgYSBuZXcgY29uZmlnIGl0ZW0KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgTnVtYmVyICA9PiAnMTExJywgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDbGFzc0xpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRDbGFzc0xpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9ICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHZhbGlkIGNsYXNzIGlkIGdpdmVuIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICBpZiAoICRQYXJhbXtOdW1iZXJ9ICkgewoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgbXkgJEV4aXN0cyA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRQYXJhbXtOdW1iZXJ9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb25maWcgaXRlbSBudW1iZXIgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNyZWF0ZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6TnVtYmVyR2VuZXJhdG9yJyksCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IGNvbmZpZyBpdGVtCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmZpZ2l0ZW0gJwogICAgICAgICAgICAuICcoY29uZmlnaXRlbV9udW1iZXIsIGNsYXNzX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TnVtYmVyfSwgXCRQYXJhbXtDbGFzc0lEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2NvbmZpZ2l0ZW1fbnVtYmVyID0gPyBBTkQgY2xhc3NfaWQgPSA/IE9SREVSIEJZIGlkIERFU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb25maWdJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdHJpZ2dlciBDb25maWdJdGVtQ3JlYXRlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJENvbmZpZ0l0ZW1JRCAuICclJScgLiAkUGFyYW17TnVtYmVyfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRDb25maWdJdGVtSUQ7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1EZWxldGUoKQoKZGVsZXRlIGFuIGV4aXN0aW5nIGNvbmZpZyBpdGVtCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmZpZ0l0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHZlcnNpb25zCiAgICAkU2VsZi0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHRyaWdnZXIgQ29uZmlnSXRlbURlbGV0ZSBldmVudAogICAgIyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZGVsZXRpbmcgdGhlIGNvbmZpZyBpdGVtIGZyb20gdGhlIGRhdGFiYXNlLAogICAgIyBiZWNhdXNlIG9mIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludCBpbiB0aGUgY29uZmlnaXRlbV9oaXN0b3J5IHRhYmxlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25maWdJdGVtRGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBjb25maWcgaXRlbQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gbGlzdCBhcyBhbiBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgTnVtYmVyICAgICAgID0+ICdUaGUgQ29uZmlnSXRlbSBOdW1iZXInLCAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaGUgTmFtZScsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgID0+IFs5LCA4LCA3LCA2XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVwbFN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICMgKG9wdGlvbmFsKQogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICBXaGF0ID0+IFsKICAgICAgICAgICAgIyBlYWNoIGFycmF5IGVsZW1lbnQgaXMgYSBhbmQgY29uZGl0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgb3IgY29uZGl0aW9uIGluIGhhc2gKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgYXJyYXkgcmVmZXJlbmNlIGlmIGRpZmZlcmVudCBjb250ZW50IHdpdGggc2FtZSBrZXkgd2FzIHNlYXJjaGVkCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+IFsnJWNvbnRlbnRDJScsICclY29udGVudEQlJywgJyVjb250ZW50RSUnXSwKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRDJ31bJV17J0NvbnRlbnQnfSIgPT4gWyclY29udGVudEMlJywgJyVjb250ZW50RCUnLCAnJWNvbnRlbnRFJSddLAogICAgICAgICAgICB9LAogICAgICAgIF0sCgogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQoKICAgICAgICBPcmRlckJ5ID0+ICdOdW1iZXInLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgQ29uZmlnSXRlbUlECiAgICAgICAgIyAoQ29uZmlnSXRlbUlELCBOdW1iZXIsIENsYXNzSUQsIERlcGxTdGF0ZUlELCBJbmNpU3RhdGVJRCwKICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgTGltaXQgICAgICAgICAgPT4gMTIyLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBsaW1pdAogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fTsKICAgICRQYXJhbXtMaW1pdH0gPSB1bmRlZjsKCiAgICAjIGNvbmZpZyBpdGVtIHNlYXJjaCBpcyByZXF1aXJlZCBpZiBvbmUgb2YgdGhlc2UgcGFyYW1zIGlzIGdpdmVuCiAgICBteSBAQ29uZmlnSXRlbVNlYXJjaFBhcmFtcyA9ICgKICAgICAgICAnTnVtYmVyJywKICAgICAgICAnQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUnLAogICAgICAgICdDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICAnQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUnCiAgICApOwoKICAgICMgY2hlY2ssIGlmIGNvbmZpZyBpdGVtIHNlYXJjaCBpcyByZXF1aXJlZAogICAgbXkgJVJlcXVpcmVkU2VhcmNoOwogICAgQ09ORklHSVRFTVBBUkFNOgogICAgZm9yIG15ICRDb25maWdJdGVtUGFyYW0gKEBDb25maWdJdGVtU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgbmV4dCBDT05GSUdJVEVNUEFSQU0gaWYgISRQYXJhbXskQ29uZmlnSXRlbVBhcmFtfTsKCiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ID0gMTsKICAgICAgICBsYXN0IENPTkZJR0lURU1QQVJBTTsKICAgIH0KCiAgICAjIHZlcnNpb24gc2VhcmNoIGlzIHJlcXVpcmVkIGlmIE5hbWUsIFdoYXQgb3IgUHJldmlvdXNWZXJzaW9uU2VhcmNoIGlzIGdpdmVuCiAgICBpZiAoICRQYXJhbXtOYW1lfSB8fCAkUGFyYW17V2hhdH0gfHwgJFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gKSB7CiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe1ZlcnNpb259ID0gMTsKICAgIH0KCiAgICAjIHhtbCB2ZXJzaW9uIHNlYXJjaCBpcyByZXF1aXJlZCBpZiBXaGF0IGlzIGdpdmVuCiAgICBpZiAoICRQYXJhbXtXaGF0fSApIHsKICAgICAgICAkUmVxdWlyZWRTZWFyY2h7WE1MVmVyc2lvbn0gPSAxOwogICAgfQoKICAgICMgdXNlIGNvbmZpZyBpdGVtIHNlYXJjaCBhcyBmYWxsYmFjawogICAgaWYgKCAhJVJlcXVpcmVkU2VhcmNoICkgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSA9IDE7CiAgICB9CgogICAgIyBzdGFydCBjb25maWcgaXRlbSBzZWFyY2gKICAgIG15ICVDb25maWdJdGVtTGlzdHM7CiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSApIHsKCiAgICAgICAgIyBzZWFyY2ggY29uZmlnIGl0ZW1zCiAgICAgICAgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSA9ICRTZWxmLT5Db25maWdJdGVtU2VhcmNoKCVQYXJhbSk7CgogICAgICAgIHJldHVybiBpZiAhJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfTsKICAgICAgICByZXR1cm4gaWYgcmVmICRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX0gbmUgJ0FSUkFZJzsKICAgICAgICByZXR1cm4gW10gaWYgIUB7ICRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX0gfTsKICAgIH0KCiAgICAjIHN0YXJ0IHZlcnNpb24gc2VhcmNoCiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSApIHsKCiAgICAgICAgIyBzZWFyY2ggdmVyc2lvbnMKICAgICAgICAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259ID0gJFNlbGYtPlZlcnNpb25TZWFyY2goJVBhcmFtKTsKCiAgICAgICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259OwogICAgICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSBuZSAnQVJSQVknOwogICAgICAgIHJldHVybiBbXSBpZiAhQHsgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSB9OwogICAgfQoKICAgICMgc3RhcnQgeG1sIHZlcnNpb24gc2VhcmNoCiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtYTUxWZXJzaW9ufSApIHsKCiAgICAgICAgIyBzZWFyY2ggeG1sIHZlcnNpb25zCiAgICAgICAgbXkgJFhNTFZlcnNpb25MaXN0ID0gJFNlbGYtPl9YTUxWZXJzaW9uU2VhcmNoKCVQYXJhbSk7CgogICAgICAgIHJldHVybiBpZiAhJFhNTFZlcnNpb25MaXN0OwogICAgICAgIHJldHVybiBpZiByZWYgJFhNTFZlcnNpb25MaXN0IG5lICdIQVNIJzsKICAgICAgICByZXR1cm4gW10gaWYgISV7JFhNTFZlcnNpb25MaXN0fTsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gaWRzCiAgICAgICAgbXkgJUNvbmZpZ0l0ZW1MaXN0VG1wOwogICAgICAgIGZvciBteSAkVmVyc2lvbklEICgga2V5cyAleyRYTUxWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQgPSAkU2VsZi0+VmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgKICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbklELAogICAgICAgICAgICApOwogICAgICAgICAgICAkQ29uZmlnSXRlbUxpc3RUbXB7JENvbmZpZ0l0ZW1JRH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaWRzIHRvIGNvbmZpZyBpdGVtIGxpc3QKICAgICAgICAkQ29uZmlnSXRlbUxpc3Rze1hNTFZlcnNpb259ID0gXCVDb25maWdJdGVtTGlzdFRtcDsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgcmVzdWx0IGxpc3QKICAgIG15IEBSZXN1bHRMaXN0OwogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7Q29uZmlnSXRlbX0gJiYgJFJlcXVpcmVkU2VhcmNoe1ZlcnNpb259ICkgewoKICAgICAgICBteSAlVmVyc2lvblRlbXBMaXN0OwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHsgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSB9ICkgewogICAgICAgICAgICAkVmVyc2lvblRlbXBMaXN0eyRDb25maWdJdGVtSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7ICRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkVmVyc2lvblRlbXBMaXN0eyRDb25maWdJdGVtSUR9OwoKICAgICAgICAgICAgcHVzaCBAUmVzdWx0TGlzdCwgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSApIHsKICAgICAgICBAUmVzdWx0TGlzdCA9IEB7ICRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX0gfTsKICAgIH0KICAgIGVsc2lmICggJFJlcXVpcmVkU2VhcmNoe1ZlcnNpb259ICkgewogICAgICAgIEBSZXN1bHRMaXN0ID0gQHsgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSB9OwogICAgfQoKICAgICMgY29uc2lkZXIgdGhlIFhNTCByZXN1bHQKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe1hNTFZlcnNpb259ICkgewogICAgICAgIEBSZXN1bHRMaXN0ID0gZ3JlcCB7ICRDb25maWdJdGVtTGlzdHN7WE1MVmVyc2lvbn0tPnskX30gfSBAUmVzdWx0TGlzdDsKICAgIH0KCiAgICAjIGNvbnNpZGVyIGxpbWl0CiAgICBpZiAoICRMaW1pdCAmJiAkTGltaXQgPCBzY2FsYXIgQFJlc3VsdExpc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCB0aGUgbGltaXRlZCBpZHMKICAgICAgICAkTGltaXQtLTsKICAgICAgICBAUmVzdWx0TGlzdCA9IEBSZXN1bHRMaXN0WyAwIC4uICRMaW1pdCBdOwogICAgfQoKICAgIHJldHVybiBcQFJlc3VsdExpc3Q7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1TZWFyY2goKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gbGlzdCBhcyBhbiBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIE51bWJlciAgICAgICA9PiAnVGhlIENvbmZpZ0l0ZW0gTnVtYmVyJywgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzSURzICAgICA9PiBbOSwgOCwgNywgNl0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENyZWF0ZUJ5ICAgICA9PiBbMSwgMiwgM10sICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUJ5ICAgICA9PiBbMywgMiwgMV0sICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAjIChvcHRpb25hbCkKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY2hhbmdlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICMgKG9wdGlvbmFsKQogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY2hhbmdlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAjIChvcHRpb25hbCkKCiAgICAgICAgT3JkZXJCeSA9PiAnTnVtYmVyJywgICMgKG9wdGlvbmFsKSBkZWZhdWx0IENvbmZpZ0l0ZW1JRAogICAgICAgICMgKENvbmZpZ0l0ZW1JRCwgTnVtYmVyLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQsCiAgICAgICAgIyBDcmVhdGVUaW1lLCBDcmVhdGVCeSwgQ2hhbmdlVGltZSwgQ2hhbmdlQnkpCgogICAgICAgIExpbWl0ICAgICAgICAgID0+IDEyMiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CiAgICAkUGFyYW17T3JkZXJCeX0gfHw9ICdpZCc7CgogICAgIyBhZGQgbnVtYmVyIHRvIHNxbCB3aGVyZSBhcnJheQogICAgbXkgQFNRTFdoZXJlOwogICAgaWYgKCAkUGFyYW17TnVtYmVyfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtOdW1iZXJ9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TnVtYmVyfSApOwoKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCRQYXJhbXtOdW1iZXJ9ICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKGNvbmZpZ2l0ZW1fbnVtYmVyKSBMSUtFIExPV0VSKCckUGFyYW17TnVtYmVyfScpIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiTE9XRVIoY29uZmlnaXRlbV9udW1iZXIpID0gTE9XRVIoJyRQYXJhbXtOdW1iZXJ9JykiOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBhcnJheSBwYXJhbXMKICAgIG15ICVBcnJheVBhcmFtcyA9ICgKICAgICAgICBDbGFzc0lEcyAgICAgPT4gJ2NsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJ2N1cl9kZXBsX3N0YXRlX2lkJywKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gJ2N1cl9pbmNpX3N0YXRlX2lkJywKICAgICAgICBDcmVhdGVCeSAgICAgPT4gJ2NyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlQnkgICAgID0+ICdjaGFuZ2VfYnknLAogICAgKTsKCiAgICBBUlJBWVBBUkFNOgogICAgZm9yIG15ICRBcnJheVBhcmFtICgga2V5cyAlQXJyYXlQYXJhbXMgKSB7CgogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhJFBhcmFteyRBcnJheVBhcmFtfTsKCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcnJheVBhcmFtfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFycmF5UGFyYW0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICFAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgICMgcXVvdGUKICAgICAgICBmb3IgbXkgJE9uZVBhcmFtICggQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9ICkgewogICAgICAgICAgICAkT25lUGFyYW0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE9uZVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gcXssIH0sIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkSW5TdHJpbmc7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyAkQXJyYXlQYXJhbSB9IElOICgkSW5TdHJpbmcpIjsKICAgIH0KCiAgICAjIHNldCB0aW1lIHBhcmFtcwogICAgbXkgJVRpbWVQYXJhbXMgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJ2NyZWF0ZV90aW1lID49JywKICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnY3JlYXRlX3RpbWUgPD0nLAogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICdjaGFuZ2VfdGltZSA+PScsCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJ2NoYW5nZV90aW1lIDw9JywKICAgICk7CgogICAgVElNRVBBUkFNOgogICAgZm9yIG15ICRUaW1lUGFyYW0gKCBrZXlzICVUaW1lUGFyYW1zICkgewoKICAgICAgICBuZXh0IFRJTUVQQVJBTSBpZiAhJFBhcmFteyRUaW1lUGFyYW19OwoKICAgICAgICBpZiAoICRQYXJhbXskVGltZVBhcmFtfSAhfiBteyBcQSBcZFxkXGRcZC1cZFxkLVxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgXHogfXhtcyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgZGF0ZSBmb3JtYXQgZm91bmQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskVGltZVBhcmFtfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRUaW1lUGFyYW19ICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJFRpbWVQYXJhbXN7ICRUaW1lUGFyYW0gfSAnJFBhcmFteyAkVGltZVBhcmFtIH0nIjsKICAgIH0KCiAgICAjIGNyZWF0ZSB3aGVyZSBzdHJpbmcKICAgIG15ICRXaGVyZVN0cmluZyA9IEBTUUxXaGVyZSA/ICcgV0hFUkUgJyAuIGpvaW4gcXsgQU5EIH0sIEBTUUxXaGVyZSA6ICcnOwoKICAgICMgZGVmaW5lIG9yZGVyIHRhYmxlCiAgICBteSAlT3JkZXJCeVRhYmxlID0gKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAnaWQnLAogICAgICAgIE51bWJlciAgICAgICA9PiAnY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIENsYXNzSUQgICAgICA9PiAnY2xhc3NfaWQnLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAnY3VyX2RlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAnY3VyX2luY2lfc3RhdGVfaWQnLAogICAgICAgIENyZWF0ZVRpbWUgICA9PiAnY3JlYXRlX3RpbWUnLAogICAgICAgIENyZWF0ZUJ5ICAgICA9PiAnY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VUaW1lICAgPT4gJ2NoYW5nZV90aW1lJywKICAgICAgICBDaGFuZ2VCeSAgICAgPT4gJ2NoYW5nZV9ieScsCiAgICApOwoKICAgICMgc2V0IG9yZGVyIGJ5CiAgICBteSAkT3JkZXJCeSA9ICRPcmRlckJ5VGFibGV7ICRQYXJhbXtPcmRlckJ5fSB9IHx8ICdpZCc7CgogICAgIyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhbHdheXMgaXMgYSBkZWZpbmVkIG9yZGVyLCB0aGlzIGhlbHBzIHdpdGggdGVzdGluZwogICAgaWYgKCAkT3JkZXJCeSBuZSAnaWQnICkgewogICAgICAgICRPcmRlckJ5IC49ICcsIGlkJzsKICAgIH0KCiAgICAjIHNldCBsaW1pdAogICAgaWYgKCAkUGFyYW17TGltaXR9ICkgewogICAgICAgICRQYXJhbXtMaW1pdH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtMaW1pdH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSAkV2hlcmVTdHJpbmcgT1JERVIgQlkgJE9yZGVyQnkgQVNDIiwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1pdGVtIEN1ckluY2lTdGF0ZVJlY2FsYygpCgpyZWNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSBhbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMKCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VySW5jaVN0YXRlUmVjYWxjIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBsaW5rIHR5cGUgZnJvbSBjb25maWcKICAgIG15ICRMaW5rVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNOjpDb3JlOjpJbmNpZGVudExpbmtUeXBlJyk7CgogICAgIyByZW1lbWJlciB0aGUgc2Nhbm5lZCBjb25maWcgaXRlbXMKICAgIG15ICVTY2FubmVkQ29uZmlnSXRlbUlEczsKCiAgICAjIGZpbmQgYWxsIGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlCiAgICAkU2VsZi0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICApOwoKICAgICMgaW52ZXN0aWdhdGUgYWxsIGNvbmZpZyBpdGVtcyB3aXRoIGEgd2FybmluZyBzdGF0ZQogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVTY2FubmVkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9LT57VHlwZX0gbmUgJ2luY2lkZW50JzsKCiAgICAgICAgJFNlbGYtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgaW5jaWRlbnQgc3RhdGUgbGlzdCBvZiB3YXJuaW5ncwogICAgbXkgJFdhcm5TdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnd2FybmluZycsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVJldmVyc2VXYXJuU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyRXYXJuU3RhdGVMaXN0fTsKICAgIG15IEBTb3J0ZWRXYXJuTGlzdCAgICAgICA9IHNvcnQga2V5cyAlUmV2ZXJzZVdhcm5TdGF0ZUxpc3Q7CiAgICBteSAkV2FybmluZ1N0YXRlSUQKICAgICAgICA9ICRSZXZlcnNlV2FyblN0YXRlTGlzdHtXYXJuaW5nfSB8fCAkUmV2ZXJzZVdhcm5TdGF0ZUxpc3R7ICRTb3J0ZWRXYXJuTGlzdFswXSB9OwoKICAgICMgdG8gc3RvcmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gc2VydmljZXMgYW5kIGxpbmtlZCBDSXMKICAgIG15ICVTZXJ2aWNlQ0lSZWxhdGlvbjsKCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIGtleXMgJVNjYW5uZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIGV4dHJhY3QgaW5jaWRlbnQgc3RhdGUgdHlwZQogICAgICAgIG15ICRJbmNpU3RhdGVUeXBlID0gJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9e1R5cGV9OwoKICAgICAgICAjIGZpbmQgYWxsIGxpbmtlZCBzZXJ2aWNlcyBvZiB0aGlzIENJCiAgICAgICAgbXkgJUxpbmtlZFNlcnZpY2VJRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdFdpdGhEYXRhKAogICAgICAgICAgICBPYmplY3QxID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEtleTEgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgT2JqZWN0MiA9PiAnU2VydmljZScsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBTRVJWSUNFSUQ6CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVMaW5rZWRTZXJ2aWNlSURzICkgewoKICAgICAgICAgICAgIyByZW1lbWJlciB0aGUgQ0lzIHRoYXQgYXJlIGxpbmtlZCB3aXRoIHRoaXMgc2VydmljZQogICAgICAgICAgICBwdXNoIEB7ICRTZXJ2aWNlQ0lSZWxhdGlvbnskU2VydmljZUlEfSB9LCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJEluY2lTdGF0ZVR5cGUgZXEgJ2luY2lkZW50JzsKCiAgICAgICAgbXkgJEN1ckluY2lTdGF0ZUlEID0gJFdhcm5pbmdTdGF0ZUlEOwogICAgICAgIGlmICggJEluY2lTdGF0ZVR5cGUgZXEgJ29wZXJhdGlvbmFsJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbgogICAgICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ3VySW5jaVN0YXRlSUQgPSAkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBjdXJyZW50IGluY2lkZW50IHN0YXRlCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBjb25maWdpdGVtIFNFVCBjdXJfaW5jaV9zdGF0ZV9pZCA9ICRDdXJJbmNpU3RhdGVJRCAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmb3IgZWFjaCBzZXJ2aWNlIChpbmZsdWVuY2VkIGJ5IGxpbmtlZCBDSXMpCiAgICBTRVJWSUNFSUQ6CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VDSVJlbGF0aW9uICkgewoKICAgICAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICAgICBteSAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAjIGludmVzdGlnYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGVhY2ggY29uZmlnIGl0ZW0KICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyAkU2VydmljZUNJUmVsYXRpb257JFNlcnZpY2VJRH0gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJENvbmZpZ0l0ZW1EYXRhLT57Q3VyRGVwbFN0YXRlVHlwZX0gbmUgJ3Byb2R1Y3RpdmUnOwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIG11c3QgYmUgc2V0IHRvICd3YXJuaW5nJwogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtRGF0YS0+e0N1ckluY2lTdGF0ZVR5cGV9IGVxICd3YXJuaW5nJyApIHsKICAgICAgICAgICAgICAgICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyA9ICd3YXJuaW5nJzsKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgbXVzdCBiZSBzZXQgdG8gJ2luY2lkZW50JwogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtRGF0YS0+e0N1ckluY2lTdGF0ZVR5cGV9IGVxICdpbmNpZGVudCcgKSB7CiAgICAgICAgICAgICAgICAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnaW5jaWRlbnQnOwogICAgICAgICAgICAgICAgbGFzdCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBDSXMgb2YgdGhlIHNlcnZpY2UKICAgICAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcywKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29uZmlnSXRlbUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNvbmZpZ2l0ZW0uIElmIGEgY29uZmlnaXRlbSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjb25maWdpdGVtLiBJZiBhIGNvbmZpZ2l0ZW0gbnVtYmVyIGlzIGdpdmVuLAp0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJE5hbWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJElEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAxMDAwMDAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCRLZXkpID0gZ3JlcCB7ICRQYXJhbXskX30gfSBxdyhDb25maWdJdGVtSUQgQ29uZmlnSXRlbU51bWJlcik7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkS2V5ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQgb3IgQ29uZmlnSXRlbU51bWJlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgcmVzdWx0IGlzIGNhY2hlZCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1Mb29rdXB9LT57JEtleX0tPnsgJFBhcmFteyRLZXl9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1Mb29rdXB9LT57JEtleX0tPnsgJFBhcmFteyRLZXl9IH07CgogICAgIyBzZXQgdGhlIGFwcHJvcHJpYXRlIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRTUUwgPSAnU0VMRUNUIGNvbmZpZ2l0ZW1fbnVtYmVyIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nOwoKICAgIGlmICggJEtleSBlcSAnQ29uZmlnSXRlbU51bWJlcicgKSB7CiAgICAgICAgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNvbmZpZ2l0ZW1fbnVtYmVyID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbUxvb2t1cH0tPnskS2V5fS0+eyAkUGFyYW17JEtleX0gfSA9ICRWYWx1ZTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfRmluZEluY2lDb25maWdJdGVtcygpCgpmaW5kIGFsbCBjb25maWcgaXRlbXMgd2l0aCBhbiBpbmNpZGVudCBzdGF0ZQoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiBcJVNjYW5uZWRDb25maWdJdGVtSURzLAogICAgKTsKCj1jdXQKCnN1YiBfRmluZEluY2lDb25maWdJdGVtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtDb25maWdJdGVtSUR9OwoKICAgICMgaWdub3JlIGFscmVhZHkgc2Nhbm5lZCBpZHMgKGluZmluaXRlIGxvb3AgcHJvdGVjdGlvbikKICAgIHJldHVybiBpZiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57VHlwZX0gPSAnb3BlcmF0aW9uYWwnOwoKICAgICMgZmluZCBhbGwgbGlua2VkIGNvbmZpZyBpdGVtcyAoY2hpbGRzKQogICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdCgKICAgICAgICBPYmplY3QxICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkxICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgT2JqZWN0MiAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgRGlyZWN0aW9uID0+ICdCb3RoJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBhZGQgb3duIGNvbmZpZyBpdGVtIGlkIHRvIGxpc3Qgb2YgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgbXkgQENvbmZpZ0l0ZW1JRHMgPSAoICRQYXJhbXtDb25maWdJdGVtSUR9LCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICk7CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgaW5jaWRlbnQgc3RhdGUKICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ2luY2lkZW50JyApIHsKICAgICAgICAgICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gPSAnaW5jaWRlbnQnOwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgJFNlbGYtPl9GaW5kSW5jaUNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkUGFyYW17TGlua1R5cGV9LAogICAgICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaW5kV2FybkNvbmZpZ0l0ZW1zKCkKCmZpbmQgYWxsIGNvbmZpZyBpdGVtcyB3aXRoIGEgd2FybmluZwoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICApOwoKPWN1dAoKc3ViIF9GaW5kV2FybkNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufTsKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufSA9IDE7CgogICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zIChwYXJlbnRzKQogICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdCgKICAgICAgICBPYmplY3QxICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkxICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgT2JqZWN0MiAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgRGlyZWN0aW9uID0+ICdCb3RoJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICRTZWxmLT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSwKICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRAogICAgICAgICAgICBpZiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgIyBzZXQgd2FybmluZyBzdGF0ZQogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnskQ29uZmlnSXRlbUlEfS0+e1R5cGV9ID0gJ3dhcm5pbmcnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfUHJlcGFyZUxpa2VTdHJpbmcoKQoKaW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJlcGFyZSBsaWtlIHN0cmluZ3MKCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X1ByZXBhcmVMaWtlU3RyaW5nKCAkU3RyaW5nUmVmICk7Cgo9Y3V0CgpzdWIgX1ByZXBhcmVMaWtlU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICRWYWx1ZSApID0gQF87CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CiAgICByZXR1cm4gaWYgcmVmICRWYWx1ZSBuZSAnU0NBTEFSJzsKCiAgICAjIFF1b3RlCiAgICAkeyRWYWx1ZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICR7JFZhbHVlfSwgJ0xpa2UnICk7CgogICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAkeyRWYWx1ZX0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgIHJldHVybjsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIElUU00gQ29uZmlnIEl0ZW0gZXZlbnRzOgoKQ29uZmlnSXRlbUNyZWF0ZSwgVmVyc2lvbkNyZWF0ZSwgRGVwbG95bWVudFN0YXRlVXBkYXRlLCBJbmNpZGVudFN0YXRlVXBkYXRlLApDb25maWdJdGVtRGVsZXRlLCBMaW5rQWRkLCBMaW5rRGVsZXRlLCBEZWZpbml0aW9uVXBkYXRlLCBOYW1lVXBkYXRlLCBWYWx1ZVVwZGF0ZQpEZWZpbml0aW9uQ3JlYXRlLCBWZXJzaW9uRGVsZXRlCgo9Y3V0Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMjggJCAkRGF0ZTogMjAxMC8wNC8xMyAxNzo0NDoxMiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRGVmaW5pdGlvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBkZWZpbml0aW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGVmaW5pdGlvbi5wbSx2IDEuOCAyMDEwLzAyLzE5IDEwOjUwOjU1IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkRlZmluaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbiAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBkZWZpbml0aW9uIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBEZWZpbml0aW9uTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBkZWZpbml0aW9uIGxpc3QgYXMgYXJyYXloYXNoIHJlZmVyZW5jZQoKICAgIG15ICREZWZpbml0aW9uTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRGVmaW5pdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgJwogICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiBXSEVSRSBjbGFzc19pZCA9ID8gT1JERVIgQlkgdmVyc2lvbicsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICk7CgogICAgbXkgQERlZmluaXRpb25MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlRGVmaW5pdGlvbjsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uSUR9ID0gJFJvd1swXTsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9ufSAgID0gJFJvd1sxXTsKICAgICAgICAkRGVmaW5pdGlvbntWZXJzaW9ufSAgICAgID0gJFJvd1syXTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVUaW1lfSAgID0gJFJvd1szXTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVCeX0gICAgID0gJFJvd1s0XTsKCiAgICAgICAgcHVzaCBARGVmaW5pdGlvbkxpc3QsIFwlRGVmaW5pdGlvbjsKICAgIH0KCiAgICByZXR1cm4gXEBEZWZpbml0aW9uTGlzdDsKfQoKPWl0ZW0gRGVmaW5pdGlvbkdldCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBkZWZpbml0aW9uIGFzIGhhc2ggcmVmZXJlbmNlCgpSZXR1cm4KICAgICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0KICAgICREZWZpbml0aW9ue0NsYXNzSUR9CiAgICAkRGVmaW5pdGlvbntDbGFzc30KICAgICREZWZpbml0aW9ue0RlZmluaXRpb259CiAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfQogICAgJERlZmluaXRpb257VmVyc2lvbn0KICAgICREZWZpbml0aW9ue0NyZWF0ZVRpbWV9CiAgICAkRGVmaW5pdGlvbntDcmVhdGVCeX0KCiAgICBteSAkRGVmaW5pdGlvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgIERlZmluaXRpb25JRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJERlZmluaXRpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRGVmaW5pdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RGVmaW5pdGlvbklEfSAmJiAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBEZWZpbml0aW9uSUQgb3IgQ2xhc3NJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0RlZmluaXRpb25JRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57RGVmaW5pdGlvbkdldH0tPnsgJFBhcmFte0RlZmluaXRpb25JRH0gfQogICAgICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0RlZmluaXRpb25HZXR9LT57ICRQYXJhbXtEZWZpbml0aW9uSUR9IH07CgogICAgICAgICMgYXNrIGRhdGFiYXNlCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjbGFzc19pZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtEZWZpbml0aW9uSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFzayBkYXRhYmFzZQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY2xhc3NfaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjbGFzc19pZCA9ID8gT1JERVIgQlkgdmVyc2lvbiBERVNDJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEZWZpbml0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uSUR9ID0gJFJvd1swXTsKICAgICAgICAkRGVmaW5pdGlvbntDbGFzc0lEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9ufSAgID0gJFJvd1syXTsKICAgICAgICAkRGVmaW5pdGlvbntWZXJzaW9ufSAgICAgID0gJFJvd1szXTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVUaW1lfSAgID0gJFJvd1s0XTsKICAgICAgICAkRGVmaW5pdGlvbntDcmVhdGVCeX0gICAgID0gJFJvd1s1XTsKCiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gPSBldmFsICREZWZpbml0aW9ue0RlZmluaXRpb259OwogICAgfQoKICAgIHJldHVybiB7fSBpZiAhJERlZmluaXRpb257RGVmaW5pdGlvbklEfTsKCiAgICAjIHByZXBhcmUgZGVmaW5pdGlvbgogICAgaWYgKCAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSAmJiByZWYgJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+X0RlZmluaXRpb25QcmVwYXJlKAogICAgICAgICAgICBEZWZpbml0aW9uUmVmID0+ICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSA9ICcnOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBhZGQgY2xhc3MKICAgICREZWZpbml0aW9ue0NsYXNzfSA9ICRDbGFzc0xpc3QtPnsgJERlZmluaXRpb257Q2xhc3NJRH0gfTsKCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57RGVmaW5pdGlvbkdldH0tPnsgJERlZmluaXRpb257RGVmaW5pdGlvbklEfSB9ID0gXCVEZWZpbml0aW9uOwoKICAgIHJldHVybiBcJURlZmluaXRpb247Cn0KCj1pdGVtIERlZmluaXRpb25BZGQoKQoKYWRkIGEgbmV3IGRlZmluaXRpb24KCiAgICBteSAkRGVmaW5pdGlvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICA9PiAxMjMsCiAgICAgICAgRGVmaW5pdGlvbiA9PiAndGhlIGRlZmluaXRpb24gY29kZScsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgRGVmaW5pdGlvbiBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZGVmaW5pdGlvbgogICAgbXkgJENoZWNrID0gJFNlbGYtPkRlZmluaXRpb25DaGVjaygKICAgICAgICBEZWZpbml0aW9uID0+ICRQYXJhbXtEZWZpbml0aW9ufSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hlY2s7CgogICAgIyBnZXQgbGFzdCBkZWZpbml0aW9uCiAgICBteSAkTGFzdERlZmluaXRpb24gPSAkU2VsZi0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICk7CgogICAgIyBzdG9wIGFkZCwgaWYgZGVmaW5pdGlvbiB3YXMgbm90IGNoYW5nZWQKICAgIGlmICggJExhc3REZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSAmJiAkTGFzdERlZmluaXRpb24tPntEZWZpbml0aW9ufSBlcSAkUGFyYW17RGVmaW5pdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgbmV3IGRlZmluaXRpb24hIFRoZSBkZWZpbml0aW9uIHdhcyBub3QgY2hhbmdlZC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IHZlcnNpb24KICAgIG15ICRWZXJzaW9uID0gMTsKICAgIGlmICggJExhc3REZWZpbml0aW9uLT57VmVyc2lvbn0gKSB7CiAgICAgICAgJFZlcnNpb24gPSAkTGFzdERlZmluaXRpb24tPntWZXJzaW9ufTsKICAgICAgICAkVmVyc2lvbisrOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyBkZWZpbml0aW9uCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiAnCiAgICAgICAgICAgIC4gJyhjbGFzc19pZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc0lEfSwgXCRQYXJhbXtEZWZpbml0aW9ufSwgXCRWZXJzaW9uLCBcJFBhcmFte1VzZXJJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAjIGdldCBpZCBvZiBuZXcgZGVmaW5pdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24gV0hFUkUgJwogICAgICAgICAgICAuICdjbGFzc19pZCA9ID8gQU5EIHZlcnNpb24gPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgdmVyc2lvbiBERVNDJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc0lEfSwgXCRWZXJzaW9uIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkRGVmaW5pdGlvbklEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGVmaW5pdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHRyaWdnZXIgRGVmaW5pdGlvbkNyZWF0ZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRGVmaW5pdGlvbkNyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb21tZW50ID0+ICREZWZpbml0aW9uSUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkRGVmaW5pdGlvbklEOwp9Cgo9aXRlbSBEZWZpbml0aW9uQ2hlY2soKQoKY2hlY2sgdGhlIHN5bnRheCBvZiBhIG5ldyBkZWZpbml0aW9uCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkNoZWNrKAogICAgICAgIERlZmluaXRpb24gPT4gJ3RoZSBkZWZpbml0aW9uIGNvZGUnLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0RlZmluaXRpb259ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBEZWZpbml0aW9uIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERlZmluaXRpb24gPSBldmFsICRQYXJhbXtEZWZpbml0aW9ufTsKCiAgICBpZiAoICEkRGVmaW5pdGlvbiApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgWW91IGhhdmUgYW4gc3ludGF4IGVycm9yIGluIHRoZSBkZWZpbml0aW9uLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJERlZmluaXRpb24gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgRGVmaW5pdGlvbiBpcyBub3QgYW4gYXJyYXkgcmVmZXJlbmNlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZWN1cnNpb24gY2hlY2sKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0RlZmluaXRpb25QcmVwYXJlKCkKClByZXBhcmUgdGhlIHN5bnRheCBvZiBhIG5ldyBkZWZpbml0aW9uCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0RlZmluaXRpb25QcmVwYXJlKAogICAgICAgIERlZmluaXRpb25SZWYgPT4gJEFycmF5UmVmLAogICAgKTsKCj1jdXQKCnN1YiBfRGVmaW5pdGlvblByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24KICAgIGlmICggISRQYXJhbXtEZWZpbml0aW9uUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRGVmaW5pdGlvblJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtEZWZpbml0aW9uUmVmfSB9ICkgewoKICAgICAgICAjIHNldCBDb3VudE1pbgogICAgICAgIGlmICggIWRlZmluZWQgJEl0ZW0tPntDb3VudE1pbn0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnRNaW59ID0gMTsKICAgICAgICB9CgogICAgICAgICMgc2V0IENvdW50TWF4CiAgICAgICAgJEl0ZW0tPntDb3VudE1heH0gfHw9IDE7CgogICAgICAgICMgc2V0IENvdW50TWluCiAgICAgICAgaWYgKCAkSXRlbS0+e0NvdW50TWlufSA+ICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50TWlufSA9ICRJdGVtLT57Q291bnRNYXh9OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQ291bnREZWZhdWx0CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkSXRlbS0+e0NvdW50RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnREZWZhdWx0fSA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICggJEl0ZW0tPntDb3VudERlZmF1bHR9IDwgJEl0ZW0tPntDb3VudE1pbn0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnREZWZhdWx0fSA9ICRJdGVtLT57Q291bnRNaW59OwogICAgICAgIH0KICAgICAgICBpZiAoICRJdGVtLT57Q291bnREZWZhdWx0fSA+ICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPSAkSXRlbS0+e0NvdW50TWF4fTsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiBpcyBkZWZpbmVkLgogICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICYmIHJlZiAkSXRlbS0+e1N1Yn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJFNlbGYtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICAgICAgICAgIERlZmluaXRpb25SZWYgPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGVsZXRlICRJdGVtLT57U3VifTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjggJCAkRGF0ZTogMjAxMC8wMi8xOSAxMDo1MDo1NSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vSGlzdG9yeS5wbSAtIG1vZHVsZSBmb3IgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBoaXN0b3J5IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSGlzdG9yeS5wbSx2IDEuOSAyMDA5LzA4LzI0IDA5OjE2OjQwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Okhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6SGlzdG9yeSAtIG1vZHVsZSBmb3IgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBoaXN0b3J5IGZ1bmN0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgaGlzdG9yeSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gSGlzdG9yeUdldCgpCgpSZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIGFsbCBoaXN0b3J5IGVudHJpZXMgZm9yIHRoZSBnaXZlbiBjb25maWcgaXRlbS4KRWFjaCBhcnJheSBlbGVtZW50IGlzIGEgaGFzaCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIG9uZSBoaXN0b3J5IGVudHJ5LgoKVGhlc2UgaGFzaCByZWZlcmVuY2VzIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQ6CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDb25maWdJdGVtSUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tDb21tZW50fQogICAgJEluZm97Q3JlYXRlZEJ5fQogICAgJEluZm97Q3JlYXRlZFRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRJbmZvID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGNhY2hlZCByZXN1bHQgZXhpc3RzLCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBmZXRjaCBzb21lIGRhdGEgZnJvbSBoaXN0b3J5IGZvciBnaXZlbiBjb25maWcgaXRlbQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjaC5pZCwgY2guY29uZmlnaXRlbV9pZCwgY2guY29udGVudCwgY2gudHlwZV9pZCwgJwogICAgICAgICAgICAuICdjaC5jcmVhdGVfYnksIGNoLmNyZWF0ZV90aW1lLCBjaHQubmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9oaXN0b3J5IGNoLCBjb25maWdpdGVtX2hpc3RvcnlfdHlwZSBjaHQgJwogICAgICAgICAgICAuICdXSEVSRSBjaC50eXBlX2lkID0gY2h0LmlkIEFORCBjaC5jb25maWdpdGVtX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNoLmlkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgc2F2ZSBkYXRhIGZyb20gaGlzdG9yeSBpbiBhcnJheQogICAgbXkgQEVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVUbXAgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgID0+ICRSb3dbM10sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRSb3dbNl0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBARW50cmllcywgXCVUbXA7CiAgICB9CgogICAgIyBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2VyIHdobyBjcmVhdGVkIGhpc3RvcnkgZW50cmllcwogICAgZm9yIG15ICRFbnRyeSAoQEVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBpbmZvcm1hdGlvbgogICAgICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJEVudHJ5LT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgaGlzdG9yeSBlbnRyeQogICAgICAgICRFbnRyeS0+e1VzZXJJRH0gICAgICAgID0gJFVzZXJJbmZve1VzZXJJRH07CiAgICAgICAgJEVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlckluZm97VXNlckxvZ2lufTsKICAgICAgICAkRW50cnktPntVc2VyRmlyc3RuYW1lfSA9ICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICAgICAkRW50cnktPntVc2VyTGFzdG5hbWV9ICA9ICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgfQoKICAgICMgc2F2ZSByZXN1bHQgaW4gY2FjaGUKICAgICRTZWxmLT57Q2FjaGV9LT57Q0lWZXJzaW9uc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfSA9IFxARW50cmllczsKCiAgICByZXR1cm4gXEBFbnRyaWVzOwp9Cgo9aXRlbSBIaXN0b3J5RW50cnlHZXQoKQoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeS4KVGhlIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQ6CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDb25maWdJdGVtSUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tDb21tZW50fQogICAgJEluZm97Q3JlYXRlQnl9CiAgICAkSW5mb3tDcmVhdGVUaW1lfQogICAgJEluZm97VXNlcklEfQogICAgJEluZm97VXNlckxvZ2lufQogICAgJEluZm97VXNlckxhc3RuYW1lfQogICAgJEluZm97VXNlckZpcnN0bmFtZX0KCiAgICBteSAkSW5mbyA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5RW50cnlHZXQoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeUVudHJ5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhIaXN0b3J5RW50cnlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGNhY2hlZCByZXN1bHQgZXhpc3RzLCByZXR1cm4gdGhhdCByZXN1bHQKICAgIGlmICggJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9ICkgewogICAgICAgIG15ICgkQ29uZmlnSXRlbUlEKSA9IGtleXMgJXsgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9IH07CiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbnN9LT57ICRQYXJhbXtIaXN0b3J5RW50cnlJRH0gfS0+eyRDb25maWdJdGVtSUR9OwogICAgfQoKICAgICMgZmV0Y2ggYSBzaW5nbGUgZW50cnkgZnJvbSBoaXN0b3J5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoLmlkLCBjaC5jb25maWdpdGVtX2lkLCBjaC5jb250ZW50LCBjaC50eXBlX2lkLCAnCiAgICAgICAgICAgIC4gJ2NoLmNyZWF0ZV9ieSwgY2guY3JlYXRlX3RpbWUsIGNodC5uYW1lICcKICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX2hpc3RvcnkgY2gsIGNvbmZpZ2l0ZW1faGlzdG9yeV90eXBlIGNodCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoLnR5cGVfaWQgPSBjaHQuaWQgQU5EIGNoLmlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0hpc3RvcnlFbnRyeUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVFbnRyeTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICVFbnRyeSA9ICgKICAgICAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCAgPT4gJFJvd1szXSwKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJFJvd1s2XSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSBmb3IgdGhpcyBlbnRyeQogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRFbnRyeXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICRFbnRyeXtVc2VySUR9ICAgICAgICA9ICRVc2VySW5mb3tVc2VySUR9OwogICAgJEVudHJ5e1VzZXJMb2dpbn0gICAgID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAkRW50cnl7VXNlckZpcnN0bmFtZX0gPSAkVXNlckluZm97VXNlckZpcnN0bmFtZX07CiAgICAkRW50cnl7VXNlckxhc3RuYW1lfSAgPSAkVXNlckluZm97VXNlckxhc3RuYW1lfTsKCiAgICAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfS0+eyAkUGFyYW17SGlzdG9yeUVudHJ5SUR9IH0tPnsgJEVudHJ5e0NvbmZpZ0l0ZW1JRH0gfSA9IFwlRW50cnk7CgogICAgcmV0dXJuIFwlRW50cnk7Cn0KCj1pdGVtIEhpc3RvcnlBZGQoKQoKQWRkcyBhIHNpbmdsZSBoaXN0b3J5IGVudHJ5IHRvIHRoZSBoaXN0b3J5LgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gMTIzNCwKICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdOZXdDb25maWdJdGVtJywgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0FueSB1c2VmdWwgaW5mb3JtYXRpb24nLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgVXNlcklEIENvbW1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhKCAkUGFyYW17SGlzdG9yeVR5cGV9IHx8ICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBIaXN0b3J5VHlwZSBvciBIaXN0b3J5VHlwZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSB0eXBlIGlkIGZyb20gaGlzdG9yeSB0eXBlIGlmIGhpc3RvcnkgdHlwZSBpcyBnaXZlbi4KICAgIGlmICggJFBhcmFte0hpc3RvcnlUeXBlfSApIHsKICAgICAgICBteSAkSWQgPSAkU2VsZi0+SGlzdG9yeVR5cGVMb29rdXAoIEhpc3RvcnlUeXBlID0+ICRQYXJhbXtIaXN0b3J5VHlwZX0gKTsKCiAgICAgICAgaWYgKCAhJElkICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBoaXN0b3J5IHR5cGUgZ2l2ZW4hJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0hpc3RvcnlUeXBlSUR9ID0gJElkOwogICAgfQoKICAgICMgaWYgaGlzdG9yeSB0eXBlIGlzIGdpdmVuCiAgICBlbHNpZiAoICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT5IaXN0b3J5VHlwZUxvb2t1cCggSGlzdG9yeVR5cGVJRCA9PiAkUGFyYW17SGlzdG9yeVR5cGVJRH0gKTsKCiAgICAgICAgaWYgKCAhJE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIGhpc3RvcnkgdHlwZSBpZCBnaXZlbiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZ2l2ZW4gY29uZmlnIGl0ZW0gaWQgcG9pbnRzIHRvIGFuIGV4aXN0aW5nIGNvbmZpZyBpdGVtIGlkCiAgICBpZiAoICRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgIG15ICRJZCA9ICRTZWxmLT5Db25maWdJdGVtTG9va3VwKCBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKTsKCiAgICAgICAgaWYgKCAhJElkICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBjb25maWcgaXRlbSBpZCBnaXZlbiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlZCByZXN1bHRzCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb25zfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9OwoKICAgICMgaW5zZXJ0IGhpc3RvcnkgZW50cnkKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX2hpc3RvcnkgKCBjb25maWdpdGVtX2lkLCBjb250ZW50LCBjcmVhdGVfYnksICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIHR5cGVfaWQgKSBWQUxVRVMgKCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyApJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SGlzdG9yeVR5cGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEhpc3RvcnlEZWxldGUoKQoKRGVsZXRlcyBjb21wbGV0ZSBoaXN0b3J5IGZvciBhIGdpdmVuIGNvbmZpZyBpdGVtCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlEZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlZCByZXN1bHRzCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb259LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CiAgICBmb3IgbXkgJFZlcnNpb25OciAoIGtleXMgJXsgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30gfSApIHsKICAgICAgICBteSAoJENhY2hlQ29uZmlnSXRlbSkgPSBrZXlzICV7ICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbnN9LT57JFZlcnNpb25Ocn0gfTsKICAgICAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnskVmVyc2lvbk5yfSBpZiAkQ2FjaGVDb25maWdJdGVtIGVxICRQYXJhbXtDb25maWdJdGVtSUR9OwogICAgfQoKICAgICMgZGVsZXRlIGhpc3RvcnkgZm9yIGdpdmVuIGNvbmZpZyBpdGVtCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeSBXSEVSRSBjb25maWdpdGVtX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgKTsKfQoKPWl0ZW0gSGlzdG9yeUVudHJ5RGVsZXRlKCkKCkRlbGV0ZXMgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeS4KCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+SGlzdG9yeUVudHJ5RGVsZXRlKAogICAgICAgIEhpc3RvcnlFbnRyeUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeUVudHJ5RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhIaXN0b3J5RW50cnlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBzaW5nbGUgZW50cnkKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9oaXN0b3J5IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SGlzdG9yeUVudHJ5SUR9IF0sCiAgICApOwp9Cgo9aXRlbSBIaXN0b3J5VHlwZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGhpc3RvcnkgdHlwZS4gSWYgYSBoaXN0b3J5IHR5cGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGhpc3RvcnkgdHlwZS4gSWYgYSBoaXN0b3J5IHR5cGUgaXMgZ2l2ZW4sIHRoZSBhcHByb3ByaWF0ZQppZCBpcyByZXR1cm5lZC4KCiAgICBteSAkTmFtZSA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEyMzQsCiAgICApOwoKICAgIG15ICRJZCA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlUeXBlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCRLZXkpID0gZ3JlcCB7ICRQYXJhbXskX30gfSBxdyhIaXN0b3J5VHlwZUlEIEhpc3RvcnlUeXBlKTsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRLZXkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEhpc3RvcnlUeXBlSUQgb3IgSGlzdG9yeVR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHJlc3VsdCBpcyBjYWNoZWQgcmV0dXJuIHRoYXQgcmVzdWx0CiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntIaXN0b3J5VHlwZUxvb2t1cH0tPnsgJFBhcmFteyRLZXl9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0hpc3RvcnlUeXBlTG9va3VwfS0+eyAkUGFyYW17JEtleX0gfTsKCiAgICAjIHNldCB0aGUgYXBwcm9wcmlhdGUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgbmFtZSBGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeV90eXBlIFdIRVJFIGlkID0gPyc7CgogICAgaWYgKCAkS2V5IGVxICdIaXN0b3J5VHlwZScgKSB7CiAgICAgICAgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtX2hpc3RvcnlfdHlwZSBXSEVSRSBuYW1lID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZSBpbiBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPntIaXN0b3J5VHlwZUxvb2t1cH0tPnsgJFBhcmFteyRLZXl9IH0gPSAkVmFsdWU7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzA4LzI0IDA5OjE2OjQwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIG51bWJlciBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE51bWJlci5wbSx2IDEuNCAyMDA5LzA4LzE5IDIyOjQ4OjE0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckxvb2t1cCgpCgpyZXR1cm4gY29uZmlnIGl0ZW0gaWQgb3IgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICcxMjM0NTQzMjEnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCBvciBDb25maWdJdGVtTnVtYmVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e0lEfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntJRH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBjb25maWdpdGVtX251bWJlciBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlcjsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57SUR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0KICAgICAgICAgICAgPSAkQ29uZmlnSXRlbU51bWJlcjsKCiAgICAgICAgcmV0dXJuICRDb25maWdJdGVtTnVtYmVyOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e051bWJlcn0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1OdW1iZXJ9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfTsKCiAgICAjIHF1b3RlCiAgICAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSApOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSBjb25maWdpdGVtX251bWJlciA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfQogICAgICAgID0gJENvbmZpZ0l0ZW1JRDsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckNyZWF0ZSgpCgpjcmVhdGUgYSBuZXcgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJE51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFR5cGUgQ2xhc3NJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtUeXBlfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBjb25maWcgaXRlbSBudW1iZXIgZ2VuZXJhdG9yIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEgJEAiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBwdXNoIEBJU0EsICRQYXJhbXtUeXBlfTsKCiAgICAjIGNyZWF0ZSBudW1iZXIKICAgIG15ICROdW1iZXIgPSAkU2VsZi0+X0NvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJE51bWJlcjsKfQoKPWl0ZW0gQ3VycmVudENvdW50ZXJHZXQoKQoKcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50ZXIgb2YgYSBjbGFzcwoKICAgIG15ICRDb3VudGVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1cnJlbnRDb3VudGVyR2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBDdXJyZW50Q291bnRlckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY291bnRlciBGUk9NIGNvbmZpZ2l0ZW1fY291bnRlciBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2NsYXNzX2lkID0gPyBBTkQgY291bnRlcl90eXBlID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VHlwZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROdW1iZXI7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROdW1iZXIgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkTnVtYmVyOwp9Cgo9aXRlbSBDdXJyZW50Q291bnRlclNldCgpCgpzZXQgdGhlIGN1cnJlbnQgY291bnRlciBvZiBhIGNsYXNzCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VycmVudENvdW50ZXJTZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICAgICAgQ291bnRlciA9PiAnMTInLAogICAgKTsKCj1jdXQKCnN1YiBDdXJyZW50Q291bnRlclNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFR5cGUgQ291bnRlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGNvdW50ZXIKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2NvdW50ZXIgV0hFUkUgY2xhc3NfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgKTsKCiAgICAjIHNldCBuZXcgY291bnRlcgogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbV9jb3VudGVyICcKICAgICAgICAgICAgLiAnKGNsYXNzX2lkLCBjb3VudGVyX3R5cGUsIGNvdW50ZXIpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9LCBcJFBhcmFte1R5cGV9LCBcJFBhcmFte0NvdW50ZXJ9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDgvMTkgMjI6NDg6MTQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vUGVybWlzc2lvbi5wbSAtIG1vZHVsZSBmb3IgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBQZXJtaXNzaW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogUGVybWlzc2lvbi5wbSx2IDEuMyAyMDA5LzExLzAyIDExOjEwOjUxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uIC0gbW9kdWxlIGZvciBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIFBlcm1pc3Npb24gZnVuY3Rpb25zCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBQZXJtaXNzaW9uIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBQZXJtaXNzaW9uKCkKCnJldHVybnMgd2hldGhlciB0aGUgdXNlciBoYXMgcGVybWlzc2lvbnMgb3Igbm90CgogICAgbXkgJEFjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgU2NvcGUgICAgPT4gJ0NsYXNzJywgIyBDbGFzcyB8fCBJdGVtCiAgICAgICAgQ2xhc3NJRCAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnQ2xhc3MnCiAgICAgICAgSXRlbUlEICAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnSXRlbScKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICApOwoKb3Igd2l0aG91dCBsb2dnaW5nLCBmb3IgZXhhbXBsZSBmb3IgdG8gY2hlY2sgaWYgYSBsaW5rL2FjdGlvbiBzaG91bGQgYmUgc2hvd24KCiAgICBteSAkQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBTY29wZSAgICA9PiAnQ2xhc3MnLCAjIENsYXNzIHx8IEl0ZW0KICAgICAgICBDbGFzc0lEICA9PiAxMjMsICAgICAjIGlmIFNjb3BlIGlzICdDbGFzcycKICAgICAgICBJdGVtSUQgICA9PiAxMjMsICAgICAjIGlmIFNjb3BlIGlzICdJdGVtJwogICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFNjb3BlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgSXRlbUlEIG9yIENsYXNzSUQgZGVwZW5kZW50CiAgICAjIG9uIHRoZSBTY29wZQogICAgaWYgKAogICAgICAgICggJFBhcmFte1Njb3BlfSBlcSAnQ2xhc3MnIGFuZCAhJFBhcmFte0NsYXNzSUR9ICkKICAgICAgICB8fCAoICRQYXJhbXtTY29wZX0gZXEgJ0l0ZW0nIGFuZCAhJFBhcmFte0l0ZW1JRH0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ2xhc3NJRCBpZiBTY29wZSBpcyAnQ2xhc3MnIG9yIEl0ZW1JRCBpZiBTY29wZSBpcyAnSXRlbSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJ1biBhbGwgSVRTTUNvbmZpZ0l0ZW0gUGVybWlzc2lvbiBtb2R1bGVzCiAgICBpZiAoCiAgICAgICAgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnSVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246OicgLiAkUGFyYW17U2NvcGV9ICkgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgIG15ICVNb2R1bGVzCiAgICAgICAgICAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6JyAuICRQYXJhbXtTY29wZX0gKSB9OwogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVNb2R1bGVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdAogICAgICAgICAgICBteSAkTW9kdWxlT2JqZWN0ID0gJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgICAgICAgICAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkU2VsZi0+e0RCT2JqZWN0fSwKICAgICAgICAgICAgICAgIE1haW5PYmplY3QgICAgICAgICAgID0+ICRTZWxmLT57TWFpbk9iamVjdH0sCiAgICAgICAgICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgICA9PiAkU2VsZi0+e0VuY29kZU9iamVjdH0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtT2JqZWN0ICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgICAgICAgICAgID0+ICRTZWxmLT57VXNlck9iamVjdH0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgIEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0+ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBleGVjdXRlIFJ1bigpCiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRNb2R1bGVPYmplY3QtPlJ1biglUGFyYW0pOwoKICAgICAgICAgICAgIyBjaGVjayBncmFudGVkIG9wdGlvbiAoc2hvdWxkIEkgc2F5IG9rKQogICAgICAgICAgICBpZiAoICRBY2Nlc3NPayAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e0dyYW50ZWR9ICkgewoKICAgICAgICAgICAgICAgICMgYWNjZXNzIG9rCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZXR1cm4gYmVjYXVzZSBhY2Nlc3MgaXMgZmFsc2UgYnV0IGl0J3MgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICYmICRNb2R1bGVzeyRNb2R1bGV9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQZXJtaXNzaW9uIGRlbmllZCBiZWNhdXNlIG1vZHVsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIoJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9KSBpcyByZXF1aXJlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIoVXNlcklEOiAkUGFyYW17VXNlcklEfSAnJFBhcmFte1R5cGV9JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJvbiAkUGFyYW17U2NvcGV9OiAiIC4gJFBhcmFteyAkUGFyYW17U2NvcGV9IC4gJ0lEJyB9IC4gIikhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWNjZXNzIG5vdCBvawogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZG9uJ3QgZ3JhbnQgYWNjZXNzCiAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIChVc2VySUQ6ICRQYXJhbXtVc2VySUR9ICckUGFyYW17VHlwZX0nICIKICAgICAgICAgICAgICAgIC4gIm9uICRQYXJhbXtTY29wZX06ICIgLiAkUGFyYW17ICRQYXJhbXtTY29wZX0gLiAnSUQnIH0gLiAiKSEiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMTEvMDIgMTE6MTA6NTEgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vVmVyc2lvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCB2ZXJzaW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVmVyc2lvbi5wbSx2IDEuMjYgMjAxMC8wMy8zMCAxMzoyNDo0OCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI2ICQpIFsxXTsKCnVzZSBTdG9yYWJsZTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlZlcnNpb24gLSBzdWIgbW9kdWxlIG9mIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdmVyc2lvbiBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gVmVyc2lvblpvb21MaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIHZlcnNpb24gbGlzdCBhcyBhcnJheWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJFZlcnNpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25ab29tTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uWm9vbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBnZXQgdmVyc2lvbiB6b29tIGxpc3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCBkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gT1JERVIgQlkgaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVmVyc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVWZXJzaW9uOwogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gICA9ICRSb3dbMF07CiAgICAgICAgJFZlcnNpb257TmFtZX0gICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0gPSAkUm93WzJdOwogICAgICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfSA9ICRSb3dbM107CiAgICAgICAgJFZlcnNpb257Q3JlYXRlVGltZX0gID0gJFJvd1s0XTsKICAgICAgICAkVmVyc2lvbntDcmVhdGVCeX0gICAgPSAkUm93WzVdOwoKICAgICAgICBwdXNoIEBWZXJzaW9uTGlzdCwgXCVWZXJzaW9uOwogICAgfQoKICAgIGZvciBteSAkVmVyc2lvbiAoQFZlcnNpb25MaXN0KSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICREZXBsU3RhdGUgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICRJbmNpU3RhdGUgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBhZGQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICRWZXJzaW9uLT57Q2xhc3NJRH0gICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9OwogICAgICAgICRWZXJzaW9uLT57Q2xhc3N9ICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzfTsKICAgICAgICAkVmVyc2lvbi0+e051bWJlcn0gICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZVR5cGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckluY2lTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9OwogICAgfQoKICAgIHJldHVybiBcQFZlcnNpb25MaXN0Owp9Cgo9aXRlbSBWZXJzaW9uTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSB2ZXJzaW9uIGxpc3QgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJFZlcnNpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBWZXJzaW9uTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVmVyc2lvbkxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAVmVyc2lvbkxpc3Q7Cn0KCj1pdGVtIFZlcnNpb25HZXQoKQoKcmV0dXJucyBhIHZlcnNpb24gb2YgYSBjb25maWcgaXRlbSBhcyBoYXNoIHJlZmVyZW5jZS4KVGhlIHJldHVybmVkIGhhc2ggY29udGFpbnMgZm9sbG93aW5nIGF0dHJpYnV0ZXMuCgogICAgJFZlcnNpb257VmVyc2lvbklEfQogICAgJFZlcnNpb257Q29uZmlnSXRlbUlEfQogICAgJFZlcnNpb257TnVtYmVyfQogICAgJFZlcnNpb257Q2xhc3NJRH0KICAgICRWZXJzaW9ue0NsYXNzfQogICAgJFZlcnNpb257TGFzdFZlcnNpb25JRH0KICAgICRWZXJzaW9ue05hbWV9CiAgICAkVmVyc2lvbntEZWZpbml0aW9uSUR9CiAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0luY2lTdGF0ZX0KICAgICRWZXJzaW9ue0luY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntYTUxEZWZpbml0aW9ufQogICAgJFZlcnNpb257WE1MRGF0YX0KICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9CiAgICAkVmVyc2lvbntDcmVhdGVCeX0KCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCAgPT4gMTIzLAogICAgICAgIFhNTERhdGFHZXQgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgKTsKCiAgICBvcgoKICAgIG15ICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7CgpXaGVuIHRoZSBkYXRlIGZyb20gdGhlIFhNTCBzdG9yYWdlIGlzIG5vdCBuZWVkZWQgdGhlbiBmZXRjaGluZyB0aGUgWE1MIGRhdGEgY2FuIGJlCmV4cGxpY2l0bHkgdHVybmVkIG9mZiBieSBwYXNzaW5nIFhNTERhdGFHZXQgPT4gMC4KCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICApOwoKVGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgaXMgbm90IGNhY2hlZCwgYXMgdGhlIG5leHQgY2FsbCB0byBWZXJzaW9uR2V0KCkgbWlnaHQgbmVlZAp0aGUgWE1MIGRhdGEuIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHRoZSBjYWNoZSBpcyBhbHJlYWR5IGZpbGxlZCwgdGhlIGNhY2hlZAp2ZXJzaW9uIGhhc2ggaXMgcmV0dXJuZWQgd2l0aCB0aGUgWE1MIGRhdGEuIFNvIHlvdSBnZXQgbW9yZSB0aGFuIHlvdSBhc2tlZCBmb3IsIHdoaWNoIGlzbid0CmEgYmFkIHRoaW5nLgoKPWN1dAoKc3ViIFZlcnNpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1ZlcnNpb25JRH0gJiYgISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQgb3IgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YUdldH0gKSB7CiAgICAgICAgJFBhcmFte1hNTERhdGFHZXR9ID0gMTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIGlmICggJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uR2V0fS0+eyAkUGFyYW17VmVyc2lvbklEfSB9ICkgewoKICAgICAgICAgICAgIyByZXR1cm4gYSBjbG9uZSBvZiB0aGUgY2FjaGUsIGFzIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBiZSBhYmxlIGRvIGNoYW5nZSB0aGUgY2FjaGUKICAgICAgICAgICAgcmV0dXJuIFN0b3JhYmxlOjpkY2xvbmUoICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwgJwogICAgICAgICAgICAgICAgLiAnZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VmVyc2lvbklEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwgJwogICAgICAgICAgICAgICAgLiAnZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVZlcnNpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gICAgPSAkUm93WzBdOwogICAgICAgICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0gPSAkUm93WzFdOwogICAgICAgICRWZXJzaW9ue05hbWV9ICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRWZXJzaW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzNdOwogICAgICAgICRWZXJzaW9ue0RlcGxTdGF0ZUlEfSAgPSAkUm93WzRdOwogICAgICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfSAgPSAkUm93WzVdOwogICAgICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9ICAgPSAkUm93WzZdOwogICAgICAgICRWZXJzaW9ue0NyZWF0ZUJ5fSAgICAgPSAkUm93WzddOwogICAgfQoKICAgICMgY2hlY2sgdmVyc2lvbgogICAgaWYgKCAhJFZlcnNpb257VmVyc2lvbklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHN1Y2ggY29uZmlnIGl0ZW0gdmVyc2lvbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJERlcGxTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbntEZXBsU3RhdGVJRH0sCiAgICApOwoKICAgICRWZXJzaW9ue0RlcGxTdGF0ZX0gICAgID0gJERlcGxTdGF0ZS0+e05hbWV9OwogICAgJFZlcnNpb257RGVwbFN0YXRlVHlwZX0gPSAkRGVwbFN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJEluY2lTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbntJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRWZXJzaW9ue0luY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgJFZlcnNpb257SW5jaVN0YXRlVHlwZX0gPSAkSW5jaVN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0gZGF0YQogICAgaWYgKCAhJENvbmZpZ0l0ZW0gfHwgcmVmICRDb25maWdJdGVtIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCBjb25maWcgaXRlbSAkVmVyc2lvbntDb25maWdJdGVtSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFZlcnNpb257Q2xhc3NJRH0gICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9OwogICAgJFZlcnNpb257Q2xhc3N9ICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzfTsKICAgICRWZXJzaW9ue0xhc3RWZXJzaW9uSUR9ICAgID0gJENvbmZpZ0l0ZW0tPntMYXN0VmVyc2lvbklEfTsKICAgICRWZXJzaW9ue051bWJlcn0gICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGV9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZVR5cGV9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZUlEfTsKICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9OwoKICAgICMgZG8gbm90IGNhY2hlIHRoZSB2ZXJzaW9uIHdpdGhvdXQgdGhlIFhNTCBkYXRhLAogICAgIyB0aGUgbmV4dCBjYWxsZXIgbWlnaHQgbmVlZCB0aGUgWE1MIGRhdGEKICAgIHJldHVybiBcJVZlcnNpb24gaWYgISRQYXJhbXtYTUxEYXRhR2V0fTsKCiAgICAjIGdldCB4bWwgZGVmaW5pdGlvbgogICAgbXkgJERlZmluaXRpb24gPSAkU2VsZi0+RGVmaW5pdGlvbkdldCgKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJFZlcnNpb257RGVmaW5pdGlvbklEfSwKICAgICk7CiAgICAkVmVyc2lvbntYTUxEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn07CgogICAgIyBnZXQgeG1sIGRhdGEKICAgICRWZXJzaW9ue1hNTERhdGF9ID0gJFNlbGYtPl9YTUxWZXJzaW9uR2V0KAogICAgICAgIENsYXNzSUQgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbntWZXJzaW9uSUR9LAogICAgKTsKCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnsgJFZlcnNpb257VmVyc2lvbklEfSB9ID0gXCVWZXJzaW9uOwoKICAgICMgcmV0dXJuIGEgY2xvbmUgb2YgdGhlIGNhY2hlLCBhcyB0aGUgY2FsbGVyIHNob3VsZCBub3QgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGNhY2hlCiAgICByZXR1cm4gU3RvcmFibGU6OmRjbG9uZSggJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uR2V0fS0+eyAkVmVyc2lvbntWZXJzaW9uSUR9IH0gKTsKfQoKPWl0ZW0gVmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgpCgpyZXR1cm4gdGhlIGNvbmZpZyBpdGVtIGlkIG9mIGEgdmVyc2lvbgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uQ29uZmlnSXRlbUlER2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfTsKCiAgICAjIGdldCBjb25maWcgaXRlbSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBjb25maWdpdGVtX2lkIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1ZlcnNpb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb25maWdJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uQ29uZmlnSXRlbUlER2V0fS0+eyAkUGFyYW17VmVyc2lvbklEfSB9ID0gJENvbmZpZ0l0ZW1JRDsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gVmVyc2lvbkFkZCgpCgphZGQgYSBuZXcgdmVyc2lvbgoKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVGhlIE5hbWUnLAogICAgICAgIERlZmluaXRpb25JRCA9PiAxMjEyLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiA4LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiA0LAogICAgICAgIFhNTERhdGEgICAgICA9PiAkQXJyYXlIYXNoUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KENvbmZpZ0l0ZW1JRCBOYW1lIERlZmluaXRpb25JRCBEZXBsU3RhdGVJRCBJbmNpU3RhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkRGVwbFN0YXRlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGRlcGxveW1lbnQgc3RhdGUgaWQKICAgIGlmICggISREZXBsU3RhdGVMaXN0LT57ICRQYXJhbXtEZXBsU3RhdGVJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyB2YWxpZCBkZXBsb3ltZW50IHN0YXRlIGlkIGdpdmVuIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbmNpU3RhdGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgaW5jaWRlbnQgc3RhdGUgaWQKICAgIGlmICggISRJbmNpU3RhdGVMaXN0LT57ICRQYXJhbXtJbmNpU3RhdGVJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyB2YWxpZCBpbmNpZGVudCBzdGF0ZSBpZCBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IFZlcnNpb25MaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICBteSAkQ29uZmlnSXRlbUluZm8gPSB7fTsKCiAgICBpZiAoIEB7JFZlcnNpb25MaXN0fSApIHsKCiAgICAgICAgIyBnZXQgb2xkIHZlcnNpb24gaW5mbyBmb3IgY29tcGFyaXNvbnMgd2l0aCBjdXJyZW50IHZlcnNpb24KICAgICAgICAjIHRoaXMgaXMgbmVlZGVkIHRvIHRyaWdnZXIgc29tZSBldmVudHMKICAgICAgICAkQ29uZmlnSXRlbUluZm8gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW1JbmZvID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBpZiAhJENvbmZpZ0l0ZW1JbmZvOwogICAgcmV0dXJuIGlmIHJlZiAkQ29uZmlnSXRlbUluZm8gbmUgJ0hBU0gnOwoKICAgIG15ICRFdmVudHMgPSAkU2VsZi0+X0dldEV2ZW50cygKICAgICAgICBQYXJhbSAgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgIENvbmZpZ0l0ZW1JbmZvID0+ICRDb25maWdJdGVtSW5mbywKICAgICk7CgogICAgbXkgJFJldHVyblZlcnNpb25JRCA9IHNjYWxhciBAeyRWZXJzaW9uTGlzdH0gPyAkVmVyc2lvbkxpc3QtPlstMV0gOiAwOwogICAgcmV0dXJuICRSZXR1cm5WZXJzaW9uSUQgaWYgISggJEV2ZW50cyAmJiBrZXlzICV7JEV2ZW50c30gKTsKCiAgICAjIGluc2VydCBuZXcgdmVyc2lvbgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX3ZlcnNpb24gJwogICAgICAgICAgICAuICcoY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwgJwogICAgICAgICAgICAuICdkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte0RlZmluaXRpb25JRH0sCiAgICAgICAgICAgIFwkUGFyYW17RGVwbFN0YXRlSUR9LAogICAgICAgICAgICBcJFBhcmFte0luY2lTdGF0ZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkVmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25HZXR9LT57JFZlcnNpb25JRH07CiAgICB9CgogICAgIyBnZXQgaWQgb2YgbmV3IHZlcnNpb24KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjcmVhdGVfdGltZSBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2NvbmZpZ2l0ZW1faWQgPSA/IE9SREVSIEJZIGlkIERFU0MnLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVmVyc2lvbklEOwogICAgbXkgJENyZWF0ZVRpbWU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWZXJzaW9uSUQgID0gJFJvd1swXTsKICAgICAgICAkQ3JlYXRlVGltZSA9ICRSb3dbMV07CiAgICB9CgogICAgIyBjaGVjayB2ZXJzaW9uIGlkCiAgICBpZiAoICEkVmVyc2lvbklEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBuZXcgdmVyc2lvbiBpZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIHhtbCBkYXRhCiAgICBpZiAoICRQYXJhbXtYTUxEYXRhfSAmJiByZWYgJFBhcmFte1hNTERhdGF9IGVxICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPl9YTUxWZXJzaW9uQWRkKAogICAgICAgICAgICBDbGFzc0lEICAgICAgPT4gJENvbmZpZ0l0ZW1JbmZvLT57Q2xhc3NJRH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVmVyc2lvbklEICAgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBsYXN0X3ZlcnNpb25faWQsIGN1cl9kZXBsX3N0YXRlX2lkLCBjdXJfaW5jaV9zdGF0ZV9pZCwgY2hhbmdlX3RpbWUgYW5kIGNoYW5nZV9ieQogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGxhc3RfdmVyc2lvbl9pZCA9ID8sICcKICAgICAgICAgICAgLiAnY3VyX2RlcGxfc3RhdGVfaWQgPSA/LCBjdXJfaW5jaV9zdGF0ZV9pZCA9ID8sICcKICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUgPSA/LCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRWZXJzaW9uSUQsCiAgICAgICAgICAgIFwkUGFyYW17RGVwbFN0YXRlSUR9LAogICAgICAgICAgICBcJFBhcmFte0luY2lTdGF0ZUlEfSwKICAgICAgICAgICAgXCRDcmVhdGVUaW1lLAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIHRyaWdnZXIgVmVyc2lvbkNyZWF0ZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVmVyc2lvbkNyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkVmVyc2lvbklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNvbXBhcmUgY3VycmVudCBhbmQgb2xkIHZhbHVlcwogICAgaWYgKCAkRXZlbnRzLT57VmFsdWVVcGRhdGV9ICkgewogICAgICAgICRTZWxmLT5fRXZlbnRIYW5kbGVyRm9yQ2hhbmdlZFhNTFZhbHVlcygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBVcGRhdGVWYWx1ZXMgPT4gJEV2ZW50cy0+e1ZhbHVlVXBkYXRlfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIGRlZmluaXRpb24gdXBkYXRlIGV2ZW50CiAgICBpZiAoICRFdmVudHMtPntEZWZpbml0aW9uVXBkYXRlfSApIHsKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnRGVmaW5pdGlvblVwZGF0ZScsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkRXZlbnRzLT57RGVmaW5pdGlvblVwZGF0ZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgb2xkIGFuZCBuZXcgbmFtZQogICAgaWYgKCAkRXZlbnRzLT57TmFtZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ05hbWVVcGRhdGUnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEV2ZW50cy0+e05hbWVVcGRhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgaW5jaWRlbnQgc3RhdGUgdXBkYXRlIGV2ZW50CiAgICBpZiAoICRFdmVudHMtPntJbmNpZGVudFN0YXRlVXBkYXRlfSApIHsKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnSW5jaWRlbnRTdGF0ZVVwZGF0ZScsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkRXZlbnRzLT57SW5jaWRlbnRTdGF0ZVVwZGF0ZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBkZXBsb3ltZW50IHN0YXRlIHVwZGF0ZSBldmVudAogICAgaWYgKCAkRXZlbnRzLT57RGVwbG95bWVudFN0YXRlVXBkYXRlfSApIHsKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnRGVwbG95bWVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRFdmVudHMtPntEZXBsb3ltZW50U3RhdGVVcGRhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICAkU2VsZi0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgcmV0dXJuICRWZXJzaW9uSUQ7Cn0KCj1pdGVtIFZlcnNpb25EZWxldGUoKQoKZGVsZXRlIGFuIGV4aXN0aW5nIHZlcnNpb24gb3IgdmVyc2lvbnMKCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uRGVsZXRlKAogICAgICAgIFZlcnNpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggISRQYXJhbXtWZXJzaW9uSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVmVyc2lvbklEIG9yIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRWZXJzaW9uTGlzdCA9IFtdOwogICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSApIHsKCiAgICAgICAgcHVzaCBAeyRWZXJzaW9uTGlzdH0sICRQYXJhbXtWZXJzaW9uSUR9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHZlcnNpb24gbGlzdAogICAgICAgICRWZXJzaW9uTGlzdCA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIXNjYWxhciBAeyRWZXJzaW9uTGlzdH07CgogICAgIyBkZWxldGUgdGhlIHhtbCB2ZXJzaW9uIGRhdGEKICAgIGZvciBteSAkVmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRTZWxmLT5fWE1MVmVyc2lvbkRlbGV0ZSgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRWZXJzaW9uSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRWZXJzaW9uSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB2ZXJzaW9uIGlkIHN0cmluZwogICAgbXkgJFZlcnNpb25JRFN0cmluZyA9IGpvaW4gJywnLCBAeyRWZXJzaW9uTGlzdH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWQgZm9yIHZlcnNpb24gKG5lZWRlZCBmb3IgZXZlbnQgaGFuZGxpbmcpCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgICRDb25maWdJdGVtSUQgPSAkU2VsZi0+VmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgdmVyc2lvbnMKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkIElOICggJFZlcnNpb25JRFN0cmluZyApIiwKICAgICk7CgogICAgIyB0cmlnZ2VyIFZlcnNpb25EZWxldGUgZXZlbnQgd2hlbiBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bAogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgICAgICBFdmVudCA9PiAnVmVyc2lvbkRlbGV0ZScsCiAgICAgICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgY2FjaGUKICAgICAgICAgICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnskVmVyc2lvbklEfTsKICAgICAgICAgICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnskVmVyc2lvbklEfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBWZXJzaW9uU2VhcmNoKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYW4gYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvblNlYXJjaCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyA5LCA4LCA3LCA2IF0sICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCgogICAgICAgIE9yZGVyQnkgPT4gJ05hbWUnLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgQ29uZmlnSXRlbUlECiAgICAgICAgIyAoQ29uZmlnSXRlbUlELCBOYW1lLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQpCgogICAgICAgIExpbWl0ICAgICAgICAgID0+IDEyMiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CiAgICAkUGFyYW17T3JkZXJCeX0gfHw9ICdpZCc7CgogICAgIyBhZGQgbmFtZSB0byBzcWwgd2hlcmUgYXJyYXkKICAgIG15IEBTUUxXaGVyZTsKICAgIGlmICggJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgbmFtZQogICAgICAgIG15ICROYW1lID0gJFBhcmFte05hbWV9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJE5hbWUgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE5hbWUpOwoKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCROYW1lICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKHZyLm5hbWUpIExJS0UgTE9XRVIoJyROYW1lJykiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJMT1dFUih2ci5uYW1lKSA9IExPV0VSKCckTmFtZScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2xhc3NJRHMgICAgID0+ICdjaS5pZCA9IHZyLmNvbmZpZ2l0ZW1faWQgQU5EIGNpLmNsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJ3ZyLmRlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEcyA9PiAndnIuaW5jaV9zdGF0ZV9pZCcsCiAgICApOwoKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkUGFyYW17JEFycmF5UGFyYW19OwoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFycmF5UGFyYW19IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJyYXlQYXJhbSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiBxeywgfSwgQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRBcnJheVBhcmFtc3sgJEFycmF5UGFyYW0gfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBhZGQgcHJldmlvdXMgdmVyc2lvbiBwYXJhbQogICAgaWYgKCAhJFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gKSB7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICdjaS5sYXN0X3ZlcnNpb25faWQgPSB2ci5pZCc7CiAgICB9CgogICAgIyBjcmVhdGUgd2hlcmUgc3RyaW5nCiAgICBteSAkV2hlcmVTdHJpbmcgPSBAU1FMV2hlcmUgPyAnIFdIRVJFICcgLiBqb2luIHF7IEFORCB9LCBAU1FMV2hlcmUgOiAnJzsKCiAgICAjIGRlZmluZSBvcmRlciB0YWJsZQogICAgbXkgJU9yZGVyQnlUYWJsZSA9ICgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJ3ZyLmNvbmZpZ2l0ZW1faWQnLAogICAgICAgIE5hbWUgICAgICAgICA9PiAndnIubmFtZScsCiAgICAgICAgQ2xhc3NJRCAgICAgID0+ICdjaS5jbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICd2ci5kZXBsX3N0YXRlX2lkJywKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJ3ZyLmluY2lfc3RhdGVfaWQnLAogICAgKTsKCiAgICAjIHNldCBvcmRlciBieQogICAgbXkgJE9yZGVyQnkgPSAkT3JkZXJCeVRhYmxleyAkUGFyYW17T3JkZXJCeX0gfSB8fCAkT3JkZXJCeVRhYmxle0NvbmZpZ0l0ZW1JRH07CgogICAgIyBzZXQgbGltaXQKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUKHZyLmNvbmZpZ2l0ZW1faWQpICIKICAgICAgICAgICAgLiAiRlJPTSBjb25maWdpdGVtIGNpLCBjb25maWdpdGVtX3ZlcnNpb24gdnIgIgogICAgICAgICAgICAuICIkV2hlcmVTdHJpbmcgT1JERVIgQlkgJE9yZGVyQnkgQVNDIiwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9HZXRFdmVudHMoKQoKVGhpcyBtZXRob2QgY2hlY2tzIHdoYXQgdmFsdWVzIHdlcmUgY2hhbmdlZCBhbmQgd2hhdCBldmVudHMgaGF2ZSB0byBiZSB0cmlnZ2VyZWQuCkl0IHJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIGFsbCBldmVudCBuYW1lcyBhcyBrZXlzIHRoYXQgc2hvdWxkIGJlIHRyaWdnZXJlZC4KCiAgICBteSAkRXZlbnRzID0gJENJT2JqZWN0LT5fR2V0RXZlbnRzKAogICAgICAgIFBhcmFtID0+IHsKICAgICAgICAgICAgRGVwbFN0YXRlSUQgPT4gMTIzLAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnSXRlbUluZm8gPT4gewogICAgICAgICAgICBEZXBsU3RhdGVJRCA9PiAyMzQsCiAgICAgICAgfSwKICAgICk7CgogICAgcHJpbnQga2V5cyAleyRFdmVudHN9OyAjIHByaW50cyAiRGVwbG95bWVudFN0YXRlVXBkYXRlIgoKPWN1dAoKc3ViIF9HZXRFdmVudHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JbmZvIFBhcmFtKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRFdmVudHMgPSB7fTsKCiAgICAjIGNoZWNrIG9sZCBhbmQgbmV3IG5hbWUKICAgIG15ICRPbGROYW1lID0gJFBhcmFte0NvbmZpZ0l0ZW1JbmZvfS0+e05hbWV9IHx8ICcnOwogICAgbXkgJE5ld05hbWUgPSAkUGFyYW17UGFyYW19LT57TmFtZX0gICAgICAgICAgfHwgJyc7CgogICAgaWYgKCAkT2xkTmFtZSBuZSAkTmV3TmFtZSApIHsKICAgICAgICAkRXZlbnRzLT57TmFtZVVwZGF0ZX0gPSAkTmV3TmFtZSAuICclJScgLiAkT2xkTmFtZTsKICAgIH0KCiAgICAjIGlmIGRlcGxfc3RhdGUgaXMgdXBkYXRlZAogICAgbXkgJExhc3REZXBsU3RhdGVJRCA9ICRQYXJhbXtDb25maWdJdGVtSW5mb30tPntEZXBsU3RhdGVJRH0gfHwgJyc7CiAgICBteSAkQ3VyRGVwbFN0YXRlSUQgID0gJFBhcmFte1BhcmFtfS0+e0RlcGxTdGF0ZUlEfSAgICAgICAgICB8fCAnJzsKCiAgICBpZiAoICRMYXN0RGVwbFN0YXRlSUQgbmUgJEN1ckRlcGxTdGF0ZUlEICkgewogICAgICAgICRFdmVudHMtPntEZXBsb3ltZW50U3RhdGVVcGRhdGV9ID0gJEN1ckRlcGxTdGF0ZUlEIC4gJyUlJyAuICRMYXN0RGVwbFN0YXRlSUQ7CiAgICB9CgogICAgIyBpZiBpbmNpc3RhdGUgaXMgdXBkYXRlZAogICAgbXkgJExhc3RJbmNpU3RhdGVJRCA9ICRQYXJhbXtDb25maWdJdGVtSW5mb30tPntJbmNpU3RhdGVJRH0gfHwgJyc7CiAgICBteSAkQ3VySW5jaVN0YXRlSUQgID0gJFBhcmFte1BhcmFtfS0+e0luY2lTdGF0ZUlEfSAgICAgICAgICB8fCAnJzsKCiAgICBpZiAoICRMYXN0SW5jaVN0YXRlSUQgbmUgJEN1ckluY2lTdGF0ZUlEICkgewogICAgICAgICRFdmVudHMtPntJbmNpZGVudFN0YXRlVXBkYXRlfSA9ICRDdXJJbmNpU3RhdGVJRCAuICclJScgLiAkTGFzdEluY2lTdGF0ZUlEOwogICAgfQoKICAgICMgY2hlY2sgb2xkIGFuZCBuZXcgZGVmaW5pdGlvbl9pZAogICAgbXkgJE9sZERlZmluaXRpb25JRCA9ICRQYXJhbXtDb25maWdJdGVtSW5mb30tPntEZWZpbml0aW9uSUR9IHx8ICcnOwogICAgbXkgJE5ld0RlZmluaXRpb25JRCA9ICRQYXJhbXtQYXJhbX0tPntEZWZpbml0aW9uSUR9ICAgICAgICAgIHx8ICcnOwoKICAgIGlmICggJE9sZERlZmluaXRpb25JRCBuZSAkTmV3RGVmaW5pdGlvbklEICkgewogICAgICAgICRFdmVudHMtPntEZWZpbml0aW9uVXBkYXRlfSA9ICROZXdEZWZpbml0aW9uSUQ7CiAgICB9CgogICAgIyBjaGVjayBmb3IgY2hhbmdlcyBpbiBYTUwgZGF0YQogICAgaWYgKCAkUGFyYW17UGFyYW19LT57WE1MRGF0YX0gJiYgcmVmICRQYXJhbXtQYXJhbX0tPntYTUxEYXRhfSBlcSAnQVJSQVknICkgewogICAgICAgIG15ICVVcGRhdGVWYWx1ZXMgPSAkU2VsZi0+X0ZpbmRDaGFuZ2VkWE1MVmFsdWVzKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte1BhcmFtfS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIE5ld1hNTERhdGEgICA9PiAkUGFyYW17UGFyYW19LT57WE1MRGF0YX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoIGtleXMgJVVwZGF0ZVZhbHVlcyApIHsKICAgICAgICAgICAgJEV2ZW50cy0+e1ZhbHVlVXBkYXRlfSA9IFwlVXBkYXRlVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEV2ZW50czsKfQoKPWl0ZW0gX0V2ZW50SGFuZGxlckZvckNoYW5nZWRYTUxWYWx1ZXMoKQoKVGhpcyBtZXRob2QgY2FsbHMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIGVhY2ggY2hhbmdlZCB2YWx1ZSBvZiB0aGUgY29uZmlnIGl0ZW0uClRoZSBjaGFuZ2VkIHZhbHVlcyBhcmUgcGFzc2VkIGluIEM8VXBkYXRlVmFsdWVzPiBhcyBhbiBoYXNocmVmIHdpdGggdGFna2V5cyBhcyBrZXlzLgpQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgb25seSBoYW5kbGVzIHZhbHVlcyBpbnNpZGUgdGhlIFhNTCBzdHJ1Y3R1cmUsIG5vdCBnZW5lcmFsCmF0dHJpYnV0ZXMgbGlrZSBDPEN1ckluY2lTdGF0ZT4uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0V2ZW50SGFuZGxlckZvckNoYW5nZWRYTUxWYWx1ZXMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBVcGRhdGVWYWx1ZXMgPT4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J1ZlbmRvcid9WzFdIiA9PiAnT2xkVmVuZG9yJSVOZXdWZW5kb3InLAogICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J1R5cGUnfVsxXSIgICA9PiAnMTI3JSUxMjgnLAogICAgICAgICAgICB9CiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9FdmVudEhhbmRsZXJGb3JDaGFuZ2VkWE1MVmFsdWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVcGRhdGVWYWx1ZXMgQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgVmFsdWVVcGRhdGUgZXZlbnQgZm9yIGVhY2ggY2hhbmdlZCB2YWx1ZQogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRQYXJhbXtVcGRhdGVWYWx1ZXN9IH0gKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ1ZhbHVlVXBkYXRlJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRLZXkgLiAnJSUnIC4gJFBhcmFte1VwZGF0ZVZhbHVlc30tPnskS2V5fSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaW5kQ2hhbmdlZFhNTFZhbHVlcygpCgpjb21wYXJlcyB0aGUgbmV3IHhtbCBkYXRhIEM8TmV3WE1MRGF0YT4gd2l0aCB0aGUgeG1sIGRhdGEgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uCm9mIHRoZSBjb25maWcgaXRlbSBDPENvbmZpZ0l0ZW1JRD4uIE5vdGUgdGhhdCB0aGUgbmV3IFhNTCBkYXRhIGRvZXMgbm90IGNvbnRhaW4gdGFnIGtleXMuCkFsbCB2YWx1ZXMgb2YgdGhlIHR3byBkYXRhIHNldHMgYXJlIGNvbXBhcmVkLgpXaGVuIGEgY2hhbmdlZCB2YWx1ZSBpcyBlbmNvdW50ZXJlZCwgdGhlIHRhZyBrZXkgYW5kIHRoZSBvbGQgYW5kIHRoZSBuZXcgdmFsdWUgYXJlIHN0b3JlZCBpbiBhIGhhc2guClRoZSBoYXNoIHdpdGggdGhlIHVwZGF0YSB2YWx1ZXMgaXMgcmV0dXJuZWQuCgogICAgbXkgJVVwZGF0ZVZhbHVlcyA9ICRDb25maWdJdGVtT2JqZWN0LT5fRmluZENoYW5nZWRYTUxWYWx1ZXMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBOZXdYTUxEYXRhICAgPT4KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb24nID0+CiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPd25lcicgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCBsb29rcyBsaWtlOgoKICAgICVVcGRhdGVWYWx1ZXMgPSAoCiAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J1ZlbmRvcid9WzFdIiA9PiAnT2xkVmVuZG9yJSVOZXdWZW5kb3InLAogICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydUeXBlJ31bMV0iICAgPT4gJzEyNyUlMTI4JywKICAgICk7CgpUaGUga2V5IGlzIGEgdGFnIGtleS4gVGhlIHZhbHVlcyBjb250YWlucyB0aGUgb2xkIGFuZCB0aGUgbmV3IFhNTCB2YWx1ZS4KCj1jdXQKCnN1YiBfRmluZENoYW5nZWRYTUxWYWx1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgTmV3WE1MRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgd2l0aCBhbGwgdmVyc2lvbm51bWJlcnMgdGhhdCBleGlzdCBmb3IgdGhlCiAgICAjIGdpdmVuIGNvbmZpZyBpdGVtCiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICAjIHNraXAgdGhlIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIGl0ZW0KICAgIHJldHVybiBpZiAhQHskVmVyc2lvbkxpc3R9OwoKICAgICMgZ2V0IG9sZCB2ZXJzaW9uCiAgICBteSAkT2xkVmVyc2lvbiA9ICRTZWxmLT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbkxpc3QtPlstMV0sCiAgICApOwoKICAgICMgdGhlIHNob3J0IG5hbWVzIGZvciBuZXcgYW5kIG9sZCB4bWwgZGF0YSBhcmUgdXNlZCBpbiB0aGUgJ2V2YWwnIGJlbG93CiAgICBteSAkTmV3WE1MRGF0YSA9ICRQYXJhbXtOZXdYTUxEYXRhfTsKICAgIG15ICRPbGRYTUxEYXRhID0gJE9sZFZlcnNpb24tPntYTUxEYXRhfTsKCiAgICAjIGdldCBhbGwgdGFna2V5cyBpbiBuZXcgYW5kIG9sZCBYTUwgZGF0YQogICAgIyB1c2UgYSBzaWRlIGVmZmVjdCBvZiBYTUxIYXNoMkQoKSwgd2hpY2ggYWRkcyB0aGUgdGFnIGtleXMgdG8gdGhlIHBhc3NlZCBpbiBkYXRhIHN0cnVjdHVyZQogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoMkQoIFhNTEhhc2ggPT4gJE5ld1hNTERhdGEgKTsKICAgIG15IEBUYWdLZXlzID0gJFNlbGYtPl9HcmFiVGFnS2V5cyggRGF0YSA9PiBbICRPbGRYTUxEYXRhLCAkTmV3WE1MRGF0YSBdICk7CgogICAgIyBnZXQgYW4gdW5pcXVlIGxpc3Qgb2YgYWxsIHRhZyBrZXlzCiAgICBteSAlVW5pcXVlVGFnS2V5cyA9IG1hcCB7ICRfID0+IDEgfSBAVGFnS2V5czsKCiAgICAjIGRvIHRoZSBjaGVjawogICAgbXkgJVVwZGF0ZVZhbHVlczsKICAgIGZvciBteSAkVGFnS2V5ICggc29ydCBrZXlzICVVbmlxdWVUYWdLZXlzICkgewogICAgICAgIG15ICROZXdDb250ZW50ID0gZXZhbCAnJE5ld1hNTERhdGEtPicgLiAkVGFnS2V5IC4gJy0+e0NvbnRlbnR9JyB8fCAnJzsKICAgICAgICBteSAkT2xkQ29udGVudCA9IGV2YWwgJyRPbGRYTUxEYXRhLT4nIC4gJFRhZ0tleSAuICctPntDb250ZW50fScgfHwgJyc7CgogICAgICAgIGlmICggJE5ld0NvbnRlbnQgbmUgJE9sZENvbnRlbnQgKSB7CgogICAgICAgICAgICAjIGEgY2hhbmdlIHdhcyBmb3VuZAogICAgICAgICAgICAkVXBkYXRlVmFsdWVzeyRUYWdLZXl9ID0gam9pbiAnJSUnLCAkT2xkQ29udGVudCwgJE5ld0NvbnRlbnQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlVXBkYXRlVmFsdWVzOwp9Cgo9aXRlbSBfR3JhYlRhZ0tleXMoKQoKcmVjdXJzaXZlbHkgc2NhbnMgYSBwZXJsIGRhdGFzdHJ1Y3R1cmUgZm9yIHRoZSBoYXNoIGtleSAnVGFnS2V5JyBhbmQgcmV0dXJucyBhCmxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoYXQga2V5LgoKICAgIG15IEBUYWdLZXlzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9HcmFiVGFnS2V5cygKICAgICAgICBEYXRhID0+ICRYTUxIYXNoUmVmZXJlbnosCiAgICApOwoKPWN1dAoKc3ViIF9HcmFiVGFnS2V5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAoKSBpZiAhJFBhcmFte0RhdGF9OwoKICAgIG15IEBUYWdLZXlzOwogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IGVxICdBUlJBWScgKSB7CgogICAgICAgIEVMRU06CiAgICAgICAgZm9yIG15ICRFbGVtICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICBuZXh0IEVMRU0gaWYgISRFbGVtOwogICAgICAgICAgICBuZXh0IEVMRU0gaWYgIXJlZiAkRWxlbTsKCiAgICAgICAgICAgIHB1c2ggQFRhZ0tleXMsICRTZWxmLT5fR3JhYlRhZ0tleXMoIERhdGEgPT4gJEVsZW0gKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17RGF0YX0gZXEgJ0hBU0gnICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ1RhZ0tleScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBUYWdLZXlzLCAkUGFyYW17RGF0YX0tPnskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkUGFyYW17RGF0YX0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhZ0tleXMsICRTZWxmLT5fR3JhYlRhZ0tleXMoIERhdGEgPT4gJFBhcmFte0RhdGF9LT57JEtleX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFRhZ0tleXM7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yNiAkICREYXRlOiAyMDEwLzAzLzMwIDEzOjI0OjQ4ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1MLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIHhtbCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFhNTC5wbSx2IDEuMTcgMjAxMC8wMy8wMiAxMzo1Nzo1OSBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE3ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTCAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFhNTFZhbHVlTG9va3VwKCkKCmxvb2t1cCBhIHhtbCB2YWx1ZQoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBsb29rdXAgaXRlbSB2YWx1ZQogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gWE1MU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJFZhbHVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBjcmVhdGUgc3RhdHMgYXR0cmlidXRlIGFycmF5CiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIFhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBzZWFyY2ggZGF0YSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19IHx8ICggJFBhcmFte0l0ZW19ICYmIHJlZiAkUGFyYW17SXRlbX0gbmUgJ0hBU0gnICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgcHJlcGFyZSB2YWx1ZQogICAgbXkgJEFycmF5ID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSglUGFyYW0pOwoKICAgIHJldHVybiAkQXJyYXk7Cn0KCj1pdGVtIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBkYXRhIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MRXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gWE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIHNlYXJjaCBkYXRhIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkQXJyYXkgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBcnJheTsKfQoKPWl0ZW0gWE1MSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIGRhdGEgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxJbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gX1hNTFZlcnNpb25TZWFyY2goKQoKU2VhcmNoIHhtbCBkYXRhIG9mIGEgdmVyc2lvbiBhbmQgcmV0dXJuIGEgaGFzaCByZWZlcmVuY2UuClRoZSBDPFdoYXQ+IHBhcmFtZXRlciBpcyBhIGJpdCBsaWtlIHRoZSBwYXJhbWV0ZXIgdXNlZCBpbiBMPFNRTDo6QWJzdHJhY3Q+LgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgaGFzIEM8VmVyc2lvbklEPnMgYXMga2V5cyBhbmQgQzwxPiBhcyB2YWx1ZS4KCiAgICBteSAkVmVyc2lvbklEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvblNlYXJjaCgKICAgICAgICBDbGFzc0lEcyA9PiBbMSwgMiwgM10sICAjIChvcHRpb25hbCkKCiAgICAgICAgV2hhdCA9PiBbCiAgICAgICAgICAgICMgZWFjaCBhcnJheSBlbGVtZW50IGlzIGEgYW5kIGNvbmRpdGlvbgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIG9yIGNvbmRpdGlvbiBpbiBoYXNoCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEElJywKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEIlJywKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIHVzZSBhcnJheSByZWZlcmVuY2UgaWYgZGlmZmVyZW50IGNvbnRlbnQgd2l0aCBzYW1lIGtleSB3YXMgc2VhcmNoZWQKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gWwogICAgICAgICAgICAgICAgICAgICclY29udGVudEMlJywKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnREJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RSUnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJDJ31bJV17J0NvbnRlbnQnfSIgPT4gWwogICAgICAgICAgICAgICAgICAgICclY29udGVudEMlJywKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnREJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RSUnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgaGFzaCByZWZlcmVuY2UgZm9yIHNwZWNpZnlpbmcgY29tcGFyaXNvbiBvcHMsIGFwYXJ0IGZyb20gdGhlIGRlZmF1bHQgJ0xJS0UnCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJzwnICAgICAgICA9PiAnYWxwaGFiZXRpY2FsbHlfbG93ZXJfb3JfZXF1YWwnIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJzw9JyAgICAgICA9PiAnYWxwaGFiZXRpY2FsbHlfbGVzc19vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPScgICAgICAgID0+ICdleGFjdF9tYXRjaCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPj0nICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sYXJnZXJfb3JfZXF1YWwnIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJz4nICAgICAgICA9PiAnYWxwaGFiZXRpY2FsbHlfbGFyZ2VyJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICctYmV0d2VlbicgPT4gWyAnbG93ZXJfYm91bmQnLCAndXBwZXJfYm91bmQnIF0gfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAoKICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTFZlcnNpb25TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9IHx8IHJlZiAkUGFyYW17V2hhdH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgV2hhdCBhcyBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte1doYXR9IH0gKSB7CgogICAgICAgIFZBTFVFUzoKICAgICAgICBmb3IgbXkgJFZhbHVlcyAoIHZhbHVlcyAleyRSb3d9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRVMgaWYgISRWYWx1ZXM7CgogICAgICAgICAgICAjIG1ha2Ugc3Vic3RpdHV0aW9ucyBmb3Igc2VsZWN0aW5nIHdpdGggJ0xJS0UnCiAgICAgICAgICAgIGlmICggIXJlZiAkVmFsdWVzICkgewogICAgICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCRWYWx1ZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkVmFsdWVzIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFZhbHVlICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJFZhbHVlICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0IFZBTFVFUzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkVmFsdWVzIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIG5vdGhpbmcgdG8gZG8sCiAgICAgICAgICAgICAgICAjIGFzIHNwZWNpYWwgY29tcGFyaXNvbiBvcHMgZG8gbm90IG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yICdMSUtFJyBjb21wYXJpc29ucwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtDbGFzc0lEc30gfHwgcmVmICRQYXJhbXtDbGFzc0lEc30gbmUgJ0FSUkFZJyB8fCAhQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gPSBrZXlzICV7JENsYXNzTGlzdH07CiAgICB9CgogICAgIyBzZWFyY2ggaW4gYWN0aXZlIHZlcnNpb25zCiAgICBteSAlVmVyc2lvbklEczsKICAgIGZvciBteSAkQ2xhc3NJRCAoIEB7ICRQYXJhbXtDbGFzc0lEc30gfSApIHsKCiAgICAgICAgIyBzdGFydCB4bWwgc2VhcmNoCiAgICAgICAgbXkgQEtleXMgPSAkU2VsZi0+X1hNTEhhc2hTZWFyY2goCiAgICAgICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRDbGFzc0lEIiwKICAgICAgICAgICAgV2hhdCA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgYWxsIGlkcyB0byB2ZXJzaW9uIGlkIGhhc2gKICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoQEtleXMpIHsKICAgICAgICAgICAgJFZlcnNpb25JRHN7JFZlcnNpb25JRH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVWZXJzaW9uSURzIGlmICEkUGFyYW17UHJldmlvdXNWZXJzaW9uU2VhcmNofTsKCiAgICAjIHNlYXJjaCBhbHNvIGluIG9sZCB2ZXJzaW9ucyAoYXJjaGl2KQogICAgZm9yIG15ICRDbGFzc0lEICggQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIHN0YXJ0IHhtbCBzZWFyY2gKICAgICAgICBteSBAS2V5cyA9ICRTZWxmLT5fWE1MSGFzaFNlYXJjaCgKICAgICAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6QXJjaGl2OjokQ2xhc3NJRCIsCiAgICAgICAgICAgIFdoYXQgPT4gJFBhcmFte1doYXR9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGFsbCBpZHMgdG8gdmVyc2lvbiBpZCBoYXNoCiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKEBLZXlzKSB7CiAgICAgICAgICAgICRWZXJzaW9uSURzeyRWZXJzaW9uSUR9ID0gMQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVWZXJzaW9uSURzOwp9Cgo9aXRlbSBfWE1MVmVyc2lvbkdldCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRBcnJheVJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkdldCgKICAgICAgICBDbGFzc0lEICAgPT4gMSwKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFZlcnNpb25JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uCiAgICBteSBAWE1MID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRQYXJhbXtDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIFxAWE1MIGlmIEBYTUw7CgogICAgIyBnZXQgdmVyc2lvbiBmcm9tIGFyY2hpdgogICAgQFhNTCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjpBcmNoaXY6OiRQYXJhbXtDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIFxAWE1MOwp9Cgo9aXRlbSBfWE1MVmVyc2lvbkFkZCgpCgphZGQgdGhlIHhtbCBkYXRhIG9mIGEgbmV3IHZlcnNpb24gYW5kIG1vdmUgb2xkIHhtbCB2ZXJzaW9ucyBpbiBhcmNoaXYgY2xhc3MKCiAgICBteSAkWE1MSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+X1hNTFZlcnNpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICAgID0+IDEsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDIyMiwKICAgICAgICBWZXJzaW9uSUQgICAgPT4gMTIzLAogICAgICAgIFhNTERhdGEgICAgICA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgQ29uZmlnSXRlbUlEIFZlcnNpb25JRCBYTUxEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHhtbCB2ZXJzaW9uCiAgICBteSAkWE1MSUQgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiAgICAgICAgVHlwZSAgICA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgICAgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgIFhNTEhhc2ggPT4gJFBhcmFte1hNTERhdGF9LAogICAgKTsKCiAgICAjIGdldCBsYXN0IHZlcnNpb25zCiAgICBteSAkT2xkVmVyc2lvbklEcyA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgICMgRmluZCBWZXJzaW9uIHRvIG1vdmUKICAgIG15ICRNb3ZlVmVyc2lvbjsKICAgIE9MRFZFUlNJT05JRDoKICAgIGZvciBteSAkT2xkVmVyc2lvbklEICggQHskT2xkVmVyc2lvbklEc30gKSB7CiAgICAgICAgbGFzdCBPTERWRVJTSU9OSUQgaWYgJE9sZFZlcnNpb25JRCBlcSAkUGFyYW17VmVyc2lvbklEfTsKCiAgICAgICAgJE1vdmVWZXJzaW9uID0gJE9sZFZlcnNpb25JRDsKICAgIH0KCiAgICByZXR1cm4gJFhNTElEIGlmICEkTW92ZVZlcnNpb247CgogICAgIyBtb3ZlIG9sZCB2ZXJzaW9uIGluIGFyY2hpdgogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoTW92ZSgKICAgICAgICBPbGRUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokUGFyYW17Q2xhc3NJRH0iLAogICAgICAgIE9sZEtleSAgPT4gJE1vdmVWZXJzaW9uLAogICAgICAgIE5ld1R5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBOZXdLZXkgID0+ICRNb3ZlVmVyc2lvbiwKICAgICk7CgogICAgcmV0dXJuICRYTUxJRDsKfQoKPWl0ZW0gX1hNTFZlcnNpb25EZWxldGUoKQoKZGVsZXRlIHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkRlbGV0ZSgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWZXJzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZlcnNpb24gZGF0YQogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFBhcmFte1ZlcnNpb25JRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFZlcnNpb247CgogICAgIyBkZWxldGUgeG1sIGRhdGEgZnJvbSBhIHZlcnNpb24KICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaERlbGV0ZSgKICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokVmVyc2lvbi0+e0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSB4bWwgZGF0YSBmcm9tIGFyY2hpdgogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoRGVsZXRlKAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFZlcnNpb24tPntDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkWE1MVHlwZUJhY2tlbmQoKQoKbG9hZCBhIHhtbCBpdGVtIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgKTsKCj1jdXQKCnN1YiBfTG9hZFhNTFR5cGVCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBvYmplY3QgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRYTUxUeXBlQmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRYTUxUeXBlQmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH07CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OiRQYXJhbXtUeXBlfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSBvYmplY3QKICAgICRTZWxmLT57Q2FjaGV9LT57TG9hZFhNTFR5cGVCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKPWl0ZW0gX1hNTEhhc2hTZWFyY2goKQoKU2VhcmNoIGEgeG1sIGhhc2ggZnJvbSBkYXRhYmFzZS4KVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gS2VybmVsOjpTeXN0ZW06OlhNTEhhc2hTZWFyY2gsIGJ1dCBoYXMgc3VwcG9ydCBmb3Igc29tZSBleHRyYSBmZWF0dXJlcy4KQSBzcGVjaWZpYyBvcGVyYXRvciBjYW4gYmUgc3BlY2lmaWVkIGluIGEgaGFzaC4KVGhlIHN5bnRheCBpcyBiYXNlZCBvbiBMPFNRTDo6QWJzdHJhY3Q+LgoKICAgIG15IEBLZXlzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxIYXNoU2VhcmNoKAogICAgICAgIFR5cGUgPT4gJ1NvbWVUeXBlJywKICAgICAgICBXaGF0ID0+IFsKICAgICAgICAgICAgIyBlYWNoIGFycmF5IGVsZW1lbnQgaXMgYSBhbmQgY29uZGl0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgb3IgY29uZGl0aW9uIGluIGhhc2gKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgdXNlIGFycmF5IHJlZmVyZW5jZSBpZiBkaWZmZXJlbnQgY29udGVudCB3aXRoIHNhbWUga2V5IHdhcyBzZWFyY2hlZAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiBbJyVjb250ZW50QyUnLCAnJWNvbnRlbnREJScsICclY29udGVudEUlJ10sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQyd9WyVdeydDb250ZW50J30iID0+IFsnJWNvbnRlbnRDJScsICclY29udGVudEQlJywgJyVjb250ZW50RSUnXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgaGFzaCByZWZlcmVuY2UgZm9yIHNwZWNpZnlpbmcgY29tcGFyaXNvbiBvcHMsIGFwYXJ0IGZyb20gdGhlIGRlZmF1bHQgJ0xJS0UnCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJzwnICAgICAgICAgPT4gJ2FscGhhYmV0aWNhbGx5X2xvd2VyX29yX2VxdWFsJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc8PScgICAgICAgID0+ICdhbHBoYWJldGljYWxseV9sZXNzX29yX2VxdWFsJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICc9JyAgICAgICAgID0+ICdleGFjdF9tYXRjaCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnIT0nICAgICAgICA9PiAnZXhhY3RfbWF0Y2gnIH0sCiAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J0NvbmZpZ0l0ZW1BdHRyQid9WyVdeydDb250ZW50J30iID0+IHsgJz49JyAgICAgICAgPT4gJ2FscGhhYmV0aWNhbGx5X2xhcmdlcl9vcl9lcXVhbCcgfSwKICAgICAgICAgICAgICAgICJbJV17J1ZlcnNpb24nfVslXXsnQ29uZmlnSXRlbUF0dHJCJ31bJV17J0NvbnRlbnQnfSIgPT4geyAnPicgICAgICAgICA9PiAnYWxwaGFiZXRpY2FsbHlfbGFyZ2VyJyB9LAogICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydDb25maWdJdGVtQXR0ckInfVslXXsnQ29udGVudCd9IiA9PiB7ICctYmV0d2VlbicgID0+IFsgJ2xvd2VyX2JvdW5kJywgJ3VwcGVyX2JvdW5kJyBdIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTEhhc2hTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFR5cGUhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBESVNUSU5DVCh4bWxfa2V5KSBGUk9NIHhtbF9zdG9yYWdlIFdIRVJFIHhtbF90eXBlID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VHlwZX0gXSwKICAgICk7CgogICAgIyB0aGUga2V5cyBvZiB0aGlzIGhhc2ggd2lsbCBiZSByZXR1cm5lZAogICAgbXkgJUhhc2g7CgogICAgIyBpbml0aWFsbHkgYWxsIGtleXMgd2l0aCB0aGUgY29ycmVjdCB0eXBlIGFyZSBwb3NzaWJsZQogICAgd2hpbGUgKCBteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEhhc2h7ICREYXRhWzBdIH0gPSAxOwogICAgfQoKICAgIGlmICggJFBhcmFte1doYXR9ICYmIHJlZiAkUGFyYW17V2hhdH0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgbXkgJU9wSXNTdXBwb3J0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gKCAnPCcsICc8PScsICc9JywgJyE9JywgJz49JywgJz4nLCAnLWJldHdlZW4nICk7CgogICAgICAgICMgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSAnYW5kJyBjb21iaW5lZAogICAgICAgIGZvciBteSAkQW5kICggQHsgJFBhcmFte1doYXR9IH0gKSB7CgogICAgICAgICAgICAjIHRoZSBrZXkvdmFsdWUgcGFpcnMgYXJlICdvcicgY29tYmluZWQKICAgICAgICAgICAgbXkgQE9yQ29uZGl0aW9uczsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQW5kfSApIHsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRBbmQtPnskS2V5fTsKICAgICAgICAgICAgICAgICRLZXkgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRLZXksICdMaWtlJyApOwogICAgICAgICAgICAgICAgaWYgKCAkVmFsdWUgJiYgcmVmICRWYWx1ZSBlcSAnQVJSQVknICkgewoKICAgICAgICAgICAgICAgICAgICAjIHdoZW4gYW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIGlzIGdpdmVuLAogICAgICAgICAgICAgICAgICAgICMgd2UgdXNlICdMSUtFJy1jb25kaXRpb25zIGFuZCBjb21iaW5lIHRoZW0gd2l0aCAnT1InCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHskVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJEVsZW1lbnQsICdMaWtlJyApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBPckNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICh4bWxfY29udGVudF9rZXkgTElLRSAnJEtleScgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQU5EIHhtbF9jb250ZW50X3ZhbHVlIExJS0UgJyRFbGVtZW50JykiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFZhbHVlICYmIHJlZiAkVmFsdWUgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGEgaGFzaHJlZiBpbmRpY2F0ZXMgYSBzcGVjaWZpYyBjb21wYXJpc29uIG9wCiAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50bHkgb25seSBhIHNpbmdsZSBvcCwgd2l0aCBhIHNpbmdsZSB2YWx1ZSwgaXMgc3VwcG9ydGVkCgogICAgICAgICAgICAgICAgICAgICMgVW5kZXIgT3JhY2xlIHRoZSBhdHRyaWJ1dGUgJ3htbF9jb250ZW50X3ZhbHVlJyBpcyBhIENMT0IsCiAgICAgICAgICAgICAgICAgICAgIyBhIENoYXJhY3RlciBMb2NhdG9yIE9iamVjdC4gV2hpbGUgc2VsZWN0aW9uIHdpdGggTElLRSBpcyBwb3NzaWJsZSwKICAgICAgICAgICAgICAgICAgICAjIHRoZSBhbHBoYWJldGljYWwgY29tcGFyaXNvbiBvcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgIyBTZWUgaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vZG9jcy9jZC9CMTIwMzdfMDEvYXBwZGV2LjEwMS9iMTA3OTYvXAogICAgICAgICAgICAgICAgICAgICMgYWRsb2Jfc3EuaHRtIzEwMDYyMTUKICAgICAgICAgICAgICAgICAgICAjIEFzIGEgd29ya2Fyb3VuZCB3ZSBjYXN0IHRoZSBDTE9CIHRvIGEgVkFSQ0hBUjIgd2l0aCBUT19DSEFSKCkuCiAgICAgICAgICAgICAgICAgICAgbXkgJHhtbF9jb250ZW50X3ZhbHVlID0gJ3htbF9jb250ZW50X3ZhbHVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdUeXBlJykgZXEgJ29yYWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR4bWxfY29udGVudF92YWx1ZSA9ICdUT19DSEFSKHhtbF9jb250ZW50X3ZhbHVlKSc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAoJE9wKSA9IGtleXMgJXskVmFsdWV9OwogICAgICAgICAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFZhbHVlLT57JE9wfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRPcCAmJiAkT3AgZXEgJy1iZXR3ZWVuJyAmJiByZWYgJEVsZW1lbnQgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJExvd2VyQm91bmQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRFbGVtZW50LT5bMF0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFVwcGVyQm91bmQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRFbGVtZW50LT5bMV0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAT3JDb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIHhtbF9jb250ZW50X2tleSBMSUtFICckS2V5JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJBTkQgJHhtbF9jb250ZW50X3ZhbHVlID49ICckTG93ZXJCb3VuZCcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQU5EICR4bWxfY29udGVudF92YWx1ZSA8PSAnJFVwcGVyQm91bmQnICkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRPcCAmJiAkT3BJc1N1cHBvcnRlZHskT3B9ICYmICFyZWYgJEVsZW1lbnQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAT3JDb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIHhtbF9jb250ZW50X2tleSBMSUtFICckS2V5JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJBTkQgJHhtbF9jb250ZW50X3ZhbHVlICRPcCAnJEVsZW1lbnQnICkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0dvdCB1bmV4cGVjdGVkIGRhdGEgaW4gc2VhcmNoIScsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQE9yQ29uZGl0aW9ucywgJyggMSA9IDEgKSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgd2hlbiBhIHNpbmdsZSAgcG9zc2libGUgdmFsdWUgaXMgZ2l2ZW4sCiAgICAgICAgICAgICAgICAgICAgIyB3ZSB1c2UgYSAnTElLRSctY29uZGl0aW9uCiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVmFsdWUsICdMaWtlJyApOwogICAgICAgICAgICAgICAgICAgIHB1c2ggQE9yQ29uZGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIiAoeG1sX2NvbnRlbnRfa2V5IExJS0UgJyRLZXknICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiQU5EIHhtbF9jb250ZW50X3ZhbHVlIExJS0UgJyRWYWx1ZScgKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYXNzZW1ibGUgdGhlIFNRTAogICAgICAgICAgICBteSAkU1FMID0gJ1NFTEVDVCBESVNUSU5DVCh4bWxfa2V5KSBGUk9NIHhtbF9zdG9yYWdlIFdIRVJFIHhtbF90eXBlID0gPyAnOwogICAgICAgICAgICBpZiAoQE9yQ29uZGl0aW9ucykgewogICAgICAgICAgICAgICAgJFNRTCAuPSAnQU5EICggJyAuIGpvaW4oICcgT1IgJywgQE9yQ29uZGl0aW9ucyApIC4gJyApJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBleGVjdXRlCiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VHlwZX0gXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQga2V5IHNldCwgYW5kIHRoZSBrZXlzIGZyb20gdGhlIGxhc3QgJ1NFTEVDVCcKICAgICAgICAgICAgIyBvbmx5IHRoZSBrZXlzIHdoaWNoIGFyZSBpbiBhbGwgcmVzdWx0cyBzdXJ2aXZlCiAgICAgICAgICAgIG15ICVIYXNoTmV3OwogICAgICAgICAgICB3aGlsZSAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEhhc2h7ICREYXRhWzBdIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2hOZXd7ICREYXRhWzBdIH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICVIYXNoID0gJUhhc2hOZXc7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBLZXlzID0ga2V5cyAlSGFzaDsKCiAgICByZXR1cm4gQEtleXM7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE3ICQgJERhdGU6IDIwMTAvMDMvMDIgMTM6NTc6NTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRXZlbnQvRG9IaXN0b3J5LnBtIC0gYSBldmVudCBtb2R1bGUgZm9yIGNvbmZpZyBpdGVtcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRG9IaXN0b3J5LnBtLHYgMS4xMSAyMDEwLzAxLzI5IDE2OjUwOjIyIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkV2ZW50OjpEb0hpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5IC0gRXZlbnQgaGFuZGxlciB0aGF0IGRvZXMgdGhlIGhpc3RvcnkKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBoaXN0b3J5LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5OwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJERvSGlzdG9yeU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeS0+bmV3KAogICAgICAgIENvbmZpZ0l0ZW1PYmplY3QgPT4gJENvbmZpZ0l0ZW1PYmplY3QsCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgID0+ICRUaW1lT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBldmVudC4KCiAgICAkRG9IaXN0b3J5T2JqZWN0LT5SdW4oCiAgICAgICAgRXZlbnQgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICduZXcgdmFsdWU6IDEnLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXMgRGVmaW5pdGlvbkNyZWF0ZSBkb2VzIG5vdCBiZWxvbmcgdG8gYW4gaXRlbSwgd2UgZG9uJ3QgY3JlYXRlCiAgICAjIGEgaGlzdG9yeSBlbnRyeQogICAgaWYgKCAkUGFyYW17RXZlbnR9ICYmICRQYXJhbXtFdmVudH0gZXEgJ0RlZmluaXRpb25DcmVhdGUnICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZHVlIHRvIGNvbnNpc3RlbmN5IHdpdGggdGlja2V0IGhpc3RvcnksIHdlIG5lZWQgSGlzdG9yeVR5cGUKICAgICRQYXJhbXtIaXN0b3J5VHlwZX0gPSAkUGFyYW17RXZlbnR9OwoKICAgICMgZGlzcGF0Y2ggdGFibGUgZm9yIGFsbCBldmVudHMKICAgIG15ICVEaXNwYXRjaGVyID0gKAogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGUgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIENvbmZpZ0l0ZW1EZWxldGUgICAgICA9PiBcJl9Db25maWdJdGVtRGVsZXRlLAogICAgICAgIExpbmtBZGQgICAgICAgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIExpbmtEZWxldGUgICAgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIE5hbWVVcGRhdGUgICAgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIEluY2lkZW50U3RhdGVVcGRhdGUgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIERlcGxveW1lbnRTdGF0ZVVwZGF0ZSA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIERlZmluaXRpb25VcGRhdGUgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25DcmVhdGUgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZhbHVlVXBkYXRlICAgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIERlZmluaXRpb25DcmVhdGUgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25EZWxldGUgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgKTsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBpZiAoICFleGlzdHMgJERpc3BhdGNoZXJ7ICRQYXJhbXtFdmVudH0gfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ25vbiBleGlzdGFudCBoaXN0b3J5IHR5cGU6ICcgLiAkUGFyYW17RXZlbnR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgY2FsbGJhY2sKICAgIG15ICRTdWIgPSAkRGlzcGF0Y2hlcnsgJFBhcmFte0V2ZW50fSB9OwogICAgJFNlbGYtPiRTdWIoCiAgICAgICAgJVBhcmFtLAogICAgICAgICV7ICRQYXJhbXtEYXRhfSB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NvbmZpZ0l0ZW1EZWxldGUoKQoKaGlzdG9yeSdzIGV2ZW50IGhhbmRsZXIgZm9yIENvbmZpZ0l0ZW1EZWxldGUKCj1jdXQKCnN1YiBfQ29uZmlnSXRlbURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGhpc3RvcnkKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkhpc3RvcnlEZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0hpc3RvcnlBZGQoKQoKaGlzdG9yeSdzIGRlZmF1bHQgZXZlbnQgaGFuZGxlci4KCj1jdXQKCnN1YiBfSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIGhpc3RvcnkgZW50cnkKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1oZWFkMSBWRVJTSU9OCgokSWQ6IERvSGlzdG9yeS5wbSx2IDEuMTEgMjAxMC8wMS8yOSAxNjo1MDoyMiByZWIgRXhwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyL0F1dG9JbmNyZW1lbnQucG0gLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEF1dG9JbmNyZW1lbnQucG0sdiAxLjMgMjAwOS8wOC8xOCAyMjoxMTo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6QXV0b0luY3JlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQgLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGF1dG8gaW5jcmVtZW50IGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIF9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKCkKCmNyZWF0ZSBhIG5ldyBjb25maWcgaXRlbSBudW1iZXIKCiAgICBteSAkTnVtYmVyID0gJEJhY2tlbmRPYmplY3QtPl9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfQ29uZmlnSXRlbU51bWJlckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gaWQKICAgIG15ICRTeXN0ZW1JRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgZ2V0IGN1cnJlbnQgY291bnRlcgogICAgbXkgJEN1cnJlbnRDb3VudGVyID0gJFNlbGYtPkN1cnJlbnRDb3VudGVyR2V0KAogICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgKSB8fCAwOwoKICAgIENJUEhFUjoKICAgIGZvciBteSAkQ2lwaGVyICggMSAuLiAxXzAwMF8wMDBfMDAwICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgbnVtYmVyCiAgICAgICAgbXkgJE51bWJlciA9ICRTeXN0ZW1JRCAuICRQYXJhbXtDbGFzc0lEfSAuIHNwcmludGYoICIlMDZkIiwgKCAkQ3VycmVudENvdW50ZXIgKyAkQ2lwaGVyICkgKTsKCiAgICAgICAgIyBmaW5kIGV4aXN0aW5nIG51bWJlcgogICAgICAgIG15ICREdWJsaWNhdGUgPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAkTnVtYmVyLAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0lQSEVSIGlmICREdWJsaWNhdGU7CgogICAgICAgICMgc2V0IGNvdW50ZXIKICAgICAgICAkU2VsZi0+Q3VycmVudENvdW50ZXJTZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICdBdXRvSW5jcmVtZW50JywKICAgICAgICAgICAgQ291bnRlciA9PiAoICRDdXJyZW50Q291bnRlciArICRDaXBoZXIgKSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE51bWJlcjsKICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wOC8xOCAyMjoxMTo1MiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vUGVybWlzc2lvbi9DbGFzc0dyb3VwQ2hlY2sucG0gLSBjaGVjayBpZiBhIHVzZXIgYmVsb25ncyB0byBhIGdyb3VwCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDbGFzc0dyb3VwQ2hlY2sucG0sdiAxLjIgMjAxMC8wMS8xNCAyMzoyOToyMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246OkNsYXNzR3JvdXBDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzc0dyb3VwQ2hlY2sgLSBjaGVjayBpZiBhIHVzZXIgYmVsb25ncyB0byBhIGdyb3VwCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzc0dyb3VwQ2hlY2s7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENoZWNrT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpDbGFzc0dyb3VwQ2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgQ29uZmlnSXRlbU9iamVjdCAgICAgPT4gJENvbmZpZ0l0ZW1PYmplY3QsCiAgICAgICAgR2VuZXJhbENhdGFsb2dPYmplY3QgPT4gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgR2VuZXJhbENhdGFsb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntHcm91cE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgp0aGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjayBpZiB0aGUgdXNlIGJlbG9uZ3MgdG8gYSBnaXZlbiBncm91cAoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgID0+IDEyMywKICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgQ2xhc3NJRCA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M6OkNvbXB1dGVyJywKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQgVHlwZSBDbGFzc0lEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IENsYXNzIGRhdGEKICAgIG15ICRDbGFzc0l0ZW0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCggSXRlbUlEID0+ICRQYXJhbXtDbGFzc0lEfSApOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSBAR3JvdXBJRHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGxvb2tpbmcgZm9yIGdyb3VwIGlkLCByZXR1cm4gYWNjZXNzIGlmIHVzZXIgaXMgaW4gZ3JvdXAKICAgIGZvciBteSAkR3JvdXBJRCAoQEdyb3VwSURzKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJENsYXNzSXRlbS0+e1Blcm1pc3Npb259ICYmICRHcm91cElEIGVxICRDbGFzc0l0ZW0tPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICAjIHJldHVybiBubyBhY2Nlc3MKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMTAvMDEvMTQgMjM6Mjk6MjAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vUGVybWlzc2lvbi9JdGVtQ2xhc3NHcm91cENoZWNrLnBtIC0gY2hlY2sgaWYgYSB1c2VyIGNhbiBhY2Nlc3MgYW4gaXRlbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSXRlbUNsYXNzR3JvdXBDaGVjay5wbSx2IDEuMiAyMDEwLzAxLzE0IDIzOjI5OjQwIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6SXRlbUNsYXNzR3JvdXBDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtQ2xhc3NHcm91cENoZWNrIC0gY2hlY2sgaWYgYSB1c2VyIGNhbiBhY2Nlc3MgYW4gaXRlbQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgY29uZmlnIGl0ZW0gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb246Okl0ZW1DbGFzc0dyb3VwQ2hlY2s7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENoZWNrT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uOjpJdGVtQ2xhc3NHcm91cENoZWNrLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIENvbmZpZ0l0ZW1PYmplY3QgICAgID0+ICRDb25maWdJdGVtT2JqZWN0LAogICAgICAgIEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0+ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBDb25maWdJdGVtT2JqZWN0IEdlbmVyYWxDYXRhbG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKdGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2sgaWYgdGhlIHVzZXIgY2FuIGFjY2VzcyBhbiBpdGVtCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgSXRlbUlEID0+IDM0NSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQgVHlwZSBJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gZGF0YQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgIyBnZXQgQ2xhc3MgZGF0YQogICAgbXkgJENsYXNzSXRlbSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9CiAgICApOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSBAR3JvdXBJRHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGxvb2tpbmcgZm9yIGdyb3VwIGlkLCByZXR1cm4gYWNjZXNzIGlmIHVzZXIgaXMgaW4gZ3JvdXAKICAgIGZvciBteSAkR3JvdXBJRCAoQEdyb3VwSURzKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJENsYXNzSXRlbS0+e1Blcm1pc3Npb259ICYmICRHcm91cElEIGVxICRDbGFzc0l0ZW0tPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICAjIHJldHVybiBubyBhY2Nlc3MKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMTAvMDEvMTQgMjM6Mjk6NDAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ3VzdG9tZXIucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEN1c3RvbWVyLnBtLHYgMS42IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkN1c3RvbWVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBjdXN0b21lciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlQ3VzdG9tZXJTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgcmV0dXJuICRDdXN0b21lclNlYXJjaExpc3R7ICRQYXJhbXtWYWx1ZX0gfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDgvMTggMjI6MTg6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZS5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGF0ZS5wbSx2IDEuNCAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBkYXRlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZGF0ZSBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA5LzA4LzE4IDIyOjE4OjE5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZVRpbWUucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGVUaW1lLnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkRhdGVUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZVRpbWUgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSBkYXRlIHRpbWUgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYgMjI6MDEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX0gfHwgJyc7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybjsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wOC8xOCAyMjoxODoxOSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRHVtbXkucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IER1bW15LnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkR1bW15OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RHVtbXkgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZHVtbXkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZHVtbXkgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA5LzA4LzE4IDIyOjE4OjE5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvR2VuZXJhbENhdGFsb2cucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTAvMDMvMDIgMTQ6MDk6NDggYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpHZW5lcmFsQ2F0YWxvZyAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBnZW5lcmFsIGNhdGFsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtWYWx1ZX07CgogICAgIyBnZXQgaXRlbSBsaXN0CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJdGVtTGlzdDsKICAgIHJldHVybiBpZiByZWYgJEl0ZW1MaXN0IG5lICdIQVNIJzsKCiAgICBteSAkVmFsdWUgPSAkSXRlbUxpc3QtPnsgJFBhcmFte1ZhbHVlfSB9OwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgS2V5ICA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRJdGVtTGlzdCB8fCB7fSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICBAVmFsdWVzID0gZ3JlcCB7JF99IEBWYWx1ZXM7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuICRJdGVtTGlzdC0+eyAkUGFyYW17VmFsdWV9IH0gfHwgJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICBAVmFsdWVzID0gZ3JlcCB7JF99IEBWYWx1ZXM7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyByZXZlcnNlIHRoZSBsaXN0CiAgICBteSAlTmFtZTJJRCA9IHJldmVyc2UgJXskSXRlbUxpc3R9OwoKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ0lEID0gJE5hbWUySUR7ICRQYXJhbXtWYWx1ZX0gfTsKCiAgICBpZiAoICEkR2VuZXJhbENhdGFsb2dJRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdlbmVyYWwgY2F0YWxvZyBsb29rdXAgb2YnJFBhcmFte1ZhbHVlfScgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRHZW5lcmFsQ2F0YWxvZ0lEOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMTAvMDMvMDIgMTQ6MDk6NDggJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvSW50ZWdlci5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW50ZWdlci5wbSx2IDEuNSAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpJbnRlZ2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6SW50ZWdlciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBpbnRlZ2VyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgaW50ZWdlciBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm47Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dC5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGV4dC5wbSx2IDEuNiAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dEFyZWEucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRleHRBcmVhLnBtLHYgMS42IDIwMDkvMDkvMDMgMTM6NTE6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlRleHRBcmVhOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dEFyZWEgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgdGV4dGFyZWEgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNQ29uZmlnSXRlbS5wbSAtIHRvIGxpbmsgY29uZmlnIGl0ZW0gb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjE1IDIwMTAvMDMvMjUgMTg6MzA6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IExpbmtPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0xpc3RXaXRoRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMaW5rTGlzdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0gfSApIHsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICgga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEKICAgICAgICAgICAgICAgIG15ICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgY29uZmlnIGl0ZW0gY2FuIG5vdCBnZXQKICAgICAgICAgICAgICAgIGlmICggISRWZXJzaW9uRGF0YSB8fCByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJyB8fCAhJXskVmVyc2lvbkRhdGF9ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JENvbmZpZ0l0ZW1JRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdmVyc2lvbiBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JENvbmZpZ0l0ZW1JRH0gPSAkVmVyc2lvbkRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICJDb25maWdJdGVtIyAxMjM0NDU1IiwKICAgICAgICBMb25nICAgPT4gIkNvbmZpZ0l0ZW0jIDEyMzQ0NTU6IFRoZSBDb25maWcgSXRlbSBUaXRsZSIsCiAgICApOwoKICAgICVEZXNjcmlwdGlvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3REZXNjcmlwdGlvbkdldCgKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERlc2NyaXB0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBLZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgbXkgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAnQ29uZmlnSXRlbScsCiAgICAgICAgTG9uZyAgID0+ICdDb25maWdJdGVtJywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICBteSAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFZlcnNpb25EYXRhOwogICAgcmV0dXJuIGlmIHJlZiAkVmVyc2lvbkRhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmICEleyRWZXJzaW9uRGF0YX07CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gIkNvbmZpZ0l0ZW0jICRWZXJzaW9uRGF0YS0+e051bWJlcn0iLAogICAgICAgIExvbmcgICA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb25EYXRhLT57TnVtYmVyfTogJFZlcnNpb25EYXRhLT57TmFtZX0iLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTdWJPYmplY3QgICAgPT4gJzI1JywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMKICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9IHx8PSB7fTsKCiAgICAjIHNldCBmb2N1cwogICAgbXkgJVNlYXJjaDsKICAgIGZvciBteSAkRWxlbWVudCAocXcoTnVtYmVyIE5hbWUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgJFNlYXJjaHskRWxlbWVudH0gPSAnKicgLiAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSAuICcqJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1N1Yk9iamVjdH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgd2l0aCB0aGUgZGVmYXVsdCBzdWJvYmplY3RzCiAgICAgICAgbXkgJERlZmF1bHRTdWJvYmplY3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6RGVmYXVsdFN1Yk9iamVjdCcpIHx8IHt9OwoKICAgICAgICAjIGV4dHJhY3QgZGVmYXVsdCBjbGFzcyBuYW1lCiAgICAgICAgbXkgJERlZmF1bHRDbGFzcyA9ICREZWZhdWx0U3Vib2JqZWN0LT57SVRTTUNvbmZpZ0l0ZW19IHx8ICcnOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRDbGFzc0xpc3Q7CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAgICAgIyBsb29rdXAgdGhlIGNsYXNzIGlkCiAgICAgICAgbXkgJUNsYXNzTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JENsYXNzTGlzdH07CiAgICAgICAgJFBhcmFte1N1Yk9iamVjdH0gPSAkQ2xhc3NMaXN0UmV2ZXJzZXskRGVmYXVsdENsYXNzfSB8fCAnJzsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtTdWJPYmplY3R9OwoKICAgICMgc2VhcmNoIHRoZSBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtSURzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICV7ICRQYXJhbXtTZWFyY2hQYXJhbXN9IH0sCiAgICAgICAgJVNlYXJjaCwKICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkUGFyYW17U3ViT2JqZWN0fSBdLAogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAwLAogICAgICAgIFVzaW5nV2lsZGNhcmRzICAgICAgICA9PiAxLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICBMaW1pdCAgICAgICAgICAgICAgICAgPT4gNTAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbUlEc30gKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICAgICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uRGF0YTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJzsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJXskVmVyc2lvbkRhdGF9OwoKICAgICAgICAjIGFkZCB2ZXJzaW9uIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRDb25maWdJdGVtSUR9ID0gJFZlcnNpb25EYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGxpbmtlZCBvYmplY3QKICAgIG15ICRJRCAgICAgPSAkUGFyYW17VGFyZ2V0S2V5fSAgICB8fCAkUGFyYW17U291cmNlS2V5fTsKICAgIG15ICRPYmplY3QgPSAkUGFyYW17VGFyZ2V0T2JqZWN0fSB8fCAkUGFyYW17U291cmNlT2JqZWN0fTsKCiAgICAjIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIHRoaXMgQ0kKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkN1ckluY2lTdGF0ZVJlY2FsYygKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0tleX0sCiAgICApOwoKICAgICMgdHJpZ2dlciBMaW5rQWRkIGV2ZW50CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0xpbmtBZGQnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJElEIC4gJyUlJyAuICRPYmplY3QsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUHJlKCkKCmxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUG9zdCgpCgpsaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgIyBnZXQgaW5mb3JtYXRpb24gYWJvdXQgbGlua2VkIG9iamVjdAogICAgbXkgJElEICAgICA9ICRQYXJhbXtUYXJnZXRLZXl9ICAgIHx8ICRQYXJhbXtTb3VyY2VLZXl9OwogICAgbXkgJE9iamVjdCA9ICRQYXJhbXtUYXJnZXRPYmplY3R9IHx8ICRQYXJhbXtTb3VyY2VPYmplY3R9OwoKICAgICMgcmVjYWxjdWxhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBDSQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgIyB0cmlnZ2VyIExpbmtEZWxldGUgZXZlbnQKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnTGlua0RlbGV0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkSUQgLiAnJSUnIC4gJE9iamVjdCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZS9QcmVmZXJlbmNlc0RCLnBtIC0gc29tZSB1c2VyIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogUHJlZmVyZW5jZXNEQi5wbSx2IDEuMSAyMDEwLzA0LzEzIDE3OjQzOjM3IHViIEV4cCAkCiMgJE9sZElkOiBQcmVmZXJlbmNlc0RCLnBtLHYgMS4yIDIwMDkvMDIvMTYgMTE6NDc6MzQgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U6OlByZWZlcmVuY2VzREI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIHByZWZlcmVuY2VzIHRhYmxlIGRhdGEKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gICAgICAgICAgPSAnc2VydmljZV9wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgICAgID0gJ3ByZWZlcmVuY2VzX2tleSc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gICAgID0gJ3ByZWZlcmVuY2VzX3ZhbHVlJzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZVNlcnZpY2VJRH0gPSAnc2VydmljZV9pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU2VydmljZVByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU2VydmljZUlEIEtleSBWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBvbGQgZGF0YQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICIKICAgICAgICAgICAgLiAiJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlU2VydmljZUlEfSA9ID8gQU5EICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0gPSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0tleX0gXSwKICAgICk7CgogICAgIyBpbnNlcnQgbmV3IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9ICgkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVTZXJ2aWNlSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17S2V5fSwgXCRQYXJhbXtWYWx1ZX0gXSwKICAgICk7Cn0KCnN1YiBTZXJ2aWNlUHJlZmVyZW5jZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgIyBjaGVjayBpZiBzZXJ2aWNlIHByZWZlcmVuY2VzIGFyZSBhdmFpbGFibGUKIyAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2VydmljZVByZWZlcmVuY2VzJykgKSB7CiMgICAgICAgIHJldHVybjsKIyAgICB9CiMgLS0tCgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ICIKICAgICAgICAgICAgLiAiIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVTZXJ2aWNlSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgKTsKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIHJldHVybiBkYXRhCiAgICByZXR1cm4gJURhdGE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ29uZmlnSXRlbS5wbSAtIGFsbCBkeW5hbWljIGl0c20gY29uZmlnIGl0ZW0gc3RhdHMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuNCAyMDEwLzAyLzIyIDEwOjA3OjEyIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICdJVFNNQ29uZmlnSXRlbSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzM4MzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgICMgY3JlYXRlIG9iamVjdCBhdHRyaWJ1dGUgYXJyYXkKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDbGFzc0lEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0RlcGxTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdJbmNpZGVudCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2hhbmdlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDaGFuZ2VUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRpbWVTdGFtcCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIHRoZSB4bWwgZGF0YQogICAgQ0xBU1NJRDoKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIGdldCB4bWwgZGVmaW5pdGlvbiBoYXNoCiAgICAgICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NJRCBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9OwoKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgT2JqZWN0QXR0cmlidXRlcyA9PiBcQE9iamVjdEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gICAgPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAnWE1MOjonIC4gJENsYXNzSUQsCiAgICAgICAgICAgIFByZWZpeE5hbWUgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIF9YTUxBdHRyaWJ1dGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICRQYXJhbXtQcmVmaXh9IC49ICc6Oic7CiAgICB9CiAgICBpZiAoICRQYXJhbXtQcmVmaXhOYW1lfSApIHsKICAgICAgICAkUGFyYW17UHJlZml4TmFtZX0gLj0gJzo6JzsKICAgIH0KCiAgICAkUGFyYW17TGV2ZWx9ICAgICAgfHw9IDA7CiAgICAkUGFyYW17UHJlZml4fSAgICAgfHw9ICcnOwogICAgJFBhcmFte1ByZWZpeE5hbWV9IHx8PSAnJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTZWFyY2hhYmxlfSAmJiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIGNyZWF0ZSBrZXkgYW5kIG5hbWUKICAgICAgICBteSAkS2V5ICA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9OwogICAgICAgIG15ICROYW1lID0gJFBhcmFte1ByZWZpeE5hbWV9IC4gJEl0ZW0tPntOYW1lfTsKCiAgICAgICAgIyBhZGQgYXR0cmlidXRlCiAgICAgICAgbXkgJEF0dHJpYnV0ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkQXR0cmlidXRlOwogICAgICAgIG5leHQgSVRFTSBpZiByZWYgJEF0dHJpYnV0ZSBuZSAnQVJSQVknOwogICAgICAgIG5leHQgSVRFTSBpZiAhc2NhbGFyIEB7JEF0dHJpYnV0ZX07CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZXMgdG8gb2JqZWN0IGFycmF5CiAgICAgICAgcHVzaCBAeyAkUGFyYW17T2JqZWN0QXR0cmlidXRlc30gfSwgQHskQXR0cmlidXRlfTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBsaW1pdAogICAgJFBhcmFte0xpbWl0fSA9IDFfMDAwXzAwMDsKCiAgICAjIGV4dHJhY3QgYWxsIHhtbCBwYXJhbSBrZXlzIGZyb20gdGhlIHBhcmFtIGhhc2gKICAgIG15IEBYTUxQYXJhbXMgPSBncmVwIHsgJF8gPX4gbXtcQSBYTUw6On14bXMgfSBrZXlzICVQYXJhbTsKCiAgICBpZiAoQFhNTFBhcmFtcykgewogICAgICAgIHJldHVybiAnWW91IG11c3QgZGVmaW5lZCBhIGNsYXNzIGluIG9uZSBheGlzLicgaWYgISRQYXJhbXtDbGFzc0lEc307CiAgICAgICAgcmV0dXJuICdZb3UgbXVzdCBkZWZpbmVkIGEgY2xhc3MgaW4gb25lIGF4aXMuJyBpZiByZWYgJFBhcmFte0NsYXNzSURzfSBuZSAnQVJSQVknOwogICAgfQoKICAgIG15ICVYTUxDbGFzc0lEczsKICAgIGZvciBteSAkUGFyYW1LZXkgKEBYTUxQYXJhbXMpIHsKCiAgICAgICAgIyBleHRyYWN0IHNlYXJjaCB2YWx1ZXMKICAgICAgICBteSAkU2VhcmNoVmFsdWVzID0gJFBhcmFteyRQYXJhbUtleX07CgogICAgICAgICMgcHJlcGFyZSBwYXJhbSB2YWx1ZQogICAgICAgIGlmICggIXJlZiAkU2VhcmNoVmFsdWVzICkgewogICAgICAgICAgICAkU2VhcmNoVmFsdWVzID0gWyRTZWFyY2hWYWx1ZXNdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBpZiAhQHskU2VhcmNoVmFsdWVzfTsKCiAgICAgICAgIyBzcGxpdCBwYXJhbSBrZXkKICAgICAgICBteSAoICRDbGFzc0lELCAkU2VhcmNoS2V5ICkgPSAkUGFyYW1LZXkgPX4gbXsgXEEgWE1MOjogKCBcZCsgKSA6OiAoLispIFx6IH14bXM7CgogICAgICAgICMgcHJlcGFyZSBzZWFyY2gga2V5CiAgICAgICAgJFNlYXJjaEtleSA9fiBzWyA6OiBdWyd9WyVdeyddeG1zZzsKCiAgICAgICAgIyBBZGQgY2xhc3MgaWQgdG8geG1sIGNsYXNzIGlkIGhhc2gKICAgICAgICAkWE1MQ2xhc3NJRHN7JENsYXNzSUR9ID0gMTsKCiAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiAkU2VhcmNoVmFsdWVzLAogICAgICAgIH07CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgfQoKICAgIGlmICglWE1MQ2xhc3NJRHMpIHsKICAgICAgICBteSBARXhpc3RzID0gZ3JlcCB7ICRYTUxDbGFzc0lEc3skX30gfSBAeyAkUGFyYW17Q2xhc3NJRHN9IH07CgogICAgICAgIHJldHVybiAwIGlmICFARXhpc3RzOwogICAgfQoKICAgICMgc3RhcnQgY29uZmlnIGl0ZW0gZXh0ZW5kZWQgc2VhcmNoCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCglUGFyYW0pOwoKICAgIHJldHVybiBzY2FsYXIgQHskQ29uZmlnSXRlbUlEc307Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEltcG9ydEV4cG9ydE9iamVjdElUU01Db25maWdJdGVtLnQgLSBhbGwgaW1wb3J0IGV4cG9ydCB0ZXN0cyBmb3IgdGhlIElUU01Db25maWdJdGVtIG9iamVjdCBiYWNrZW5kCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRPYmplY3RJVFNNQ29uZmlnSXRlbS50LHYgMS4xMiAyMDEwLzAzLzAyIDE1OjM0OjQ3IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntPYmplY3RCYWNrZW5kT2JqZWN0fQogICAgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57WE1MT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBhZGQgc29tZSB0ZXN0IHRlbXBsYXRlcyBmb3IgbGF0ZXIgY2hlY2tzCm15IEBUZW1wbGF0ZUlEczsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBGb3JtYXQgID0+ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHB1c2ggQFRlbXBsYXRlSURzLCAkVGVtcGxhdGVJRDsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgojIGNoZWNrIG9iamVjdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9iamVjdExpc3QxICYmIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnICYmICRPYmplY3RMaXN0MS0+e0lUU01Db25maWdJdGVtfSwKICAgICJPYmplY3RMaXN0KCkgLSBJVFNNQ29uZmlnSXRlbSBleGlzdHMiLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludCBpbiBEYXRhOjpEdW1wZXIKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCAgID0gMDsKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICAgID0gMTsKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlNvcnRrZXlzID0gMTsKCiAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgbXkgJE9iamVjdEF0dHJpYnV0ZXNHZXQxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBvYmplY3QgYXR0cmlidXRlIHJlZmVyZW5jZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE9iamVjdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkT2JqZWN0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICAgICAiT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb3VudE1heCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJzEwJywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVnZXggICAgICAgID0+IHFyeyBcQSBcZCsgXHogfXhtcywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gNSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJ0lucHV0JyA9PiB7CiAgICAgICAgICAgICAgICAnVHlwZScgPT4gJ0NoZWNrYm94JwogICAgICAgICAgICB9LAogICAgICAgICAgICAnTmFtZScgPT4gJ0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCcsCiAgICAgICAgICAgICdLZXknICA9PiAnRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcycsCiAgICAgICAgfQogICAgXTsKCiAgICAjIGR1bXAgdGhlIGxpc3QgZnJvbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkT2JqZWN0QXR0cmlidXRlc0dldDEpOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCiAgICBteSAkT2JqZWN0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE9iamVjdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT2JqZWN0QXR0cmlidXRlc0dldER1bXAxIGVxICRPYmplY3RBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAgICAgIk9iamVjdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCm15ICRPYmplY3RBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldDIsCiAgICAiT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGFycmF5IHJlZmVyZW5jZSIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgdGVzdCAyIChjaGVjayB3aXRoIG5vbiBleGlzdGluZyB0ZW1wbGF0ZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBvYmplY3QgYXR0cmlidXRlcwpteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQyLAogICAgIk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBmYWxzZSByZXR1cm4iLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIHRvIHRlc3QgRXhwb3J0RGF0YUdldCgpIGFuZCBJbXBvcnREYXRhU2F2ZSgpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzID0gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiMgYWRkIGEgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApmb3IgbXkgJE5hbWUgKHF3KFRlc3QxIFRlc3QyIFRlc3QzIFRlc3Q0KSkgewoKICAgICMgYWRkIGEgbmV3IGl0ZW0KICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJE5hbWUsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpdGVtIGlkCiAgICBpZiAoICEkSXRlbUlEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0uIiwKICAgICAgICApOwogICAgfQp9CgojIGRlZmluZSB0aGUgZmlyc3QgdGVzdCBkZWZpbml0aW9uIChhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcykKbXkgQENvbmZpZ0l0ZW1EZWZpbml0aW9uczsKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1swXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3VzdG9tZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlVGltZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgVGltZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnRHVtbXkxJywKICAgICAgICBOYW1lICA9PiAnRHVtbXkgMScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cxJywKICAgICAgICBOYW1lICAgICAgID0+ICdHZW5lcmFsQ2F0YWxvZyAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICckR2VuZXJhbENhdGFsb2dDbGFzcycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnSW50ZWdlcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0ludGVnZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0MScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dCAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1RleHRBcmVhMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dEFyZWEgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSBzZWNvbmQgdGVzdCBkZWZpbml0aW9uIChzdWIgZGF0YSB0eXBlcykKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1sxXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjEnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIxJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAxJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIyJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAyJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjJTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMiBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LApdICI7CgojIGFkZCB0aGUgdGVzdCBjbGFzc2VzCm15IEBDb25maWdJdGVtQ2xhc3NJRHM7Cm15IEBDb25maWdJdGVtRGVmaW5pdGlvbklEczsKZm9yIG15ICREZWZpbml0aW9uIChAQ29uZmlnSXRlbURlZmluaXRpb25zKSB7CgogICAgIyBnZW5lcmF0ZSBhIHJhbmRvbSBuYW1lCiAgICBteSAkQ2xhc3NOYW1lID0gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2xhc3MgaWQKICAgIGlmICggISRDbGFzc0lEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gY2xhc3MuIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1DbGFzc0lEcywgJENsYXNzSUQ7CgogICAgIyBhZGQgYSBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcwogICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBkZWZpbml0aW9uIGlkCiAgICBpZiAoICEkRGVmaW5pdGlvbklEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbi4iLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ29uZmlnSXRlbURlZmluaXRpb25JRHMsICREZWZpbml0aW9uSUQ7Cn0KCiMgY3JlYXRlIHNvbWUgcmFuZG9tIG51bWJlcnMKbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwpmb3IgKCAxIC4uIDEwICkgewogICAgcHVzaCBAQ29uZmlnSXRlbU51bWJlcnMsIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0Cm15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVEZXBsU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgojIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0Cm15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlSW5jaVN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApteSAkR2VuZXJhbENhdGFsb2dMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJEdlbmVyYWxDYXRhbG9nQ2xhc3MsCik7Cm15ICVHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRHZW5lcmFsQ2F0YWxvZ0xpc3R9OwoKIyBkZWZpbmUgdGhlIHRlc3QgY29uZmlnIGl0ZW1zCm15IEBDb25maWdJdGVtcyA9ICgKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRBcmVhMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYSBzZWNvbmQgY29uZmlnIGl0ZW0gZm9yIGFsbCBwcm92aWRlZCBkYXRhIHR5cGVzCiAgICAjIChkdXBsaWNhdGUgbmFtZSBvZiBmaXJzdCB2ZXJzaW9uIGZvciBzZWFyY2ggY2hlY2tzKQogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywgICAgIyBkdXBsaWNhdGUgbmFtZSBmb3IgdGVzdHMKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRBcmVhMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAyIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA4LTAyLTAyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA4LTAyLTAyIDAzOjU5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYWxDYXRhbG9nMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QyfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dDEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdCBUZXh0IFRlc3QyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRBcmVhMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0MlxuVGV4dCBBcnJheVxuVGVzdCAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIHN1YiBlbGVtZW50IHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnTWFpbjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICdNYWluMSAoMSkgU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICdNYWluMSAoMSkgU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4xICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ01haW4yICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnTWFpbjIgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJ01haW4yICgxKSBTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50JyA9PiAnTWFpbjIgKDEpIFN1YjIgKDIpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIHN1YiBlbGVtZW50IHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBjb25maWcgaXRlbSBmb3Igc3BlY2lhbCBjaGFyYWN0ZXIgdGVzdHMKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSA1IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzFdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBjb25maWcgaXRlbSBmb3IgVVRGLTggdGVzdHMKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNV0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSA2IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzFdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICfihoIg4oW7IOKFmycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAn4piEIOKGriDihrkg4oaSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICfigqQg4oKhIOKCqSDigq8g4oK1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAn4pmKIOKZiCDimYkg4pmKIOKZiyDimY0g4pmRJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAn4pyIIOKdpCDimK4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICfViiDVhCDVgCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnwq4gwqknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+OBiyDjgZIg44KSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAopOwoKIyBhZGQgdGhlIHRlc3QgY29uZmlnIGl0ZW1zCm15IEBDb25maWdJdGVtSURzOwpmb3IgbXkgJENvbmZpZ0l0ZW0gKEBDb25maWdJdGVtcykgewoKICAgICMgYWRkIGEgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtQWRkKAogICAgICAgICV7ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbX0gfSwKICAgICk7CgogICAgIyBjaGVjayBjb25maWcgaXRlbSBpZAogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwoKICAgICMgYWRkIHRoZSB2ZXJzaW9ucwogICAgZm9yIG15ICRWZXJzaW9uICggQHsgJENvbmZpZ0l0ZW0tPntWZXJzaW9uc30gfSApIHsKCiAgICAgICAgIyBhZGQgYSB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25BZGQoCiAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHZlcnNpb24gaWQKICAgICAgICBpZiAoICEkVmVyc2lvbklEICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgdmVyc2lvbi4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEV4cG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgQEV4cG9ydERhdGFUZXN0cyA9ICgKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGV4aXN0aW5nIHRlbXBsYXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWy0xXSArIDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBtYXBwaW5nIGxpc3QgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbM10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobnVtYmVyIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuYW1lIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjYXNlIGluc2Vuc2l0aXZlIG5hbWUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAndW5pdHRlc3QgLSBjb25maWdpdGVtIDEgdmVyc2lvbiAxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5hbWUgYW5kIG51bWJlciBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoZGVwbG95bWVudCBzdGF0ZSBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzFdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoaW5jaWRlbnQgc3RhdGUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMV0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjb21iaW5lZCBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoWE1MIGRhdGEgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgRGF0ZTEgICAgICAgICAgID0+ICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgIFRleHRBcmVhMSAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICBDdXN0b21lcjEgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgIFRleHQxICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgRGF0ZVRpbWUxICAgICAgID0+ICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIEludGVnZXIxICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY29tYmluZWQgYWxsIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRHMgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSURzICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBEYXRlMSAgICAgICAgICAgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgVGV4dEFyZWExICAgICAgID0+ICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgIEN1c3RvbWVyMSAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgVGV4dDEgICAgICAgICAgID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICBEYXRlVGltZTEgICAgICAgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgSW50ZWdlcjEgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIEdlbmVyYWxDYXRhbG9nMSA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcmV0dXJuZWQgYXJyYXkpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoZG91YmxlIGVsZW1lbnQgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRHVtbXkxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnVGVzdDEnLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3ViIGVsZW1lbnQgY2hlY2tzIHdpdGggdW5kZWYgdmFsdWVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcyB3aXRoIHVuZGVmIHZhbHVlcyBhbmQgZW1wdHkgc3RyaW5ncykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjo0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdUZXN0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSA2IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ+KGgiDihbsg4oWbJywKICAgICAgICAgICAgICAgICfimIQg4oauIOKGuSDihpInLAogICAgICAgICAgICAgICAgJ+KCpCDigqEg4oKpIOKCryDigrUnLAogICAgICAgICAgICAgICAgJ+KZiiDimYgg4pmJIOKZiiDimYsg4pmNIOKZkScsCiAgICAgICAgICAgICAgICAn4pyIIOKdpCDimK4nLAogICAgICAgICAgICAgICAgJ9WKINWEINWAJywKICAgICAgICAgICAgICAgICfCriDCqScsCiAgICAgICAgICAgICAgICAn44GLIOOBkiDjgpInLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIEV4cG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEV4cG9ydFRlc3RDb3VudCA9IDE7ClRFU1Q6CmZvciBteSAkVGVzdCAoQEV4cG9ydERhdGFUZXN0cykgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkV4cG9ydFRlc3QgJEV4cG9ydFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgdGhlIG9iamVjdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntPYmplY3REYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9IGVxICdBUlJBWScKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBkZWxldGUgYWxsIGV4aXN0aW5nIG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCByb3dzCiAgICAgICAgTUFQUElOR09CSkVDVERBVEE6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoIEB7ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgYWRkIGEgbmV3IG1hcHBpbmcgcm93CiAgICAgICAgICAgIG15ICRNYXBwaW5nSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJE1hcHBpbmdPYmplY3REYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdGhlIHNlYXJjaCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e1NlYXJjaERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntTZWFyY2hEYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIHNlYXJjaCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57U2VhcmNoRGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0tPkV4cG9ydERhdGFHZXQoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9IH0sCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEV4cG9ydERhdGEsCiAgICAgICAgICAgICJFeHBvcnRUZXN0ICRFeHBvcnRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIHJldHVybiBmYWxzZSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggcmVmICRFeHBvcnREYXRhIG5lICdBUlJBWScgKSB7CgogICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJFeHBvcnRUZXN0ICRFeHBvcnRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSByZWZlcmVuY2UiLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIG51bWJlciBvZiByb3dzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JEV4cG9ydERhdGF9LAogICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZUV4cG9ydERhdGF9IH0sCiAgICAgICAgIkV4cG9ydFRlc3QgJEV4cG9ydFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gY29ycmVjdCBudW1iZXIgb2Ygcm93cyIsCiAgICApOwoKICAgICMgY2hlY2sgY29udGVudCBvZiBleHBvcnQgZGF0YQogICAgbXkgJENvdW50ZXJSb3cgPSAwOwogICAgUk9XOgogICAgZm9yIG15ICRFeHBvcnRSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHRyYWN0IHJlZmVyZW5jZSByb3cKICAgICAgICBteSAkUmVmZXJlbmNlUm93ID0gJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfS0+WyRDb3VudGVyUm93XTsKCiAgICAgICAgaWYgKCByZWYgJEV4cG9ydFJvdyBuZSAnQVJSQVknIHx8IHJlZiAkUmVmZXJlbmNlUm93IG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSBleHBvcnQgcm93IGFuZCByZWZlcmVuY2Ugcm93IG1hdGNoZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgY29sdW1ucwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7JEV4cG9ydFJvd30sCiAgICAgICAgICAgIHNjYWxhciBAeyRSZWZlcmVuY2VSb3d9LAogICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSBjb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlckNvbHVtbiA9IDA7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHskRXhwb3J0Um93fSApIHsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRDZWxsICkgewogICAgICAgICAgICAgICAgJENlbGwgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSApIHsKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGNlbGwgZGF0YQogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ2VsbCwKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0sCiAgICAgICAgICAgICAgICAiRXhwb3J0VGVzdCAkRXhwb3J0VGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyQ29sdW1uKys7CiAgICAgICAgfQoKICAgICAgICAkQ291bnRlclJvdysrOwogICAgfQp9CmNvbnRpbnVlIHsKICAgICRFeHBvcnRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEltcG9ydERhdGFTYXZlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBJbXBvcnREYXRhVGVzdHMgPSAoCgogICAgIyBJbXBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFtdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY2xhc3MgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbLTFdICsgMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBtYXBwaW5nIGxpc3QgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbW9yZSB0aGFuIG9uZSBpZGVudGlmaWVyIHdpdGggdGhlIHNhbWUgbmFtZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnMTIzJywgJzMyMScgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGlkZW50aWZpZXIgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGlkZW50aWZpZXIgaXMgdW5kZWYgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gW3VuZGVmXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGJvdGggaWRlbnRpZmllcnMgYXJlIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGJvdGggaWRlbnRpZmllcnMgYXJlIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBpZGVudGlmaWVycyBpcyBlbXB0eSwgb25lIGlzIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcxMjMnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBpcyB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJzEyMycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnJywgJzEyMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgZW1wdHkgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnMTIzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVE9ETyBBZGQgc29tZSBpZGVudGlmaWVyIHRlc3RzCgogICAgIyBlbXB0eSBuYW1lIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICdQcm9kdWN0aW9uJywgJ09wZXJhdGlvbmFsJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBkZXBsb3ltZW50IHN0YXRlIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAxJywgJ0R1bW15JywgJ09wZXJhdGlvbmFsJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBpbmNpZGVudCBzdGF0ZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMicsICdQcm9kdWN0aW9uJywgJ0R1bW15JyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgTkVXIGNvbmZpZyBpdGVtIG11c3QgYmUgY3JlYXRlZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdDdXN0b21lcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlVGltZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAzJywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTA2LTA1JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wOC0wNSAwNDo1MCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzJywKICAgICAgICAgICAgICAgICAgICAnMycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzIFRleHQzIFRlc3QzJywKICAgICAgICAgICAgICAgICAgICAiVGVzdDNcblRleHRBcnJheTNcblRlc3QzIiwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDEsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCAzJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnQ3VzdG9tZXIxOjoxJyAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ0RhdGUxOjoxJyAgICAgICAgICAgPT4gJzIwMDgtMDYtMDUnLAogICAgICAgICAgICAgICAgJ0RhdGVUaW1lMTo6MScgICAgICAgPT4gJzIwMDgtMDgtMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDN9LAogICAgICAgICAgICAgICAgJ0ludGVnZXIxOjoxJyAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ1Rlc3QzIFRleHQzIFRlc3QzJywKICAgICAgICAgICAgICAgICdUZXh0QXJlYTE6OjEnICAgICAgID0+ICJUZXN0M1xuVGV4dEFycmF5M1xuVGVzdDMiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgc2Vjb25kIE5FVyBjb25maWcgaXRlbSBtdXN0IGJlIGNyZWF0ZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNCcsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wOS0wNScsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMTItMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0NCcsCiAgICAgICAgICAgICAgICAgICAgJzQnLAogICAgICAgICAgICAgICAgICAgICdUZXN0NCBUZXh0NCBUZXN0NCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3Q0XG5UZXh0QXJyYXk0XG5UZXN0NCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNCcsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTA5LTA1JywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTEyLTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3Q0fSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICc0JywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0NCBUZXh0NCBUZXN0NCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdDRcblRleHRBcnJheTRcblRlc3Q0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gZmlyc3QgdGVzdCBjb25maWcgaXRlbSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICAnUGlsb3QnLAogICAgICAgICAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDIgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICdUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgJzInLAogICAgICAgICAgICAgICAgICAgICdUZXN0IFRleHQgVVBEQVRFMSBUZXN0JywKICAgICAgICAgICAgICAgICAgICAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUxXG5UZXN0IiwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUGlsb3QnLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0wMi0wMiAwMzo1OScsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0Mn0sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnMicsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFVQREFURTEgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUxXG5UZXN0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gZmlyc3QgdGVzdCBjb25maWcgaXRlbSBhZ2FpbikKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAzJywKICAgICAgICAgICAgICAgICAgICAnUmVwYWlyJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDMnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAzIDAzOjU5JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDMnLAogICAgICAgICAgICAgICAgICAgICczJywKICAgICAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFVQREFURTIgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMlxuVGVzdCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAzLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDMnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1JlcGFpcicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTAyLTAzJywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTAyLTAzIDAzOjU5JywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QzfSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0IFRleHQgVVBEQVRFMiBUZXN0JywKICAgICAgICAgICAgICAgICdUZXh0QXJlYTE6OjEnICAgICAgID0+ICJUZXN0XG5UZXh0IEFycmF5IFVQREFURTJcblRlc3QiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGEgbmV3IHZlcnNpb24gbXVzdCBiZSBhZGRlZCB0byB0aGlyZCB0ZXN0IGNvbmZpZyBpdGVtKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjddLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjIgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIE1haW4yU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMiAoMSkgTWFpbjJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxJyAgICAgICAgICAgICAgID0+ICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnID0+ICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjInID0+ICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgPT4gJ01haW4xICgxKSBNYWluMVN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgID0+ICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnID0+ICdNYWluMiAoMSkgTWFpbjJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJyA9PiAnTWFpbjIgKDEpIE1haW4yU3ViMiAoMiknLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgICMgSW4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMicgMTYgQXR0cmlidXRlcyB3ZXJlIGltcG9ydGVkLAogICAgIyBzbyB0aGVyZSB3aWxsIGJlIDggbGluZ2VyaW5nIGF0dHJpYnV0ZXMuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjEnICAgICAgICAgICAgICAgPT4gJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gIlRlc3RcblRlc3RcdFRlc3QiLAoKICAgICAgICAgICAgICAgICMgbGluZ2VyaW5nIGZyb20gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDMpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjInID0+ICdNYWluMSAoMSkgTWFpbjFTdWIyICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICAjIEluICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInIDE2IEF0dHJpYnV0ZXMgd2VyZSBpbXBvcnRlZCwKICAgICMgc28gdGhlcmUgd2lsbCBiZSA4IGxpbmdlcmluZyBhdHRyaWJ1dGVzLgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjddLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDQnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICfOqyDOtCDOuycsCiAgICAgICAgICAgICAgICAgICAgJ8+AIM+HIM+YJywKICAgICAgICAgICAgICAgICAgICAnz7ogz7Egz64nLAogICAgICAgICAgICAgICAgICAgICfJryDKkyDKoCcsCiAgICAgICAgICAgICAgICAgICAgJ8qsIMqvJywKICAgICAgICAgICAgICAgICAgICAn0Lkg0YQg0YknLAogICAgICAgICAgICAgICAgICAgICfRmiDRkScsCiAgICAgICAgICAgICAgICAgICAgJ9GsINGmJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDQnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxJyAgICAgICAgICAgICAgID0+ICfOqyDOtCDOuycsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScgPT4gJ8+AIM+HIM+YJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJyA9PiAnz7ogz7Egz64nLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+ICfJryDKkyDKoCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ8qsIMqvJywKICAgICAgICAgICAgICAgICdNYWluMjo6MScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn0Lkg0YQg0YknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfRmiDRkScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ9GsINGmJywKCiAgICAgICAgICAgICAgICAjIGxpbmdlcmluZyBmcm9tICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicgPT4gJ01haW4xICgxKSBNYWluMVN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjInID0+ICdNYWluMiAoMSkgTWFpbjJTdWIyICgyKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhIHNpbXBsZSBpbXBvcnQgZm9yIHRlc3RpbmcgdGhlIG92ZXJyaWRpbmcgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ0ltcG9ydHRlc3QgNSBmb3IgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDEnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMSwKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdJbXBvcnR0ZXN0IDUgZm9yIGJlaGF2aW9yIG9mIGVtcHR5IHZhbHVlcycsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gZW1wdHkgdmFsdWUgZm9yIFRleHQxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIG5vIG5ldyB2ZXJzaW9uIHNob3VsZCBiZSBjcmVhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDEsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnSW1wb3J0dGVzdCA1IGZvciBiZWhhdmlvciBvZiBlbXB0eSB2YWx1ZXMnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IHVuZGVmIGZvciBUZXh0MSwgd2l0aCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzIHR1cm5lZCBvbgogICAgIyBubyBuZXcgdmVyc2lvbiBzaG91bGQgYmUgY3JlYXRlZAogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJ29uJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ0ltcG9ydHRlc3QgNSBmb3IgYmVoYXZpb3Igb2YgZW1wdHkgdmFsdWVzJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhbiBlbXB0eSB2YWx1ZSBmb3IgVGV4dDEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb2ZmCiAgICAjIGEgbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDIsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhIHNpbmdsZSBzcGFjZSB2YWx1ZSBmb3IgVGV4dDEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgYSBuZXcgdmVyc2lvbiBzaG91bGQgYmUgY3JlYXRlZAogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnICcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDMsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnICcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgdGhlIHN0cmluZyAnMCcgdmFsdWUgZm9yIFRleHQxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIGEgbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJzAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGVtcHR5IHZhbHVlIGZvciBHZW5lcmFsQ2F0YWxvZzEsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgbm8gbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgR2VuZXJhbENhdGFsb2cxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIHRoZSBpbXBvcnQgc2hvdWxkIGZhaWwKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnbm9uLWV4aXN0ZW50IGdlbmVyYWwgY2F0YWxvZyBlbnRyeScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgR2VuZXJhbENhdGFsb2cxLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9mZgogICAgIyB0aGUgaW1wb3J0IHNob3VsZCBmYWlsCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDUnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICdub24tZXhpc3RlbnQgZ2VuZXJhbCBjYXRhbG9nIGVudHJ5JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBhbiBlbXB0eSB2YWx1ZSBmb3IgRGVwbFN0YXRlLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIG5vIG5ldyB2ZXJzaW9uIHNob3VsZCBiZSBjcmVhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uTnVtYmVyID0+IDQsCiAgICAgICAgICAgIExhc3RWZXJzaW9uICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0MX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgYW4gaW52YWxpZCB2YWx1ZSBmb3IgRGVwbFN0YXRlLCB3aXRoIEVtcHR5RmllbGRzTGVhdmVUaGVPbGRWYWx1ZXMgdHVybmVkIG9uCiAgICAjIGFuIGVycm9yIHNob3VsZCBiZSBnZW5lcmF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCBkZXBsb3ltZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGVtcHR5IHZhbHVlIGZvciBJbmNpU3RhdGUsIHdpdGggRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyB0dXJuZWQgb24KICAgICMgbm8gbmV3IHZlcnNpb24gc2hvdWxkIGJlIGNyZWF0ZWQKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzID0+ICdvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSW1wb3J0dGVzdCA1JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW1wb3J0IGFuIGludmFsaWQgdmFsdWUgZm9yIEluY2lTdGF0ZSwgd2l0aCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzIHR1cm5lZCBvbgogICAgIyBhbiBlcnJvciBzaG91bGQgYmUgZ2VuZXJhdGVkCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgRW1wdHlGaWVsZHNMZWF2ZVRoZU9sZFZhbHVlcyA9PiAnb24nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgNScsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGluY2lkZW50IHN0YXRlJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJbXBvcnRUZXN0Q291bnQgPSAxOwpURVNUOgpmb3IgbXkgJFRlc3QgKEBJbXBvcnREYXRhVGVzdHMpIHsKCiAgICAjIGNoZWNrIFNvdXJjZUltcG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IE5vIFNvdXJjZUltcG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IHRoZSBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntPYmplY3REYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57T2JqZWN0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57T2JqZWN0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9IGVxICdBUlJBWScKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgZGVsZXRlIGFsbCBleGlzdGluZyBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKICAgICAgICBNQVBQSU5HT0JKRUNUREFUQToKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhICggQHsgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgbXkgJE1hcHBpbmdJRCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJE1hcHBpbmdPYmplY3REYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpbXBvcnQgZGF0YSBzYXZlCiAgICBteSAoICRDb25maWdJdGVtSUQsICRSZXRDb2RlICkgPSAkU2VsZi0+e09iamVjdEJhY2tlbmRPYmplY3R9LT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9IH0sCiAgICAgICAgQ291bnRlciA9PiAkSW1wb3J0VGVzdENvdW50LAogICAgKTsKCiAgICBpZiAoICEkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9ICkgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSByZXR1cm4gbm8gQ29uZmlnSXRlbUlEIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmV0Q29kZSwKICAgICAgICAgICAgIkltcG9ydFRlc3QgJEltcG9ydFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIHJldHVybiBubyBSZXRDb2RlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSByZXR1cm4gQ29uZmlnSXRlbUlEIgogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRSZXRDb2RlLAogICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSByZXR1cm4gUmV0Q29kZSIKICAgICk7CgogICAgIyBnZXQgdGhlIHZlcnNpb24gbGlzdAogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgICMgY2hlY2sgbnVtYmVyIG9mIHZlcnNpb25zCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFZlcnNpb25MaXN0fSwKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57VmVyc2lvbk51bWJlcn0gfHwgMCwKICAgICAgICAiSW1wb3J0VGVzdCAkSW1wb3J0VGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gY29ycmVjdCBudW1iZXIgb2YgdmVyc2lvbnMiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGFzdCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFhNTERhdGFHZXQgICA9PiAxLAogICAgKTsKCiAgICAjIHRyYW5zbGF0ZSB4bWxkYXRhIGluIGEgMmQgaGFzaAogICAgbXkgJVhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyRCgKICAgICAgICBYTUxIYXNoID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LAogICAgKTsKCiAgICAjIGNsZWFuIHRoZSB4bWwgaGFzaAogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICVYTUxIYXNoICkgewoKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5ID1+IG17IFx7J0NvbnRlbnQnXH0gXHogfXhtczsKCiAgICAgICAgZGVsZXRlICRYTUxIYXNoeyRLZXl9OwogICAgfQoKICAgICMgY2hlY2sgZ2VuZXJhbCBlbGVtZW50cwogICAgRUxFTUVOVDoKICAgIGZvciBteSAkRWxlbWVudCAocXcoTnVtYmVyIE5hbWUgRGVwbFN0YXRlIEluY2lTdGF0ZSkpIHsKCiAgICAgICAgbmV4dCBFTEVNRU5UIGlmICFleGlzdHMgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fTsKCiAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9ICkgewogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9ICkgewogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZWxlbWVudAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFZlcnNpb25EYXRhLT57JEVsZW1lbnR9LAogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9LAogICAgICAgICAgICAiSW1wb3J0VGVzdCAkSW1wb3J0VGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpICRFbGVtZW50IGlzIGlkZW50aWNhbCIsCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH07CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2YgWE1MIGVsZW1lbnRzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIGtleXMgJVhNTEhhc2gsCiAgICAgICAgc2NhbGFyIGtleXMgJXsgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufSB9LAogICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSBjb3JyZWN0IG51bWJlciBvZiBYTUwgZWxlbWVudHMiLAogICAgKTsKCiAgICAjIGNoZWNrIFhNTCBlbGVtZW50cwogICAgRUxFTUVOVDoKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259IH0gKSB7CgogICAgICAgICMgZHVwbGljYXRlIGtleQogICAgICAgIG15ICRYTUxLZXkgPSAkS2V5OwoKICAgICAgICAjIHByZXBhcmUga2V5CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIHdoaWxlICggJFhNTEtleSA9fiBteyA6OiB9eG1zICkgewoKICAgICAgICAgICAgaWYgKCAkQ291bnRlciAlIDIgKSB7CiAgICAgICAgICAgICAgICAkWE1MS2V5ID1+IHN7IDo6IH17XVx7J314bXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkWE1MS2V5ID1+IHN7IDo6IH17J1x9W314bXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEVMRU1FTlQgaWYgIWV4aXN0cyAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfTsKCiAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfSApIHsKICAgICAgICAgICAgJFhNTEhhc2h7ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRYTUxLZXkgLiAnXXtcJ0NvbnRlbnRcJ30nIH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskS2V5fSApIHsKICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRLZXl9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgWE1MIGVsZW1lbnQKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9LAogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEtleX0sCiAgICAgICAgICAgICJJbXBvcnRUZXN0ICRJbXBvcnRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgJEtleSBpcyBpZGVudGljYWwiLAogICAgICAgICk7CiAgICB9Cn0KY29udGludWUgewogICAgJEltcG9ydFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlbGV0ZSB0aGUgdGVzdCB0ZW1wbGF0ZXMKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgIFRlbXBsYXRlSUQgPT4gXEBUZW1wbGF0ZUlEcywKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgZ2V0IGFjdHVhbCBjbGFzcyBsaXN0Cm15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwoKIyBzZXQgdW5pdHRlc3QgY2xhc3NlcyBpbnZhbGlkCklURU1JRDoKZm9yIG15ICRJdGVtSUQgKCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CgogICAgbmV4dCBJVEVNSUQgaWYgJENsYXNzTGlzdC0+eyRJdGVtSUR9ICF+IG17IFxBIFVuaXRUZXN0IH14bXM7CgogICAgIyB1cGRhdGUgaXRlbQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTGlzdC0+eyRJdGVtSUR9LAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwp9CgojIGRlbGV0ZSB0aGUgdGVzdCBjb25maWcgaXRlbXMKZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIElUU01Db25maWdJdGVtLnQgLSBjb25maWcgaXRlbSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0udCx2IDEuMTIgMjAxMC8wMy8zMCAxMDo1MTowMiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBwZXJmb3JtIENvbmZpZ0l0ZW1Db3VudCB0byBmaWxsIHRoZSBlbXB0eSBmaWVsZHMKJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUNvdW50KCk7CgojIGNyZWF0ZSBuZWVkZWQgdXNlcnMKbXkgQFVzZXJJRHM7CnsKCiAgICAjIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgogICAgbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpIHx8IDE7CiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdJVFNNQ29uZmlnSXRlbScgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JVFNNQ29uZmlnSXRlbS0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LUlUU01Db25maWdJdGVtLScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCm15ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzID0gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiMgYWRkIGEgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApmb3IgbXkgJE5hbWUgKHF3KFRlc3QxIFRlc3QyIFRlc3QzIFRlc3Q0KSkgewoKICAgICMgYWRkIGEgbmV3IGl0ZW0KICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJE5hbWUsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpdGVtIGlkCiAgICBpZiAoICEkSXRlbUlEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0uIiwKICAgICAgICApOwogICAgfQp9CgojIGRlZmluZSB0aGUgZmlyc3QgdGVzdCBkZWZpbml0aW9uIChhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcykKbXkgQENvbmZpZ0l0ZW1EZWZpbml0aW9uczsKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1swXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3VzdG9tZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlVGltZTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0RhdGUgVGltZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnRHVtbXkxJywKICAgICAgICBOYW1lICA9PiAnRHVtbXkgMScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cxJywKICAgICAgICBOYW1lICAgICAgID0+ICdHZW5lcmFsQ2F0YWxvZyAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICckR2VuZXJhbENhdGFsb2dDbGFzcycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnSW50ZWdlcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0ludGVnZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0MScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dCAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1RleHRBcmVhMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGV4dEFyZWEgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSBzZWNvbmQgdGVzdCBkZWZpbml0aW9uIChzdWIgZGF0YSB0eXBlcykKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1sxXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjEnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIxJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAxJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjFTdWJTdWIyJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAxIFN1YlN1YiAyJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yJywKICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjJTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMiBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMicsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDInLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LApdICI7CgojIGRlZmluZSB0aGUgdGhpcmQgdGVzdCBkZWZpbml0aW9uIChlc3BlY2lhbGx5IGZvciBzZWFyY2ggdGVzdHMgd2l0aCBYTUxEYXRhKQokQ29uZmlnSXRlbURlZmluaXRpb25zWzJdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGVUaW1lMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSBUaW1lIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZVRpbWUnLAogICAgICAgIH0sCiAgICB9LApdICI7CgojIGRlZmluZSB0aGUgZm91cnRoIHRlc3QgZGVmaW5pdGlvbiAob25seSBmb3Igc2VhcmNoIHRlc3RzKQokQ29uZmlnSXRlbURlZmluaXRpb25zWzNdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKIyBhZGQgdGhlIHRlc3QgY2xhc3NlcwpteSBAQ29uZmlnSXRlbUNsYXNzSURzOwpteSBAQ29uZmlnSXRlbUNsYXNzZXM7Cm15IEBDb25maWdJdGVtRGVmaW5pdGlvbklEczsKZm9yIG15ICREZWZpbml0aW9uIChAQ29uZmlnSXRlbURlZmluaXRpb25zKSB7CgogICAgIyBnZW5lcmF0ZSBhIHJhbmRvbSBuYW1lCiAgICBteSAkQ2xhc3NOYW1lID0gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2xhc3MgaWQKICAgIGlmICggISRDbGFzc0lEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gY2xhc3MuIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1DbGFzc0lEcywgJENsYXNzSUQ7CiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NlcywgICRDbGFzc05hbWU7CgogICAgIyBhZGQgYSBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcwogICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBkZWZpbml0aW9uIGlkCiAgICBpZiAoICEkRGVmaW5pdGlvbklEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbi4iLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ29uZmlnSXRlbURlZmluaXRpb25JRHMsICREZWZpbml0aW9uSUQ7Cn0KCiMgdGVzdCBEZWZpbml0aW9uTGlzdCBmb3IgdGhvc2Ugc2ltcGxlIGNhc2VzCm15ICRDb3VudGVyID0gMDsKZm9yIG15ICRDbGFzc0lEIChAQ29uZmlnSXRlbUNsYXNzSURzKSB7CiAgICBteSAkRGVmaW5pdGlvbkxpc3RSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgKTsKCiAgICAjIGV4cGVjdCBhIHNpbmdsZSBkZWZpbml0aW9uIHBlciBjb25maWcgaXRlbSBjbGFzcwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyREZWZpbml0aW9uTGlzdFJlZn0sCiAgICAgICAgMSwKICAgICAgICAiRGVmaW5pdGlvbkxpc3QoKSBmb3IgY2xhc3MgaWQgJENsYXNzSUQ6IGdvdCBhIHNpbmdsZSByZXN1bHQiLAogICAgKTsKCiAgICAjIGV4cGVjdCB0aGUgcmVtZW1iZXJlZCBkZWZpbml0aW9uIGlkIGluIHRoZSBmaXJzdCBkZWZpbml0aW9uCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJERlZmluaXRpb25MaXN0UmVmLT5bMF0tPntEZWZpbml0aW9uSUR9LAogICAgICAgICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1skQ291bnRlcl0sCiAgICAgICAgIkRlZmluaXRpb25MaXN0KCkgZm9yIGNsYXNzIGlkICRDbGFzc0lEOiBnb3QgZXhwZWN0ZWQgZGVmaW5pdGlvbiBpZCIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRDb3VudGVyKys7Cn0KCiMgY3JlYXRlIHNvbWUgcmFuZG9tIG51bWJlcnMKbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwpmb3IgKCAxIC4uIDEwMCApIHsKICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgZ2V0IGNsYXNzIGxpc3QKbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7Cm15ICVDbGFzc0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRDbGFzc0xpc3R9OwoKIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0Cm15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVEZXBsU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgojIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0Cm15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlSW5jaVN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHRlc3QgbGlzdApteSAkR2VuZXJhbENhdGFsb2dMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJEdlbmVyYWxDYXRhbG9nQ2xhc3MsCik7Cm15ICVHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRHZW5lcmFsQ2F0YWxvZ0xpc3R9OwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIGNvbmZpZyBpdGVtIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDb25maWdJdGVtVGVzdHMgPSBbCgogICAgIyBDb25maWdJdGVtQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBDb25maWdJdGVtQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIGNvbmZpZyBpdGVtIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybmVkIGNvbmZpZyBpdGVtIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgTGFzdFZlcnNpb25JRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCBjb25maWcgaXRlbSB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayBudW1iZXIgYXR0cmlidXRlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIHdpdGggdGhpcyBudW1iZXIgYWxyZWFkeSBleGlzdHMgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFZlcnNpb25BZGQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBWZXJzaW9uQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAyIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBWZXJzaW9uQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gNCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA1IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuZWQgdmFsdWVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzZdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDYgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiA5OTk5OTk5LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzZdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGluY2lkZW50IHN0YXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm5lZCB2YWx1ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbN10sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gNyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gOTk5OTk5OSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybmVkIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s4XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA4IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzhdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChnZW5lcmFsIGNoZWNrIHdpdGggdHdvIHZlcnNpb25zKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzldLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDkgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOSBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOV0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s5XSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA5IFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDEwIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDEwIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxMF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzEwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1BsYW5uZWQnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3ByZXByb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzEwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgY29uZmlnIGl0ZW0gb25seSBmb3IgbGF0ZXIgc2VhcmNoIHRlc3RzCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBjb25maWcgaXRlbSBvbmx5IGZvciBsYXRlciBzZWFyY2ggdGVzdHMKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAyIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGNvbmZpZyBpdGVtIG9ubHkgZm9yIGxhdGVyIHNlYXJjaCB0ZXN0cywgaW5jbHVkaW5nIFhNTERhdGEKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdkdW1teV9jdXN0b21lcl9mb3JfdW5pdGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDEwLTAyLTEyIDA5OjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyAgPT4gJ1sxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbicgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyMScgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICdkdW1teV9jdXN0b21lcl9mb3JfdW5pdGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhZ0tleScgID0+ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnQ3VzdG9tZXIxXCd9WzFdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlMScgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICcyMDEwLTAyLTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyAgPT4gJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCdEYXRlMVwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJzIwMTAtMDItMTIgMDk6MTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYWdLZXknICA9PiAnWzFde1wnVmVyc2lvblwnfVsxXXtcJ0RhdGVUaW1lMVwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFnS2V5JyA9PiAnWzFde1wnVmVyc2lvblwnfVsxXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgY29uZmlnIGl0ZW0gb25seSBmb3IgbGF0ZXIgc2VhcmNoIHRlc3RzCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzNdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDQgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbM10sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbM10sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbM10gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDQgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZGVkIHRvIGNoZWNrIGhpc3RvcnkgZnVuY3Rpb25zCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0IFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0JywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQbGFubmVkJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcmVwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBIaXN0b3J5VGVzdCBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEhpc3RvcnlHZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ1ZlcnNpb25DcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gNiwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0RlZmluaXRpb25VcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gOCwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ05hbWVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gNSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0JSUnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnSW5jaWRlbnRTdGF0ZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA5LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSAuICclJScsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdEZXBsb3ltZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UGxhbm5lZH0gLiAnJSUnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnVmVyc2lvbkNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA2LAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnTmFtZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA1LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QgVmVyc2lvbiAyJSVVbml0VGVzdCAtIEhpc3RvcnlUZXN0JywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdJbmNpZGVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9IC4gJyUlJwogICAgICAgICAgICAgICAgICAgICAgICAuICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnRGVwbG95bWVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEwLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSAuICclJScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UGxhbm5lZH0sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGRlZCBmb3IgQnVnNDE5NgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIGNhbGN1bGF0aW9uIG9mIGRlcGxveW1lbnQgYW5kIGluY2lkZW50IHN0YXRlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYgVjInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0MTk2IFYyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NiBWMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1BsYW5uZWQnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3ByZXByb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYgVjInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGRlZCBmb3IgQnVnIDQzNzcgLSBDSS1BCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzJdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uR2V0ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0Mzc3IC0gQ0ktQScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkZWQgZm9yIEJ1ZyA0Mzc3IC0gQ0ktQgogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzczXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQzNzcgLSBDSS1CJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzNdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzNdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgY29uZmlnIGl0ZW0gdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBDb25maWdJdGVtSURzOwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskQ29uZmlnSXRlbVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGV4dHJhY3Qgc291cmNlIGRhdGEKICAgIG15ICRTb3VyY2VEYXRhID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKCiAgICAjIGFkZCBhIG5ldyBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIGlmICggJFNvdXJjZURhdGEtPntDb25maWdJdGVtQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NvbmZpZ0l0ZW1BZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDb25maWdJdGVtSUQpIHsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0KICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtQWRkKCkgLSBBZGQgbmV3IGNvbmZpZyBpdGVtLiBJbnNlcnQgc3VjY2Vzcy4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1JRDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1BZGQoKSAtIEFkZCBuZXcgY29uZmlnIGl0ZW0uIFJldHVybiBmYWxzZS4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgYWxsIGRlZmluZWQgdmVyc2lvbnMKICAgIG15IEBWZXJzaW9uSURzOwogICAgbXkgJVZlcnNpb25JRHNTZWVuOwogICAgaWYgKCAkU291cmNlRGF0YS0+e1ZlcnNpb25BZGR9ICkgewoKICAgICAgICBmb3IgbXkgJFZlcnNpb24gKCBAeyAkU291cmNlRGF0YS0+e1ZlcnNpb25BZGR9IH0gKSB7CgogICAgICAgICAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewogICAgICAgICAgICAgICAgJFZlcnNpb24tPntDb25maWdJdGVtSUR9ID0gJENvbmZpZ0l0ZW1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgdmVyc2lvbgogICAgICAgICAgICBteSAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRWZXJzaW9uSUQpIHsKICAgICAgICAgICAgICAgIHB1c2ggQFZlcnNpb25JRHMsICRWZXJzaW9uSUQgaWYgISRWZXJzaW9uSURzU2VlbnskVmVyc2lvbklEfSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbURhdGE7CiAgICBpZiAoICRUZXN0LT57UmVmZXJlbmNlRGF0YX0gJiYgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9ICkgewoKICAgICAgICAjIGdldCB0aGUgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICRDb25maWdJdGVtRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRDb25maWdJdGVtRGF0YSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1HZXQoKSAtIGdldCBjb25maWcgaXRlbSBkYXRhLiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYWxsIGNvbmZpZyBpdGVtIGF0dHJpYnV0ZXMKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICV7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJENvbmZpZ0l0ZW1EYXRhLT57JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbURhdGEtPnskQXR0cmlidXRlfSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fS0+eyRBdHRyaWJ1dGV9ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBhdHRyaWJ1dGVzCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDb25maWdJdGVtRGF0YS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtR2V0KCkgLSAkQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIHZlcnNpb25zCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEYXRhfQogICAgICAgICYmICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fQogICAgICAgICYmIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fSB9CiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAVmVyc2lvbklEcywKICAgICAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fSB9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uQWRkKCkgLSBjb3JyZWN0IG51bWJlciBvZiB2ZXJzaW9ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUIGlmICEkQ29uZmlnSXRlbUlEOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgc2NhbGFyIEBWZXJzaW9uSURzLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uQWRkKCkgLSBubyB2ZXJzaW9ucyBleGl0cyIsCiAgICAgICAgKTsKICAgIH0KCiAgICBuZXh0IFRFU1QgaWYgISRUZXN0LT57UmVmZXJlbmNlRGF0YX07CiAgICBuZXh0IFRFU1QgaWYgISRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fTsKCiAgICBteSAkQ291bnRlciAgICAgICAgICAgPSAwOwogICAgbXkgJExhc3RWZXJzaW9uSURNdXN0ID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgIFZFUlNJT05JRDoKICAgIGZvciBteSAkVmVyc2lvbklEIChAVmVyc2lvbklEcykgewoKICAgICAgICAjIGdldCB0aGlzIHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBWZXJzaW9uSUQgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVmVyc2lvbkRhdGEgKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uR2V0KCkgLSBnZXQgdmVyc2lvbiBkYXRhLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVkVSU0lPTklEOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIGxhc3QgdmVyc2lvbiBpZAogICAgICAgICRMYXN0VmVyc2lvbklETXVzdCA9ICRWZXJzaW9uRGF0YS0+e1ZlcnNpb25JRH07CgogICAgICAgICMgY2hlY2sgYWxsIHZlcnNpb24gYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0tPlskQ291bnRlcl0gfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgbmVlZGVkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgbXkgJFZlcnNpb25BdHRyaWJ1dGUgICA9ICRWZXJzaW9uRGF0YS0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9LT5bJENvdW50ZXJdLT57JEF0dHJpYnV0ZX07CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkVmVyc2lvbkF0dHJpYnV0ZSApIHsKICAgICAgICAgICAgICAgICRWZXJzaW9uQXR0cmlidXRlID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VBdHRyaWJ1dGUgKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdYTUxEZWZpbml0aW9uJyB8fCAkQXR0cmlidXRlIGVxICdYTUxEYXRhJyApIHsKCiAgICAgICAgICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAgICAgICAgICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgogICAgICAgICAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBWZXJzaW9uR2V0KCkKICAgICAgICAgICAgICAgICRWZXJzaW9uQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFZlcnNpb25BdHRyaWJ1dGUpOwoKICAgICAgICAgICAgICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRSZWZlcmVuY2VBdHRyaWJ1dGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGF0dHJpYnV0ZXMKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFZlcnNpb25BdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkdldCgpIC0gJEF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgcHJlcGFyZSBsYXN0IHZlcnNpb24gaWQKICAgIG15ICRMYXN0VmVyc2lvbklEQWN0dWFsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57TGFzdFZlcnNpb25JRH0gKSB7CiAgICAgICAgJExhc3RWZXJzaW9uSURBY3R1YWwgPSAkQ29uZmlnSXRlbURhdGEtPntMYXN0VmVyc2lvbklEfTsKICAgIH0KCiAgICAjIGNoZWNrIGxhc3QgdmVyc2lvbiBpZAogICAgJFNlbGYtPklzKAogICAgICAgICRDb25maWdJdGVtRGF0YS0+e0xhc3RWZXJzaW9uSUR9LAogICAgICAgICRMYXN0VmVyc2lvbklETXVzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBsYXN0IHZlcnNpb24gaWQgaWRlbnRpY2FsIiwKICAgICk7CgogICAgIyBjaGVjayBoaXN0b3J5IGVudHJpZXMKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9CiAgICAgICAgJiYgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0hpc3RvcnlHZXR9CiAgICAgICAgJiYgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0hpc3RvcnlHZXR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJENvbXBsZXRlSGlzdG9yeSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkhpc3RvcnlHZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbnIgb2YgaGlzdG9yeSBlbnRyaWVzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0hpc3RvcnlHZXR9IH0sCiAgICAgICAgICAgIHNjYWxhciBAeyRDb21wbGV0ZUhpc3Rvcnl9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBuciBvZiBoaXN0b3J5IGVudHJpZXMiLAogICAgICAgICk7CgogICAgICAgIENIRUNLTlI6IGZvciBteSAkQ2hlY2tOciAoIDAgLi4gJCN7JENvbXBsZXRlSGlzdG9yeX0gKSB7CiAgICAgICAgICAgIG15ICRDaGVjayA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntIaXN0b3J5R2V0fS0+WyRDaGVja05yXTsKICAgICAgICAgICAgbXkgJERhdGEgID0gJENvbXBsZXRlSGlzdG9yeS0+WyRDaGVja05yXTsKCiAgICAgICAgICAgIG5leHQgQ0hFQ0tOUiB1bmxlc3MgJENoZWNrICYmICREYXRhOwoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JENoZWNrfSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGhpc3RvcnkgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRDaGVjay0+eyRLZXl9LAogICAgICAgICAgICAgICAgICAgICREYXRhLT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgZm9yIGJ1Z2ZpeCA0Mzc3CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkQ0kxID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s3Ml0sCiAgICApOwoKICAgIG15ICRDSTIgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzczXSwKICAgICk7CgogICAgIyBsaW5rIHRoZSBDSSB3aXRoIGEgQ0kKICAgIG15ICRMaW5rUmVzdWx0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gJENJMSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gJENJMiwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ0RlcGVuZHNPbicsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICMgdXBkYXRlIGluY2lkZW50IHN0YXRlIG9mIENJMQogICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQzNzcgLSBDSS1BJywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgdmVyc2lvbiBjb3VsZCBiZSBhZGRlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBWZXJzaW9uQWRkKCkgZm9yICRDSTEgLSBTZXQgdG8gJ0luY2lkZW50JyIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmb3IgQ0kxCiAgICBteSAkVmVyc2lvblJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgb2YgQ0kxIGlzICdJbmNpZGVudCcKICAgICRTZWxmLT5JcygKICAgICAgICAkVmVyc2lvblJlZi0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIENJICRDSTEiLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIENJMgogICAgJFZlcnNpb25SZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ0kyLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGluY2lkZW50IHN0YXRlIG9mIENJMiBpcyAnV2FybmluZycKICAgICRTZWxmLT5JcygKICAgICAgICAkVmVyc2lvblJlZi0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgJ1dhcm5pbmcnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMiIsCiAgICApOwoKICAgICMgdXBkYXRlIGluY2lkZW50IHN0YXRlIG9mIENJMiB0byAnSW5jaWRlbnQnCiAgICAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUInLAogICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGFkZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSBmb3IgQ0kgJENJMiAtIFNldCB0byAnSW5jaWRlbnQnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciBDSTIKICAgICRWZXJzaW9uUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTIgaXMgJ0luY2lkZW50JwogICAgJFNlbGYtPklzKAogICAgICAgICRWZXJzaW9uUmVmLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMiIsCiAgICApOwoKICAgICMgdXBkYXRlIGluY2lkZW50IHN0YXRlIG9mIENJMSB0byAnT3BlcmF0aW9uYWwnCiAgICAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUEnLAogICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGFkZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSBmb3IgQ0kgJENJMSAtIFNldCB0byAnT3BlcmF0aW9uYWwnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciBDSTEKICAgICRWZXJzaW9uUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMSwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTEgaXMgJ1dhcm5pbmcnIChiZWNhdXNlIG9mIGxpbmtlZCBDSTIgaW4gc3RhdGUgJ2luY2lkZW50JykKICAgICRTZWxmLT5JcygKICAgICAgICAkVmVyc2lvblJlZi0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgJ1dhcm5pbmcnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMSIsCiAgICApOwoKICAgICMgdXBkYXRlIGluY2lkZW50IHN0YXRlIG9mIENJMiB0byAnT3BlcmF0aW9uYWwnCiAgICAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMiwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDM3NyAtIENJLUInLAogICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBpZiB2ZXJzaW9uIGNvdWxkIGJlIGFkZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25BZGQoKSBmb3IgQ0kgJENJMiAtIFNldCB0byAnT3BlcmF0aW9uYWwnIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciBDSTEKICAgICRWZXJzaW9uUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENJMSwKICAgICk7CgogICAgIyBjaGVjayBpZiBpbmNpZGVudCBzdGF0ZSBvZiBDSTEgaXMgJ09wZXJhdGlvbmFsJwogICAgJFNlbGYtPklzKAogICAgICAgICRWZXJzaW9uUmVmLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMSIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmb3IgQ0kyCiAgICAkVmVyc2lvblJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDSTIsCiAgICApOwoKICAgICMgY2hlY2sgaWYgaW5jaWRlbnQgc3RhdGUgb2YgQ0kyIGlzICdXYXJuaW5nJwogICAgJFNlbGYtPklzKAogICAgICAgICRWZXJzaW9uUmVmLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgQ0kgJENJMiIsCiAgICApOwoKICAgICMgaW5jcmVhc2UgdGhlIHRlc3QgY291bnRlcgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgY29uZmlnIGl0ZW0gc2VhcmNoIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBTZWFyY2hUZXN0cyA9ICgKCiAgICAjIHNlYXJjaCBBTEwgY29uZmlnIGl0ZW1zIGluIHRoZSB0d28gdGVzdCBjbGFzc2VzCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBudW1iZXIgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG51bWJlciBwYXJhbSB3aXRoIHdpbGRjYXJkcwogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOdW1iZXIgPT4gJyonIC4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSAuICcqJywKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbnVtYmVyIHBhcmFtIHdpdGggd2lsZGNhcmRzIGJ1dCB3aXRoIGRlYWN0aXZhdGVkIHdpbGRjYXJkIGZlYXR1cmUKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyICAgICAgICAgPT4gJyonIC4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSAuICcqJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG9yZGVyIGJ5IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBPcmRlckJ5ID0+ICdDcmVhdGVCeScsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMiwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjcmVhdGUgYnkgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gWyAkVXNlcklEc1syXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjcmVhdGUgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDcmVhdGVCeSA9PiBbICRVc2VySURzWzFdLCAgICAgICAgICAgICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsxXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY2hhbmdlIGJ5IHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWyAkVXNlcklEc1sxXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjaGFuZ2UgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHNlYXJjaCBBTEwgY29uZmlnIGl0ZW1zIGluIHRoZSB0d28gdGVzdCBjbGFzc2VzIHVzaW5nIHRoZSB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0gd2l0aCBhbiB3aWxkY2FyZAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gKiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0gd2l0aCBhbiB3aWxkY2FyZCBhbmQgYSBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSAqIDEnLAogICAgICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggd2lsZGNhcmRzCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzKicsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggd2lsZGNhcmRzIGJ1dCB3aXRoIGRlYWN0aXZhdGVkIHdpbGRjYXJkIGZlYXR1cmUKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzKicsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsYXN0IHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgUHJldmlvdXNWZXJzaW9uU2VhcmNoIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAyIFZlcnNpb24gMScsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMiwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyAgICAgICAgICA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgICAgICAgICAgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgICAgICAgICAgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgICAgICAgICAgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChDdXN0b21lcjEpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWyAkVXNlcklEc1syXSBdLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydDdXN0b21lcjEnfVsxXXsnQ29udGVudCd9IiA9PiAnZHVtbXlfY3VzdG9tZXJfZm9yX3VuaXRlc3QnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIgPT4gJzIwMTAtMDItMTInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGVUaW1lMSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlVGltZTEnfVsxXXsnQ29udGVudCd9IiA9PiAnMjAxMC0wMi0xMiAwOToxNCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAoKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoQ3VzdG9tZXIxLCBEYXRlMSwgRGF0ZVRpbWUxKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0N1c3RvbWVyMSd9WzFdeydDb250ZW50J30iID0+ICdkdW1teV9jdXN0b21lcl9mb3JfdW5pdGVzdCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IiA9PiAnMjAxMC0wMi0xMicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZVRpbWUxJ31bMV17J0NvbnRlbnQnfSIgPT4gJzIwMTAtMDItMTIgMDk6MTQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA8LCBmYWxzZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJzwnID0+ICcyMDEwLTAyLTEyJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA8LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4geyAnPCcgPT4gJzIwMTAtMDItMTMnLCB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAoKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsIDw9LCBmYWxzZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJzw9JyA9PiAnMjAxMC0wMi0xMScsIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPD0sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICc8PScgPT4gJzIwMTAtMDItMTInLCB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAoKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsIDw9LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4geyAnPD0nID0+ICcyMDEwLTAyLTEzJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA9LCBmYWxzZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJz0nID0+ICcyMDEwLTAyLTExJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsID0sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICc9JyA9PiAnMjAxMC0wMi0xMicsIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCAhPSwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICchPScgPT4gJzIwMTAtMDItMTInLCB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgIT0sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICchPScgPT4gJzIwMTAtMDItMTMnLCB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1Ml0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpIHdpdGggJ1doYXQnIChEYXRlMSwgPj0sIGZhbHNlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4geyAnPj0nID0+ICcyMDEwLTAyLTEzJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsID49LCB0cnVlKQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gXEBDb25maWdJdGVtQ2xhc3NJRHMsCiAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiWzFdeydWZXJzaW9uJ31bMV17J0RhdGUxJ31bMV17J0NvbnRlbnQnfSIKICAgICAgICAgICAgICAgICAgICAgICAgPT4geyAnPj0nID0+ICcyMDEwLTAyLTEyJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA+PSwgdHJ1ZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJz49JyA9PiAnMjAxMC0wMi0xMScsIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCA+LCBmYWxzZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJz4nID0+ICcyMDEwLTAyLTEyJywgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKSB3aXRoICdXaGF0JyAoRGF0ZTEsID4sIHRydWUpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICc+JyA9PiAnMjAxMC0wMi0xMScsIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUyXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCAtYmV0d2VlbiwgZmFsc2UpCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBcQENvbmZpZ0l0ZW1DbGFzc0lEcywKICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJbMV17J1ZlcnNpb24nfVsxXXsnRGF0ZTEnfVsxXXsnQ29udGVudCd9IgogICAgICAgICAgICAgICAgICAgICAgICA9PiB7ICctYmV0d2VlbicgPT4gWyAnMjAxMC0wMS0wMScsICcyMDEwLTAxLTMxJyBdIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkgd2l0aCAnV2hhdCcgKERhdGUxLCAtYmV0d2VlbiwgdHJ1ZSkKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFxAQ29uZmlnSXRlbUNsYXNzSURzLAogICAgICAgICAgICBXaGF0ICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIlsxXXsnVmVyc2lvbid9WzFdeydEYXRlMSd9WzFdeydDb250ZW50J30iCiAgICAgICAgICAgICAgICAgICAgICAgID0+IHsgJy1iZXR3ZWVuJyA9PiBbICcyMDEwLTAyLTAxJywgJzIwMTAtMDItMzEnIF0gfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTJdLAogICAgICAgIF0sCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIGNvbmZpZyBpdGVtIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojICRTZWFyY2hUZXN0Q291bnQgcHJvdmlkZXMgZ3JvdXBpbmcgb2YgdGVzdCBjYXNlcwpteSAkU2VhcmNoVGVzdENvdW50ID0gMTsKClRFU1Q6CmZvciBteSAkVGVzdCAoQFNlYXJjaFRlc3RzKSB7CgogICAgIyBjaGVjayBTZWFyY2hEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTZWFyY2hEYXRhfSB8fCByZWYgJFRlc3QtPntTZWFyY2hEYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiBObyBTZWFyY2hEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntGdW5jdGlvbn0gfHwgcmVmICRUZXN0LT57RnVuY3Rpb259IG5lICdBUlJBWScgfHwgIUB7ICRUZXN0LT57RnVuY3Rpb259IH0gKSB7CiAgICAgICAgJFRlc3QtPntGdW5jdGlvbn0gPSBbJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCddOwogICAgfQoKICAgIGZvciBteSAkRnVuY3Rpb24gKCBAeyAkVGVzdC0+e0Z1bmN0aW9ufSB9ICkgewoKICAgICAgICAjIHN0YXJ0IHNlYXJjaAogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPiRGdW5jdGlvbigKICAgICAgICAgICAgJXsgJFRlc3QtPntTZWFyY2hEYXRhfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGhlIGNvbmZpZyBpdGVtIGxpc3QKICAgICAgICBpZiAoICRUZXN0LT57UmVmZXJlbmNlRGF0YX0gKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTGlzdCAmJiByZWYgJENvbmZpZ0l0ZW1MaXN0IGVxICdBUlJBWScsCiAgICAgICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRFU1QgaWYgISRDb25maWdJdGVtTGlzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUxpc3QsCiAgICAgICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIFJldHVybiBmYWxzZS4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUIGlmICEkQ29uZmlnSXRlbUxpc3Q7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBmb3VuZCBjb25maWcgaXRlbXMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRDb25maWdJdGVtTGlzdH0sCiAgICAgICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9IH0sCiAgICAgICAgICAgICJTZWFyY2hUZXN0ICRTZWFyY2hUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gY29ycmVjdCBudW1iZXIgb2YgZm91bmQgY29uZmlnIGl0ZW1zIiwKICAgICAgICApOwoKICAgICAgICBteSBAUmVmZXJlbmNlTGlzdDsKICAgICAgICBmb3IgbXkgJE51bWJlciAoIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgZmluZCBpZCBvZiB0aGUgaXRlbQogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSAiCiAgICAgICAgICAgICAgICAgICAgLiAiY29uZmlnaXRlbV9udW1iZXIgPSAnJE51bWJlcicgIgogICAgICAgICAgICAgICAgICAgIC4gIk9SREVSIEJZIGlkIERFU0MiLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgICAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFJlZmVyZW5jZUxpc3QsICRDb25maWdJdGVtSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICAgICAjIGR1bXAgdGhlIGxpc3QgZnJvbSBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKQogICAgICAgIG15ICRDb25maWdJdGVtU3RyaW5nID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJENvbmZpZ0l0ZW1MaXN0KTsKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2Ugc3RyaW5nCiAgICAgICAgbXkgJFJlZmVyZW5jZVN0cmluZyA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCBcQFJlZmVyZW5jZUxpc3QgKTsKCiAgICAgICAgIyBjaGVjayBhcnJheXMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRDb25maWdJdGVtU3RyaW5nLAogICAgICAgICAgICAkUmVmZXJlbmNlU3RyaW5nLAogICAgICAgICAgICAiU2VhcmNoVGVzdCAkU2VhcmNoVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIExpc3QiLAogICAgICAgICk7CiAgICB9Cn0KY29udGludWUgewogICAgJFNlYXJjaFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBjdXJyZW50IGNsYXNzIGxpc3QKJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7CgojIHNldCB1bml0dGVzdCBjbGFzc2VzIGludmFsaWQKSVRFTUlEOgpmb3IgbXkgJEl0ZW1JRCAoIGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICBuZXh0IElURU1JRCBpZiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0gIX4gbXsgXEEgVW5pdFRlc3QgfXhtczsKCiAgICAjIHVwZGF0ZSBpdGVtCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cn0KCiMgZGVsZXRlIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSAkRGVsZXRlVGVzdENvdW50ID0gMTsKZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CiAgICBteSAkRGVsZXRlT2sgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gQ29uZmlnSXRlbURlbGV0ZSgpIChDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW1JRCkiCiAgICApOwoKICAgICMgZG91YmxlIGNoZWNrIGlmIGNvbmZpZyBpdGVtIGlzIHJlYWxseSBkZWxldGVkCiAgICBteSAkQ29uZmlnSXRlbURhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgKTsKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQ29uZmlnSXRlbURhdGEtPntDb25maWdJdGVtSUR9LAogICAgICAgICJEZWxldGVUZXN0ICREZWxldGVUZXN0Q291bnQgLSBkb3VibGUgY2hlY2sgKENvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbUlEKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICREZWxldGVUZXN0Q291bnQrKzsKfQoKMTsK
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAE1ElEQVQ4y31VS29bRRg9M3Mfju086tiJY9dNE+XRNH3RpK0oD7GoqkoIgRAqqgRsuuIHwIINr2UlJERX7FCRUBBigRRUFllACyoqNGogtLaTmjzsxHH8uPa9vtf3zp1hQRMpTdJP+hYzn3TOmU9HZ4iUEnvV7OxsqlAovKHrevCJETFNc3N8fPzb4eHhCvYpZa/L1dXVA+l0+qPJycm3wuEwfZJ8fX3dm5mZGVYU5cOBgQFzT2Qp5Y62LIvduHHj43Q67TabTWma5q52bFvOzd13rl//4r1qtboLQ0q5W3Gr1Qr19PS8FAgE1FwuB0LIDhENswWj3oLvQ9/Y5Bdu/fL31IULZ5fbgtrTV0EIAWOMlMtl1Go1MMYeE3rILJZRsigsX4UkFKHusRenby18n183vrx08fQ3hw/3NZ664y0CSikYY/A8H5U6QXxwFH2hLngex4Gwivb2UCBfrE5kHuQ+//q73868+dqz7w8PJar7AkspQSmF7/tgTEGt7uPo+Aji8W7UmhyxAyGEdYLNmo1Hy+vIlZ1AIV97p/bVzINPP7j8WVubDrqPYMk5h6IwAAoWii7ShTqqlodQqA0CFDVbYi5XRqFi48hgHOfPDGtrdefdu39kRgBAsW0bAKiUklJKpeM4ipSSMsZACEHT9kDbwlhrCBxjGnwoWG9IlKsN/PhrGtmlEnwBBHWGVLz70J+z2VMvPH8so0xNTQ0QQo4SQpJSSs227c54PJ4Mh8NgjGF5voD+viQODyShEIl8xYbrSzzIbeDh4hrMZgsu97EJCsdkaqjbPVKrVaEUi0XueV4TQANA0HXdYDQalYZhoFTaQDazgKFwDCN9IeQKNaT/rYNqAbhcoq8vhkKxAqdSh5A+dEp90zCrQggoV69eXRVCFAAQSikMw+jKZrOvuK47aBgGIl1BuE0bC/kq1oo1rBdKMDmDFgyhpzeKQEBFT4eOzvYAmmur7uTJsblIJAIlGo1KAP62/xTFXVxcFJFIBBsbG3ju/AiW8k38dOcRfp9fRoARHB/rB2MCKpWYGOnFsUOjKJWq+Ge2ogtRHnZd7+f9XEH+d4WCWKwbvVENhUwGlmkjVzRxN7uJvxY3oFCBZ4ZiOD4YQ7xDwbnTA6xer76az+fb9/QxIQSGYaCzsxMAENApxg8C4DY2g2Foqo9YSEOEtjB//yEqKxo0hYMQgUQiee7evXtndwE7jgPXdWFZFhKJBDjn6OrqwqmTo4j3FmFaPiynhVKxgEy2jN5YEG2jB9HdHUF7ezv6+/uj09PTl3cAu66La9euKalUik1MTCAUCkFKCSEE4vE4otEoLMuCbTfhDvWAUApN06DrOlRVBaUUAEgikbi0A9jzPMzPz9NgMEg8z0O9XgfnfEccAgBjCvQAhRACvu+j0WhACLE955zHyJMhPjc3p05PT7+dTCY/SaVSyZWVFQghEAgEoCgKKKXbrwAAVVW3ybfELS8vN3e54sSJE96VK1d+YIzlt8JISgnOOXzf30M9g6Io200phRCC7OmK27dvi6WlpWYymUQikYCUEr7vQwgBz/PAOd9Owa3zFinnHJZl1clen2kul6M3b958fWFh4WXTNFXHcVTOuSqEoEIIJoQgj1VLKaUAICilnqZpXkdHhzc2NnbnP0Y4w1S6yfK4AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==
IyAtLQojIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0sdiAxLjE3IDIwMTAvMDQvMTMgMTc6NDQ6NDkgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUeXBlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkZ1bmN0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50IHBhY2thZ2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgc3lzY29uZmlnIG9iamVjdAogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNvbmZpZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgcmVidWlsZCBaWloqIGZpbGVzCiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0tPldyaXRlRGVmYXVsdCgpOwoKICAgICMgZGVmaW5lIHRoZSBaWlogZmlsZXMKICAgIG15IEBaWlpGaWxlcyA9ICgKICAgICAgICAnWlpaQUF1dG8ucG0nLAogICAgICAgICdaWlpBdXRvLnBtJywKICAgICk7CgogICAgIyByZWxvYWQgdGhlIFpaWiBmaWxlcyAobW9kX3Blcmwgd29ya2Fyb3VuZCkKICAgIGZvciBteSAkWlpaRmlsZSAoQFpaWkZpbGVzKSB7CgogICAgICAgIFBSRUZJWDoKICAgICAgICBmb3IgbXkgJFByZWZpeCAoQElOQykgewogICAgICAgICAgICBteSAkRmlsZSA9ICRQcmVmaXggLiAnL0tlcm5lbC9Db25maWcvRmlsZXMvJyAuICRaWlpGaWxlOwogICAgICAgICAgICBuZXh0IFBSRUZJWCBpZiAhLWYgJEZpbGU7CiAgICAgICAgICAgIGRvICRGaWxlOwogICAgICAgICAgICBsYXN0IFBSRUZJWDsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgICRTZWxmLT57Q1NWT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkNTVi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1R5cGVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0cy0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlZmluZSBmaWxlIHByZWZpeCBmb3Igc3RhdHMKICAgICRTZWxmLT57RmlsZVByZWZpeH0gPSAnSVRTTVN0YXRzJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jb25maWdpdGVtCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLWNvbmZpZ2l0ZW0nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDb25maWdJdGVtIG1hc2sgYWNjZXNzIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJywKICAgICk7CgogICAgIyBpbnN0YWxsIGNvbmZpZyBpdGVtIGRlZmluaXRpb25zCiAgICAkU2VsZi0+X0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucygpOwoKICAgICMgZmlsbHVwIGVtcHR5IGxhc3RfdmVyc2lvbl9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW1fdmVyc2lvbiB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBjdXJfZGVwbF9zdGF0ZV9pZCBvciBjdXJfaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7CgogICAgIyBzZXQgcHJlZmVyZW5jZXMgZm9yIHNvbWUgY29uZmlnIGl0ZW1zCiAgICAkU2VsZi0+X1NldFByZWZlcmVuY2VzKCk7CgogICAgIyBzZXQgZGVmYXVsdCBwZXJtaXNzaW9uIGdyb3VwCiAgICAkU2VsZi0+X1NldERlZmF1bHRQZXJtaXNzaW9uKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgJ0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzJyBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5Q3VySW5jaVN0YXRlVHlwZUZyb21DSXMoKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ29uZmlnSXRlbSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgc2V0IHByZWZlcmVuY2VzIGZvciBzb21lIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPl9TZXRQcmVmZXJlbmNlcygpOwoKICAgICMgc2V0IGRlZmF1bHQgcGVybWlzc2lvbiBncm91cAogICAgJFNlbGYtPl9TZXREZWZhdWx0UGVybWlzc2lvbigpOwoKICAgICMgZmlsbHVwIGVtcHR5ICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycgc2VydmljZSBwcmVmZXJlbmNlcwogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGluc3RhbGwgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbnMKICAgICRTZWxmLT5fQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgbGFzdF92ZXJzaW9uX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBpbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbV92ZXJzaW9uIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUluY2lkZW50QW5kRGVwbG95bWVudFN0YXRlSUQoKTsKCiAgICAjIHNldCBwcmVmZXJlbmNlcyBmb3Igc29tZSBjb25maWcgaXRlbXMKICAgICRTZWxmLT5fU2V0UHJlZmVyZW5jZXMoKTsKCiAgICAjIHNldCBkZWZhdWx0IHBlcm1pc3Npb24gZ3JvdXAKICAgICRTZWxmLT5fU2V0RGVmYXVsdFBlcm1pc3Npb24oKTsKCiAgICAjIGZpbGx1cCBlbXB0eSAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnIHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcygpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPntTdGF0c09iamVjdH0tPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBhbGwgbGlua3Mgd2l0aCBjb25maWcgaXRlbXMKICAgICRTZWxmLT5fTGlua0RlbGV0ZSgpOwoKICAgICMgZGVhY3RpdmF0ZSB0aGUgZ3JvdXAgaXRzbS1jb25maWdpdGVtCiAgICAkU2VsZi0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICdpdHNtLWNvbmZpZ2l0ZW0nLAogICAgKTsKCiAgICAjIGRlbGV0ZSAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnIHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICRTZWxmLT5fRGVsZXRlU2VydmljZVByZWZlcmVuY2VzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRQcmVmZXJlbmNlcygpCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0UHJlZmVyZW5jZXMoKQoKPWN1dAoKc3ViIF9TZXRQcmVmZXJlbmNlcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVNYXAgPSAoCiAgICAgICAgRXhwaXJlZCAgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIEluYWN0aXZlICAgID0+ICdwb3N0cHJvZHVjdGl2ZScsCiAgICAgICAgTWFpbnRlbmFuY2UgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIFBpbG90ICAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICBQbGFubmVkICAgICA9PiAncHJlcHJvZHVjdGl2ZScsCiAgICAgICAgUHJvZHVjdGlvbiAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgIFJlcGFpciAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICBSZXRpcmVkICAgICA9PiAncG9zdHByb2R1Y3RpdmUnLAogICAgICAgIFJldmlldyAgICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAnVGVzdC9RQScgICA9PiAncHJlcHJvZHVjdGl2ZScsCiAgICApOwoKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICVNYXAgKSB7CiAgICAgICAgbXkgJEl0ZW0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgIG5leHQgTkFNRSBpZiAhJEl0ZW07CgogICAgICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW0tPntJdGVtSUR9LAogICAgICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHskTmFtZX0sCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gX1NldERlZmF1bHRQZXJtaXNzaW9uKCkKCnNldCB0aGUgZGVmYXVsdCBncm91cCB0aGF0IGhhcyBhY2Nlc3MgcmlnaHRzCgo9Y3V0CgpzdWIgX1NldERlZmF1bHRQZXJtaXNzaW9uIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGdyb3VwIGFscmVhZHkgZXhpc3RzCiAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJ2l0c20tY29uZmlnaXRlbScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBwZXJtaXNzaW9uIGdyb3VwIGlzIGFscmVhZHkgc2V0LiBJZiBub3QsIHNldCBkZWZhdWx0IHBlcm1pc3Npb24gZ3JvdXAKICAgIGZvciBteSAkQ2xhc3NJRCAoIGtleXMgJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICBteSAkQ2xhc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIGlmICggISRDbGFzcy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ2xhc3MtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdQZXJtaXNzaW9uJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBncm91cCBkZXNjcmlwdGlvbi4nLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBjaGVjayBpZiBncm91cCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyByZWFjdGl2YXRlIHRoZSBncm91cAogICAgaWYgKCRHcm91cElEKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFjdGl2YXRlIGdyb3VwCiAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgYWRkIHRoZSBncm91cAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBDb21tZW50ID0+ICRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgbmV3IGdyb3VwIGlkCiAgICBteSAkTmV3R3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB1c2VyIHJvb3QgdG8gdGhlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgR0lEICAgICAgICA9PiAkTmV3R3JvdXBJRCwKICAgICAgICBVSUQgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCkKCmluc3RhbGxzIENvbmZpZ0l0ZW0gZGVmaW5pdGlvbnMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCj1jdXQKCnN1YiBfQWRkQ29uZmlnSXRlbURlZmluaXRpb25zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgbXkgJURlZmluaXRpb24gPSAoCiAgICAgICAgQ29tcHV0ZXIgPT4gIlsKICAgIHsKICAgICAgICBLZXkgPT4gJ1ZlbmRvcicsCiAgICAgICAgTmFtZSA9PiAnVmVuZG9yJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTW9kZWwnLAogICAgICAgIE5hbWUgPT4gJ01vZGVsJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDb21wdXRlcjo6VHlwZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdPd25lcicsCiAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1NlcmlhbE51bWJlcicsCiAgICAgICAgTmFtZSA9PiAnU2VyaWFsIE51bWJlcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdPcGVyYXRpbmdTeXN0ZW0nLAogICAgICAgIE5hbWUgPT4gJ09wZXJhdGluZyBTeXN0ZW0nLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdDUFUnLAogICAgICAgIE5hbWUgPT4gJ0NQVScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDE2LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1JhbScsCiAgICAgICAgTmFtZSA9PiAnUmFtJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnSGFyZERpc2snLAogICAgICAgIE5hbWUgPT4gJ0hhcmQgRGlzaycsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnQ2FwYWNpdHknLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FwYWNpdHknLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0ZRRE4nLAogICAgICAgIE5hbWUgPT4gJ0ZRRE4nLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTklDJywKICAgICAgICBOYW1lID0+ICdOZXR3b3JrIEFkYXB0ZXInLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAxLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnSVBvdmVyREhDUCcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJUCBvdmVyIERIQ1AnLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6WWVzTm8nLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnSVBBZGRyZXNzJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lQIEFkZHJlc3MnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDQwLAogICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDIwLAogICAgICAgICAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdHcmFwaGljQWRhcHRlcicsCiAgICAgICAgTmFtZSA9PiAnR3JhcGhpYyBBZGFwdGVyJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnT3RoZXJFcXVpcG1lbnQnLAogICAgICAgIE5hbWUgPT4gJ090aGVyIEVxdWlwbWVudCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1dhcnJhbnR5RXhwaXJhdGlvbkRhdGUnLAogICAgICAgIE5hbWUgPT4gJ1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdJbnN0YWxsRGF0ZScsCiAgICAgICAgTmFtZSA9PiAnSW5zdGFsbCBEYXRlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTm90ZScsCiAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCl07IiwKICAgICAgICBIYXJkd2FyZSA9PiAiWwogICAgewogICAgICAgIEtleSA9PiAnVmVuZG9yJywKICAgICAgICBOYW1lID0+ICdWZW5kb3InLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdNb2RlbCcsCiAgICAgICAgTmFtZSA9PiAnTW9kZWwnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1R5cGUnLAogICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkhhcmR3YXJlOjpUeXBlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ093bmVyJywKICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnU2VyaWFsTnVtYmVyJywKICAgICAgICBOYW1lID0+ICdTZXJpYWwgTnVtYmVyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1dhcnJhbnR5RXhwaXJhdGlvbkRhdGUnLAogICAgICAgIE5hbWUgPT4gJ1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdJbnN0YWxsRGF0ZScsCiAgICAgICAgTmFtZSA9PiAnSW5zdGFsbCBEYXRlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnRNYXggPT4gMSwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdOb3RlJywKICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50TWF4ID0+IDEsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICB9LApdOyIsCiAgICAgICAgTG9jYXRpb24gPT4gIlsKICAgIHsKICAgICAgICBLZXkgPT4gJ1R5cGUnLAogICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkxvY2F0aW9uOjpUeXBlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1Bob25lMScsCiAgICAgICAgTmFtZSA9PiAnUGhvbmUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdQaG9uZTInLAogICAgICAgIE5hbWUgPT4gJ1Bob25lIDInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnRmF4JywKICAgICAgICBOYW1lID0+ICdGYXgnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnRS1NYWlsJywKICAgICAgICBOYW1lID0+ICdFLU1haWwnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnQWRkcmVzcycsCiAgICAgICAgTmFtZSA9PiAnQWRkcmVzcycsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTm90ZScsCiAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCl07IiwKICAgICAgICBOZXR3b3JrID0+ICJbCiAgICB7CiAgICAgICAgS2V5ID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1R5cGUnLAogICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06Ok5ldHdvcms6OlR5cGUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTmV0d29ya0FkZHJlc3MnLAogICAgICAgIE5hbWUgPT4gJ05ldHdvcmsgQWRkcmVzcycsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gMzAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnRNYXggPT4gMTAwLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAxLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnU3VibmV0TWFzaycsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdWJuZXQgTWFzaycsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAzMCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICcyNTUuMjU1LjI1NS4wJywKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnR2F0ZXdheScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdHYXRld2F5JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplID0+IDMwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTm90ZScsCiAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgfSwKXTsiLAogICAgICAgIFNvZnR3YXJlID0+ICJbCiAgICB7CiAgICAgICAgS2V5ID0+ICdWZW5kb3InLAogICAgICAgIE5hbWUgPT4gJ1ZlbmRvcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1R5cGUnLAogICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OlNvZnR3YXJlOjpUeXBlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ093bmVyJywKICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnU2VyaWFsTnVtYmVyJywKICAgICAgICBOYW1lID0+ICdTZXJpYWwgTnVtYmVyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTGljZW5jZVR5cGUnLAogICAgICAgIE5hbWUgPT4gJ0xpY2VuY2UgVHlwZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6U29mdHdhcmU6OkxpY2VuY2VUeXBlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0xpY2VuY2VLZXknLAogICAgICAgIE5hbWUgPT4gJ0xpY2VuY2UgS2V5JywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudE1heCA9PiAxMDAsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdRdWFudGl0eScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWFudGl0eScsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVNaW4gPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZU1heCA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAxLAogICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdFeHBpcmF0aW9uRGF0ZScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBpcmF0aW9uIERhdGUnLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ01lZGlhJywKICAgICAgICBOYW1lID0+ICdNZWRpYScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDIwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTm90ZScsCiAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgfSwKXTsiLAogICAgKTsKCiAgICAjIGdldCBsaXN0IG9mIGluc3RhbGxlZCBjb25maWcgaXRlbSBjbGFzc2VzCiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwogICAgbXkgJVJldmVyc2VDbGFzc0xpc3QgPSByZXZlcnNlICV7JENsYXNzTGlzdH07CgogICAgQ0xBU1NOQU1FOgogICAgZm9yIG15ICRDbGFzc05hbWUgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAlRGVmaW5pdGlvbiApIHsKCiAgICAgICAgIyBjaGVjayBpZiBjbGFzcyBleGlzdHMKICAgICAgICBteSAkQ2xhc3NJRCA9ICRSZXZlcnNlQ2xhc3NMaXN0eyRDbGFzc05hbWV9OwoKICAgICAgICBuZXh0IENMQVNTTkFNRSBpZiAhJENsYXNzSUQ7CgogICAgICAgICMgY2hlY2sgaWYgZGVmaW5pdGlvbiBhbHJlYWR5IGV4aXN0cwogICAgICAgIG15ICREZWZpbml0aW9uTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25MaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NOQU1FIGlmICFkZWZpbmVkICREZWZpbml0aW9uTGlzdDsKICAgICAgICBuZXh0IENMQVNTTkFNRSBpZiAkRGVmaW5pdGlvbkxpc3QgJiYgcmVmICREZWZpbml0aW9uTGlzdCBlcSAnQVJSQVknICYmIEB7JERlZmluaXRpb25MaXN0fTsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBkZWZpbml0aW9uCiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkFkZCgKICAgICAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbnskQ2xhc3NOYW1lfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9MaW5rRGVsZXRlKCkKCmRlbGV0ZSBhbGwgZXhpc3RpbmcgbGlua3MgdG8gY29uZmlnIGl0ZW1zCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTGlua0RlbGV0ZSgpOwoKPWN1dAoKc3ViIF9MaW5rRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIGNvbmZpZyBpdGVtcwogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoKCk7CgogICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbUlEczsKICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW1JRHMgbmUgJ0FSUkFZJzsKCiAgICAjIGRlbGV0ZSB0aGUgY29uZmlnIGl0ZW0gbGlua3MKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbUlEc30gKSB7CiAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEKCkKCmZpbGx1cCBlbXB0eSBlbnRyaWVzIGluIHRoZSBsYXN0X3ZlcnNpb25faWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyB3aXRoIGVtcHR5IGxhc3RfdmVyc2lvbl9pZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFICcKICAgICAgICAgICAgLiAnbGFzdF92ZXJzaW9uX2lkID0gMCBPUiBsYXN0X3ZlcnNpb25faWQgSVMgTlVMTCcsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1JRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsICRSb3dbMF07CiAgICB9CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CgogICAgICAgICMgZ2V0IHRoZSBsYXN0IHZlcnNpb24gb2YgdGhpcyBjb25maWcgaXRlbQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJENvbmZpZ0l0ZW1JRCBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRWZXJzaW9uSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFZlcnNpb25JRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJFZlcnNpb25JRDsKCiAgICAgICAgIyB1cGRhdGUgaW5jaV9zdGF0ZV9pZAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgY29uZmlnaXRlbSAnCiAgICAgICAgICAgICAgICAuICdTRVQgbGFzdF92ZXJzaW9uX2lkID0gPyAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRWZXJzaW9uSUQsIFwkQ29uZmlnSXRlbUlEIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgaW5jaV9zdGF0ZV9pZCBjb2x1bW4gb2YgdGhlIGNvbmZpZ2l0ZW1fdmVyc2lvbiB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCgpOwoKPWN1dAoKc3ViIF9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBvcGVyYXRpb25hbCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJEluY2lTdGF0ZUxpc3QgfHwgcmVmICRJbmNpU3RhdGVMaXN0IG5lICdIQVNIJyB8fCAhJXskSW5jaVN0YXRlTGlzdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmaW5kIGFueSBpdGVtIGluIGdlbmVyYWwgY2F0YWxvZyBjbGFzcyBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzb3J0IGlkcwogICAgbXkgQEluY2lTdGF0ZUtleUxpc3QgPSBzb3J0IGtleXMgJXskSW5jaVN0YXRlTGlzdH07CgogICAgIyB1cGRhdGUgaW5jaV9zdGF0ZV9pZAogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25maWdpdGVtX3ZlcnNpb24gJwogICAgICAgICAgICAuICdTRVQgaW5jaV9zdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpbmNpX3N0YXRlX2lkID0gMCBPUiBpbmNpX3N0YXRlX2lkIElTIE5VTEwnLAogICAgICAgIEJpbmQgPT4gWyBcJEluY2lTdGF0ZUtleUxpc3RbMF0gXSwKICAgICk7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eUluY2lkZW50QW5kRGVwbG95bWVudFN0YXRlSUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkIGNvbHVtbiBvZiB0aGUgY29uZmlnaXRlbSB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKPWN1dAoKc3ViIF9GaWxsdXBFbXB0eUluY2lkZW50QW5kRGVwbG95bWVudFN0YXRlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgaXRlbXMgd2l0aCBlbXB0eSBjdXJfZGVwbF9zdGF0ZV9pZCBvciBjdXJfaW5jaV9zdGF0ZV9pZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFICcKICAgICAgICAgICAgLiAnY3VyX2RlcGxfc3RhdGVfaWQgPSAwIE9SIGN1cl9kZXBsX3N0YXRlX2lkIElTIE5VTEwgT1IgJwogICAgICAgICAgICAuICdjdXJfaW5jaV9zdGF0ZV9pZCA9IDAgT1IgY3VyX2luY2lfc3RhdGVfaWQgSVMgTlVMTCcsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1JRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsICRSb3dbMF07CiAgICB9CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbgogICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkTGFzdFZlcnNpb247CiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgcmVmICRMYXN0VmVyc2lvbiBuZSAnSEFTSCc7CiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRMYXN0VmVyc2lvbi0+e0RlcGxTdGF0ZUlEfTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlSUR9OwoKICAgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBpdGVtCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25maWdpdGVtIFNFVCAnCiAgICAgICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCA9ID8sICcKICAgICAgICAgICAgICAgIC4gJ2N1cl9pbmNpX3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkTGFzdFZlcnNpb24tPntEZXBsU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBcJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgICAgICAgICAgICAgXCRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5Q3VySW5jaVN0YXRlVHlwZUZyb21DSXMoKQoKRmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIHNlcnZpY2UgcHJlZmVyZW5jZXMgZm9yIHRoZSBrZXkgJ0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzJy4KVGhpcyBmaWVsZCBzdG9yZXMgdGhlIGN1cnJlbnQgaW5jaWRlbnQgdHlwZSBhcyBpbmZsdWVuY2VkIGJ5IGxpbmtlZCBDSXMgb2YgYSBzZXJ2aWNlLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5Q3VySW5jaVN0YXRlVHlwZUZyb21DSXMoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBsaW5rIHR5cGUKICAgIG15ICRMaW5rVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNOjpDb3JlOjpJbmNpZGVudExpbmtUeXBlJyk7CgogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvbmx5IGlmIHRoZSBDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyBpcyBub3Qgc2V0IHlldAogICAgICAgIG5leHQgU0VSVklDRUlEIGlmICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzfTsKCiAgICAgICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICAgICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdFdpdGhEYXRhKAogICAgICAgICAgICBPYmplY3QxID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICBPYmplY3QyID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICAgICBteSAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAjIGludmVzdGlnYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGVhY2ggY29uZmlnIGl0ZW0KICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJExpbmtlZENvbmZpZ0l0ZW1JRHN7JENvbmZpZ0l0ZW1JRH07CgogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJEZXBsU3RhdGVUeXBlfSBuZSAncHJvZHVjdGl2ZSc7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRDb25maWdJdGVtRGF0YS0+e0N1ckluY2lTdGF0ZVR5cGV9IGVxICdvcGVyYXRpb25hbCc7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgbXVzdCBiZSBzZXQgdG8gJ3dhcm5pbmcnCiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ3dhcm5pbmcnICkgewogICAgICAgICAgICAgICAgJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzID0gJ3dhcm5pbmcnOwogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnaW5jaWRlbnQnCiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ2luY2lkZW50JyApIHsKICAgICAgICAgICAgICAgICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgICAgICBsYXN0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmcm9tIENJcyBvZiB0aGUgc2VydmljZQogICAgICAgICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzLAogICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRGVsZXRlU2VydmljZVByZWZlcmVuY2VzKCkKCkRlbGV0ZXMgdGhlIHNlcnZpY2UgcHJlZmVyZW5jZXMgZm9yIHRoZSBrZXkgJ0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzJy4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9EZWxldGVTZXJ2aWNlUHJlZmVyZW5jZXMoKTsKCj1jdXQKCnN1YiBfRGVsZXRlU2VydmljZVByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmcm9tIENJcyBvZiB0aGUgc2VydmljZQogICAgICAgICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJycsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE3ICQgJERhdGU6IDIwMTAvMDQvMTMgMTc6NDQ6NDkgJAoKPWN1dAo=
ITSM::ConfigItem::Class
Computer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Hardware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Network
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Software
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Expired
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Inactive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Maintenance
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Pilot
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Planned
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Production
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Repair
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Retired
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Review
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Test/QA
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
Yes
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
No
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Laptop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Desktop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Phone
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
PDA
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Monitor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Printer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Switch
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Router
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
WLAN Access Point
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Security Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Backup Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Mouse
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Keybord
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Camera
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Beamer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Modem
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
PCMCIA Card
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
USB Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Docking Station
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Scanner
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Building
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Office
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Floor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Room
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Rack
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Workplace
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Outlet
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
IT Facility
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
LAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
WLAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Telco
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
GSM
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Middleware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Admin Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
User Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Embedded
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Single Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per User
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Concurrent Users
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Processor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Node
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Volume Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Enterprise Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Developer Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Demo
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Time Restricted
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Freeware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Open Source
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Unlimited
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1