ITSMConfigurationManagement
1.3.1
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 1.3.1.
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 1.3.1</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 1.3.1</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 1.3.1</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 1.3.1</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};
# 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."
);
}
}
2009-07-27 10:12:40
opms.otrs.com
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ACgmWgKAXHEcB0GQpul4PC67FgAAWEWiJQDIFYZhpVIJNC4BAEAO0RIAFDGTNwAAFBAtAUAR0y0BAEAB0RIAFBEtAQBAgbjsAgBgpWUzeYuWAADWXBiG2YM0TWe+LHhq8ZMUX7F4z3LpWgKAIuZaAgAgCII0TWdinekvC566fp6Cc+ZdsXjPculaAoAiBsQBAHBbkyaj4KbWpLlHrWyKNJdoCQCKiJYAAAj+zn0WCX0WGew2fdrp1qSCK07vuVIMiAOAIuZaAgBgYm470vXH018WnOG2V1xNupYAoIi5lgAACApnU1puoqXb7ryaLUuBriUAKJZFS+PxeGV/lwMAQIlESwBQJIqirAnZmDgAALhOtAQAN6hUKoFoCQAA5hEtAcANzOQNAAB5REsAcAMzeQMAQJ7QpKQAUGwwGARBUK1WV3/lVwAAeGSiJQAAAACWZEAcAAAAAEsSLQEAAACwJNESAAAAAEsSLQEAAACwJNESAAAAAEsSLQEAAACwJNESAAAAAEsSLQHAzS4uLk5PT5MkKbsQAABYLXHZBQDAE9But3u9Xr1er1arZdcCAAArRLQEADdrtVq1Wi2KorILAQCA1RKmaVp2DQAAAAA8SeZaAgAAAGBJoiUAAAAAliRaAgAAAGBJoiUAAAAAliRaAgAAAGBJoiUAAAAAliRaAgAAAGBJoiUAAAAAliRaAoCFfP78+T//+U+32y27EAAAWCGiJQBYSJqmQRCMRqOyCwEAgBUiWgKAhURRFIiWAADgn0RLALAQ0RIAAFwnWgKAhcRxHIiWAADgn0RLALCQrGtpOByWXQgAAKwQ0RIALMSAOAAAuE60BAALES0BAMB1oiUAWIhoCQAArhMtAcBCREsAAHCdaAkAFpJFS4F0CQAApoiWAGAhYRhWKpVAtAQAAFNESwCwqDiOA9ESAABMES0BwKJMtwQAADNESwCwqCxaGg6HZRcCAACrQrQEAIvStQQAADNESwCwKNESAADMEC0BwKJESwAAMEO0BACLEi0BAMAM0RIALCqO40C0BAAAU0RLALCoKIqiKMoCJgAAIAiCME3TsmsAAAAA4EnStQQAAADAkkRLAAAAACxJtAQAAADAkkRLAAAAACxJtAQAAADAkv4P+4SDsj7RbXgAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29uZmlnSXRlbS54bWwsdiAxLjMgMjAwOC8wOC8wOSAxMToyOTowMiB1YiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNQ29uZmlnSXRlbSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5JVFNNQ29uZmlnSXRlbSBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNvbmZpZyBJdGVtPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQ5NTwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBDb25maWcgSXRlbSBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5Db25maWcgSXRlbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbS1BcmVhPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Db25maWcgSXRlbTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPml0c21fY29uZmlnaXRlbS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMyMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtRWRpdCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBFZGl0PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5FZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q29uZmlnIEl0ZW0gUHJpbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtQWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtQWRkLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBBZGQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkFkZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUFkZDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5TZWFyY2g8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TZWFyY2g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnNlYXJjaC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIEVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlNlYXJjaFJlc3VsdDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ29uZmlnSXRlbS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbSZhbXA7Q2xhc3NJRD0kUURhdGF7IkNsYXNzSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj5vbmNsaWNrPSJqYXZhc2NyaXB0Omhpc3RvcnkuYmFjaygpOyByZXR1cm4gZmFsc2U7IjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1WZXJzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHZlcnNpb25zIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgVmVyc2lvbmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudVZlcnNpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5WZXJzaW9uczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgZWRpdCBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIEJlYXJiZWl0ZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ29uZmlnSXRlbS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZhbXA7Q29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMDAtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBwcmludCBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIERydWNrZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ29uZmlnSXRlbS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtUHJpbnQmYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtWZXJzaW9uSUQ9JFFEYXRheyJWZXJzaW9uSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj50YXJnZXQ9InByaW50IjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzQwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBWZXJrbvxwZmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50TGlua09iamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdCZhbXA7U291cmNlT2JqZWN0PUlUU01Db25maWdJdGVtJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJDb25maWdJdGVtSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzUwMC1EdXBsaWNhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBkdXBsaWNhdGUgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBEdXBsaXppZXJlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5EdXBsaWNhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5EdXBsaWNhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZhbXA7RHVwbGljYXRlSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7VmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6TnVtYmVyR2VuZXJhdG9yIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2VsZWN0IHRoZSBjb25maWcgaXRlbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZS4gIkF1dG9JbmNyZW1lbnQiIGluY3JlbWVudHMgdGhlIGNvbmZpZyBpdGVtIG51bWJlciwgdGhlIFN5c3RlbUlELCB0aGUgQ29uZmlnSXRlbUNsYXNzSUQgYW5kIHRoZSBjb3VudGVyIGFyZSB1c2VkLiBUaGUgZm9ybWF0IGlzICJTeXN0ZW1JRCBDb25maWdJdGVtQ2xhc3NJRCBDb3VudGVyIiwgZS5nLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlcyBNb2R1bHMgenVyIEdlbmVyaWVydW5nIGRlciBDb25maWdJdGVtLU51bW1lci4gIkF1dG9JbmNyZW1lbnQiIHrkaGx0IGRpZSBDb25maWdJdGVtLU51bW1lciBhdXRvbWF0aXNjaCBob2NoIHVuZCB2ZXJiaW5kZXQgc2llIG1pdCBkZXIgU3lzdGVtSUQgdW5kIG1pdCBkZXIgQ29uZmlnSXRlbUNsYXNzSUQuIEVzIHdpcmQgZGFzIEZvcm1hdCAiU3lzdGVtSUQgQ29uZmlnSXRlbUNsYXNzSUQgQ291bnRlciIgdmVyd2VuZGV0LCB6LiBCLiAxMjA1MDAwMDA0LCAxMjA1MDAwMDA1LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmZpZ0l0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIExvY2F0aW9uPSJLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL051bWJlci8qLnBtIiBTZWxlY3RlZElEPSJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6QXV0b0luY3JlbWVudCI+PC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6RGVmYXVsdFN1Yk9iamVjdCMjI0lUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGRlZmF1bHQgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyAnSVRTTUNvbmZpZ0l0ZW0nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGFzIFN0YW5kYXJkLVN1Ym9iamVjdCBkZXIgS2xhc3NlICdJVFNNQ29uZmlnSXRlbScuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Db21wdXRlcjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVjaWRlIGlmIHRoZSBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGl0c20gY29uZmlnIGl0ZW0gc3R1ZmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga/ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBTdGF0aXN0aWtlbiD8YmVyIElUU00gQ29uZmlnSXRlbSBEaW5nZSBnZW5lcmllcmVuIGRhcmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uIyMjSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5PYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+T2JqZWt0LUJhY2tlbmQgTW9kdWwgUmVnaXN0cmF0aW9uIGRlcyBJbXBvcnQvRXhwb3J0IE1vZHVscy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JbXBvcnRFeHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5PYmplY3RCYWNrZW5kOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+Q29uZmlnIEl0ZW08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
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==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogY3pfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjYgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0tvbmZpZy4gamVkbm90a3kgQ0knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn2O16ZW7tIGtvbmZpZ3VyYehu7WNoIGplZG5vdGVrIENJJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdabexuYSBkZWZpbmljZSc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnVPjtZGEnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1VrYb4gVmVyemUnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ0hpZGUgVmVyemUnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ1Bvc2xlZG7tIHpt7G5hIG9kJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICdQb3NsZWRu7SB6bexuYSc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnWm3sbmEgZGVmaW5pY+0gbmX6c3DsuW7hISBWaXogc3lzdOltb3b9IHrhem5hbSBvIGRldGFqbGVjaC4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gICAgICAgID0gJ0hsZWRhdCB2IHD4ZWRjaG967WNoIHZlcnrtY2g/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdVa2F6YW7pIGtvbmZpZy5qZWRub3RreSc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICAgICAgICAgPSAnRG9zdHVwbukga29uZmlnLmplZG5vdGt5JzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJExhbmctPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgID0gJyc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9zbGVkbu0gem3sbmEnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1pob3Rvdml0IGtvcGllJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWeXByY2hs6Sc7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmVha3Rpdm7tJzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfaZHK+YmEnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90LXb5ZGNlJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFub3bhbic7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZHVr6G7tJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcHJhdmEvT2Jub3Zlbu0nOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01pbW8gcHJvdm96JzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9obO2+ZW4nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvS29udHJvbGEga3ZhbGl0eSc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0b2xu7Sc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9iaWxu7Sc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3N0YXRu7Sc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1rhbG9ob3bhY+0gemH47Xplbu0nOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29tb3JhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEb2sgc3RhbmljZSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2zhdmVzbmljZSc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09icmF6b3ZrYSc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTXm5JzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPc3RhdG7tJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga2FydGEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rpc2vhcm5hJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSdWV0cic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU27tbWHoJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXpwZehub3N0bukgemH47Xplbu0nOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Nw7W5h6Cc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIHph+O16ZW7tJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOIGJvZCBw+O1zdHVwdSc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bu0nOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZG1pbmlzdHJh6G7tIG7hc3Ryb2onOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1W+aXZhdGVsc2vpIGFwbGlrYWNlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVvml2YXRlbHNr/SBvcGVyYehu7SBzeXN06W0nOwogICAgJExhbmctPnsnRW1iZWRkZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Zlc3Rhduxu/Sc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3T4ZWRu7SD6cm92ZfInOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bu0nOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcm924SBhcGxpa2FjZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyb3b9IG9wZXIuc3lzdOltJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVvml2YXRlbHNr/SBu4XN0cm9qJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLb25rdXJlbuhu7SB1vml2YXRlbOknOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2Ugdv12b2rh+GUnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BvZG5pa2F0ZWxza+EgbGljZW5jZSAnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlenBsYXRu/Sc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29mdHdhcmUgcyBvdGV2+GVu/W0gaz9kZW0nOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2924W7tIPp6bHUnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2924W7tIHBybyBwcm9jZXNvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5jb3bhbu0gcHJvIHNlcnZlcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5jb3bhbu0gcHJvIHW+aXZhdGVsZSc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSmVkbm90bGl24SBsaWNlbmNlJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfIYXNvduwgb21lemVu4SBsaWNlbmNlJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdOZW9tZXplbuEgbGljZW5jZSAnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NwZWNp4Wxu7SBvYuxtb3bpIHByb2dyYW15JzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+lyaW926SDo7XNsbyc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmHobu0gc3lzdOltJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9jZXNvcic7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFt7LsnOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1R2cmT9IGRpc2snOwogICAgJExhbmctPnsnSGFyZCBEaXNrOjpDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1R2cmT9IGRpc2s6OmthcGFjaXRhJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICc/S2FwYWNpdGEnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Ptu292/SBhZGFwdGVyJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICdT7btvdv0gYWRhcHRlcjo6SVAgeiBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICdT7btvdv0gYWRhcHRlcjo6SVAgYWRyZXNhJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCB6IERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIGFkcmVzYSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR3JhZmlja+Ega2FydGEnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ppbukgdnliYXZlbu0nOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgID0gJ0tvbmVjIHBsYXRub3N0aSB64XJ1a3knOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdHVtIGluc3RhbGFjZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+27b3bhIGFkcmVzYSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnU+27b3bhIGFkcmVzYTptYXNrYSBzdWJz7XTsJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgICA9ICdT7btvduEgYWRyZXNhOjpHYXRlIHD4ZWNob2QnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hc2thIHN1YnPtdOwnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGUgcPhlY2hvZCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHJ1aCBsaWNlbmNlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBrbO3oJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBrbO3oOjpNbm++c3R27Sc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnTGljZW7obu0ga2zt6Do6a29uZWMgcGxhdG5vc3RpJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNbm++c3R27Sc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29uZWMgcGxhdG5vc3RpJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN6WRpdW0nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jvb20nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db25maWdJdGVtLnBtLHYgMS41IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICdDb25maWcgSXRlbSc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnQ29uZmlnIEl0ZW0tQmVyZWljaCc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAnQ29uZmlnIEl0ZW0gVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnRGVmaW5pdGlvbiDkbmRlcm4nOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ0tsYXNzZSc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnVmVyc2lvbmVuIGVpbmJsZW5kZW4nOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1ZlcnNpb25lbiBhdXNibGVuZGVuJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICdadWxldHp0IGdl5G5kZXJ0IHZvbic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnWnVsZXR6dCBnZeRuZGVydCc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnxG5kZXJuIGRlciBEZWZpbml0aW9uIGZlaGxnZXNjaGxhZ2VuISBJbSBTeXN0ZW0gTG9nIGZpbmRlbiBTaWUgd2VpdGVyZSBJbmZvcm1hdGlvbmVuLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICdBdWNoIGluIGZy/GhlcmVuIFZlcnNpb25lbiBzdWNoZW4/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtcyBhbmdlemVpZ3QnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW1zIHZlcmb8Z2Jhcic7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICdDb25maWcgSXRlbSBTdWNoZSc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdWZXJ3ZW5kdW5nc3N0YXR1cyc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICdBa3R1ZWxsZXIgVmVyd2VuZHVuZ3NzdGF0dXMnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnVm9yZmFsbHNzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgPSAnQWt0dWVsbGVyIFZvcmZhbGxzc3RhdHVzJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0RlciBOYW1lIGRpZXNlcyBDb25maWcgSXRlbXMnOwogICAgJExhbmctPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9CiAgICAgICAgPSAnRGVyIFZlcndlbmR1bmdzc3RhdHVzIGRpZXNlcyBDb25maWcgSXRlbXMnOwogICAgJExhbmctPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdEZXIgVm9yZmFsbHNzdGF0dXMgZGllc2VzIENvbmZpZyBJdGVtcyc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xldHp0ZSDEbmRlcnVuZyc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpemllcmVuJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWJnZWxhdWZlbic7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luYWt0aXYnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbiBXYXJ0dW5nJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGlsb3RiZXRyaWViJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR2VwbGFudCc7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2R1a3Rpdic7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luIFJlcGFyYXR1cic7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F132VyIERpZW5zdCc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VudGVyIFJldmlldyc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUVMnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpdic7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZvcmZhbGwnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZXNrdG9wJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGFwdG9wJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbic7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JhY2t1cCBHZXLkdCc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbWVyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RvY2tpbmcgU3RhdGlvbic7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rhc3RhdHVyJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb25pdG9yJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWF1cyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BDTUNJQSBLYXJ0ZSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RydWNrZXInOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSb3V0ZXInOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTY2FubmVyJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2ljaGVydGhlaXRzZ2Vy5HQnOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTd2l0Y2gnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVU0IgR2Vy5HQnOwogICAgJExhbmctPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOIEFjY2VzcyBQb2ludCc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGtvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkbWluIFRvb2wnOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDbGllbnQgQW53ZW5kdW5nJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2xpZW50IEJldHJpZWJzc3lzdGVtJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWRkZWQnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNaWRkbGV3YXJlJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyIEFud2VuZHVuZyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlciBCZXRyaWVic3N5c3RlbSc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VzZXIgVG9vbCc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0dsZWljaHplaXRpZ2UgVXNlcic7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdFbnR3aWNrbGVyIExpemVueic7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJ0VudGVycHJpc2UgTGl6ZW56JzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRnJlZXdhcmUnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVuIFNvdXJjZSc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BybyBLbm90ZW4nOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gUHJvemVzc29yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvIFNlcnZlcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BybyBCZW51dHplcic7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VpbnplbGxpemVueic7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1plaXRsaWNoIGJlZ3Jlbnp0JzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVW5saW1pdGllcnQnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWb2x1bWVuIExpemVueic7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVsJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VyaWVubnVtbWVyJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQmV0cmllYnNzeXN0ZW0nOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDUFUnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmJlaXRzc3BlaWNoZXInOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGZXN0cGxhdHRlJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAnRmVzdHBsYXR0ZTo6S2FwYXppdOR0JzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2FwYXppdOR0JzsKICAgICRMYW5nLT57J0ZRRE4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRlFETic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ05ldHp3ZXJrIEFkYXB0ZXInOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICdOZXR6d2VyayBBZGFwdGVyOjpJUCD8YmVyIERIQ1AnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICAgICAgICAgICA9ICdOZXR6d2VyayBBZGFwdGVyOjpJUCBBZGRyZXNzZSc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIPxiZXIgREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIEFkZHJlc3NlJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnR3JhZmlrIEFkYXB0ZXInOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZSBBdXNzdGF0dHVuZyc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0dhcmFudGllIEFibGF1ZmRhdHVtJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5zdGFsbGF0aW9uc2RhdHVtJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmV0endlcmsgQWRkcmVzc2UnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICA9ICdOZXR6d2VyayBBZGRyZXNzZTo6U3VibmV0eiBNYXNrZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgID0gJ05ldHp3ZXJrIEFkZHJlc3NlOjpHYXRld2F5JzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3VibmV0eiBNYXNrZSc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGV3YXknOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaXplbnp0eXAnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaXplbnpzY2hs/HNzZWwnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdMaXplbnpzY2hs/HNzZWw6Ok1lbmdlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAnTGl6ZW56c2NobPxzc2VsOjpBYmxhdWZkYXR1bSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01lbmdlJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWJsYXVmZGF0dW0nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWRpdW0nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICA9ICdNYXhpbWFsZSBBbnphaGwgZWluZXMgRWxlbWVudHMnOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWthdG9yJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbiAxJzsKICAgICRMYW5nLT57J1Bob25lIDInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvbiAyJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dlYuR1ZGUnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFdGFnZSc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lUIEVpbnJpY2h0dW5nJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQvxybyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Fuc2NobHVzc2Rvc2UnOwogICAgJExhbmctPnsnUmFjayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSYWNrJzsKICAgICRMYW5nLT57J1Jvb20nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmF1bSc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyYmVpdHNwbGF0eic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
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=
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
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==
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==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjUgMjAwOS8wNS8xOCAwOTo1NzowNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYWdlCiAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BhZ2UnICkgfHwgMTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgb3V0cHV0IG1lbnUKICAgIG15ICVDbGFzc0NvdW50OwogICAgbXkgJENvdW50ZXIgPSAwOwogICAgZm9yIG15ICRDbGFzc0lEICggc29ydCB7ICR7JENsYXNzTGlzdH17JGF9IGNtcCAkeyRDbGFzc0xpc3R9eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgIyBjb3VudCBhbGwgcmVjb3JkcyBvZiB0aGlzIGNsYXNzCiAgICAgICAgJENsYXNzQ291bnR7JENsYXNzSUR9ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUNvdW50KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbWVudSBpdGVtIHNwbGl0CiAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICBDb3VudCAgID0+ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgaWQKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICBteSAlU2VhcmNoUmVzdWx0ID0gKAogICAgICAgIFJlc3VsdCAgICAgICAgICAgPT4gMCwKICAgICAgICBDb25maWdJdGVtc0F2YWlsID0+IDAsCiAgICApOwoKICAgIGlmICgkQ2xhc3NJRCkgewoKICAgICAgICAjIG91dHB1dCBjbGFzcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSA9ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwOwoKICAgICAgICBteSAkU2VhcmNoU3RhcnQgPSAwOwogICAgICAgIGlmICggJFBhZ2UgJiYgJFBhZ2UgPiAxICkgewogICAgICAgICAgICAkU2VhcmNoU3RhcnQgPSAoICRQYWdlIC0gMSApICogMTAwOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gbGlzdAogICAgICAgIG15ICRDb25maWdJdGVtUmVzdWx0TGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1SZXN1bHRMaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBTdGFydCAgID0+ICRTZWFyY2hTdGFydCwKICAgICAgICAgICAgTGltaXQgICA9PiAxMDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc2VhcmNoIHJlc3VsdAogICAgICAgICRTZWFyY2hSZXN1bHR7UmVzdWx0fSA9IEB7JENvbmZpZ0l0ZW1SZXN1bHRMaXN0fTsKICAgICAgICAkU2VhcmNoUmVzdWx0e1BhZ2V9ICAgPSBpbnQoICRTZWFyY2hSZXN1bHR7Q29uZmlnSXRlbXNBdmFpbH0gLyAxMDAgKTsKICAgICAgICBpZiAoICggJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSAvIDEwMCApIC0gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlfSsrOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtICggQHskQ29uZmlnSXRlbVJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDbGFzc1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IHBhZ2UKICAgIGlmICggJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICBmb3IgbXkgJFBhZ2VDb3VudCAoIDEgLi4gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHBhZ2UgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTmFtZSA9ICRQYWdlQ291bnQgZXEgJFBhZ2UgPyAnUGFnZUJvbGQnIDogJ1BhZ2VOb3JtYWwnOwoKICAgICAgICAgICAgIyBvdXRwdXQgcGFnZSBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRUZW1wbGF0ZU5hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgIFBhZ2UgICAgPT4gJFBhZ2VDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlTnVsbH0gPSAwOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlICAgPT4gJ092ZXJ2aWV3JywKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZWFyY2hSZXN1bHQsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZWRpcmVjdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZDbGFzc0lEPSRDbGFzc0lEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnQWRkJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtQWRkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtRWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZ2l0ZW0gaWQgYW5kIGNsYXNzIGlkCiAgICBteSAkQ29uZmlnSXRlbSA9IHt9OwogICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApIHx8IDA7CiAgICAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9ICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApICAgICAgfHwgMDsKICAgIG15ICREdXBsaWNhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0R1cGxpY2F0ZUlEJyApIHx8IDA7CgogICAgIyBnZXQgbmVlZGVkIGRhdGEKICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICYmICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0KICAgICAgICAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkRHVwbGljYXRlSUQpIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gdG8gZHVwbGljYXRlCiAgICAgICAgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNvbmZpZyBpdGVtIGlkIGFuZCBudW1iZXIKICAgICAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAnTkVXJzsKICAgICAgICAkQ29uZmlnSXRlbS0+e051bWJlcn0gICAgICAgPSAnTkVXJzsKICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9ICdORVcnOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwogICAgICAgICRDb25maWdJdGVtLT57Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICk7CgogICAgIyBhYm9ydCwgaWYgbm8gZGVmaW5pdGlvbiBpcyBkZWZpbmVkCiAgICBpZiAoICEkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIERlZmluaXRpb24gd2FzIGRlZmluaWVkIGZvciBjbGFzcyAkQ29uZmlnSXRlbS0+e0NsYXNzfSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHN1Ym1pdCBzYXZlCiAgICBteSAkU3VibWl0U2F2ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdFNhdmUnICk7CgogICAgIyBnZXQgeG1sIGRhdGEKICAgIG15ICRWZXJzaW9uID0ge307CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgIG15ICRBbGxSZXF1aXJlZCA9IDE7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgZm9ybSBkYXRhCiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KE5hbWUgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQpKSB7CiAgICAgICAgICAgICRWZXJzaW9uLT57JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKTsKICAgICAgICAgICAgaWYgKCAhJFZlcnNpb24tPnskRm9ybVBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHhtbCBmb3JtIGRhdGEKICAgICAgICAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gXCRBbGxSZXF1aXJlZCwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdmVyc2lvbiB0byBkYXRhYmFzZQogICAgICAgIGlmICggJFN1Ym1pdFNhdmUgJiYgJEFsbFJlcXVpcmVkICkgewogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdmVyc2lvbgogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJWZXJzaW9uSUQiICk7CiAgICAgICAgaWYgKCRWZXJzaW9uSUQpIHsKCiAgICAgICAgICAgICMgZ2V0IHZlcnNpb24gZGF0YSB0byBkdXBsaWNhdGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEgdG8gZHVwbGljYXRlIGNvbmZpZyBpdGVtCiAgICAgICAgICAgICRWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVhNTEZvcm1PdXRwdXRQYXJhbTsKICAgIGlmICggJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSApIHsKICAgICAgICAkWE1MRm9ybU91dHB1dFBhcmFte1hNTERhdGF9ID0gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXTsKICAgIH0KCiAgICAjIG91dHB1dCBuYW1lIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd05hbWUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBuYW1lIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57TmFtZX0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnUm93TmFtZUludmFsaWQnICk7CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBEZXBsU3RhdGVPcHRpb25TdHJnCiAgICBteSAkRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVwbFN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3dEZXBsU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBEZXBsU3RhdGVPcHRpb25TdHJnID0+ICREZXBsU3RhdGVPcHRpb25TdHJnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGRlcGxveW1lbnQgc3RhdGUgaW52YWxpZCBibG9jawogICAgaWYgKCAhJFZlcnNpb24tPntEZXBsU3RhdGVJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93RGVwbFN0YXRlSW52YWxpZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdvcGVyYXRpb25hbCcsICdpbmNpZGVudCcgXSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBJbmNpU3RhdGVPcHRpb25TdHJnCiAgICBteSAkSW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93SW5jaVN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkSW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57SW5jaVN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Jvd0luY2lTdGF0ZUludmFsaWQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgeG1sIGZvcm0KICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAkU2VsZi0+X1hNTEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgJVhNTEZvcm1PdXRwdXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxGb3JtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17QWxsUmVxdWlyZWR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0FsbFJlcXVpcmVkfSBuZSAnU0NBTEFSJzsKCiAgICBteSAkRm9ybURhdGEgPSB7fTsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgbXkgJENvdW50ZXJJbnNlcnQgPSAxOwoKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgbXkgJEFkZEtleSAgID0gJEl0ZW0tPntLZXl9IC4gJzo6QWRkJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgICAgICRBZGRLZXkgICA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRBZGRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgICAgIG15ICRGb3JtVmFsdWVzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgS2V5ICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRGb3JtVmFsdWVzLT57VmFsdWV9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgdmFsdWUKICAgICAgICAgICAgICAgIGlmICggJEZvcm1WYWx1ZXMtPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICAgICAkeyAkUGFyYW17QWxsUmVxdWlyZWR9IH0gPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGVsZXRlIGJ1dHRvbgogICAgICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJElucHV0S2V5IC4gJzo6RGVsZXRlJyApOwoKICAgICAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWJGb3JtRGF0YSA9ICRTZWxmLT5fWE1MRm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICBBbGxSZXF1aXJlZCAgID0+ICRQYXJhbXtBbGxSZXF1aXJlZH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0gPSAkU3ViRm9ybURhdGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICRGb3JtVmFsdWVzLT57VmFsdWV9OwogICAgICAgICAgICAgICAgJENvdW50ZXJJbnNlcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGFkZCBidXR0b24KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkQWRkS2V5ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTZWxmLT5fWE1MRGVmYXVsdFNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCnN1YiBfWE1MRGVmYXVsdFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgbXkgJERlZmF1bHREYXRhID0ge307CgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50RGVmYXVsdH0gKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJERlZmF1bHREYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdID0gJFNlbGYtPl9YTUxEZWZhdWx0U2V0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGVmYXVsdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERlZmF1bHREYXRhOwp9CgpzdWIgX1hNTEZvcm1PdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgIyBzZXQgZGF0YSBwcmVzZW50IG1vZGUKICAgIG15ICREYXRhUHJlc2VudE1vZGUgPSAwOwogICAgaWYgKCAkUGFyYW17WE1MRGF0YX0gJiYgcmVmICRQYXJhbXtYTUxEYXRhfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJERhdGFQcmVzZW50TW9kZSA9IDE7CiAgICB9CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIG91dHB1dCByb3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdYTUxSb3cnICk7CgogICAgICAgICMgc2V0IGxvb3AKICAgICAgICBteSAkTG9vcCA9ICRJdGVtLT57Q291bnREZWZhdWx0fTsKICAgICAgICBpZiAoJERhdGFQcmVzZW50TW9kZSkgewogICAgICAgICAgICAkTG9vcCA9IDA7CgogICAgICAgICAgICAjIHNlYXJjaCB0aGUgbGFzdCBjb250ZW50CiAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAkTG9vcCA9ICRDb3VudGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBhYnNvbHV0IG1pbmltdW0KICAgICAgICAgICAgaWYgKCAkTG9vcCA8ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAgICAgJExvb3AgPSAkSXRlbS0+e0NvdW50TWlufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVsZXRlCiAgICAgICAgbXkgJERlbGV0ZSA9IDA7CiAgICAgICAgaWYgKCAkTG9vcCA+ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAkRGVsZXRlID0gMTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNvbnRlbnQgcm93cwogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJExvb3AgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlJyApOwoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGNvbnRlbnQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+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=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBjb25maWcgaXRlbSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSx2IDEuMiAyMDA5LzA1LzE4IDA5OjU3OjA1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1BERk9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApOwogICAgbXkgJFZlcnNpb25JRCAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCB8fCAhJFZlcnNpb25JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb25maWdJdGVtSUQgJENvbmZpZ0l0ZW1JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICApOwogICAgaWYgKCAhJFZlcnNpb24tPntWZXJzaW9uSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJWZXJzaW9uSUQgJFZlcnNpb25JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgJENvbmZpZ0l0ZW0tPntDdXJyZW50TmFtZX0gPSAkTGFzdFZlcnNpb24tPntOYW1lfTsKCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBteSAkVmVyc2lvbk51bWJlciA9IDE7CiAgICBMSVNUVkVSU0lPTklEOgogICAgZm9yIG15ICRMaXN0VmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewoKICAgICAgICBsYXN0IExJU1RWRVJTSU9OSUQgaWYgJFZlcnNpb25JRCBlcSAkTGlzdFZlcnNpb25JRDsKICAgICAgICAkVmVyc2lvbk51bWJlcisrOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSBvZiBjb25maWcgaXRlbSAoY3JlYXRlIGJ5KQogICAgbXkgJUNvbmZpZ0l0ZW1DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ29uZmlnSXRlbS0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBkYXRhIG9mIGNvbmZpZyBpdGVtIChjaGFuZ2UgYnkpCiAgICBteSAlQ29uZmlnSXRlbUNoYW5nZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgb2YgdmVyc2lvbiAoY3JlYXRlIGJ5KQogICAgbXkgJVZlcnNpb25DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVmVyc2lvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHR5cGUgbGlzdAogICAgbXkgJUxpbmtUeXBlTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaW5rIGRhdGEKICAgIG15ICVMaW5rRGF0YTsKICAgIGlmICggJExpbmtMaXN0V2l0aERhdGEgJiYgcmVmICRMaW5rTGlzdFdpdGhEYXRhIGVxICdIQVNIJyAmJiAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICAlTGlua0RhdGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAnU2ltcGxlUmF3JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CgogICAgICAgIG15ICVQYWdlOwogICAgICAgIG15ICRVcmwgPSAnICc7CgogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSHR0cFR5cGUnKSAuICc6Ly8nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgICAgIC4gJEVOVntSRVFVRVNUX1VSSX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KCiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ29uZmlnSXRlbScpIC4gJyMnCiAgICAgICAgICAgIC4gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gID0gJFZlcnNpb24tPntOYW1lfTsKICAgICAgICAkUGFnZXtIZWFkbGluZVJpZ2h0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5JykgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJyRFbnZ7IlRpbWUifScgKTsKICAgICAgICAkUGFnZXtGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzonIC4gJFZlcnNpb24tPntOYW1lfSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgb3V0cHV0IGdlbmVyYWwgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEdlbmVyYWxJbmZvcygKICAgICAgICAgICAgUGFnZSAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgPT4gXCVDb25maWdJdGVtQ3JlYXRlQnksCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gXCVDb25maWdJdGVtQ2hhbmdlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlua2VkIG9iamVjdHMKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBMaW5rRGF0YSAgICAgPT4gXCVMaW5rRGF0YSwKICAgICAgICAgICAgICAgIExpbmtUeXBlTGlzdCA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHZlcnNpb24gaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFZlcnNpb25JbmZvcygKICAgICAgICAgICAgUGFnZSAgICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFZlcnNpb24gICAgICAgPT4gJFZlcnNpb24sCiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gJFZlcnNpb25OdW1iZXIsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gXCVWZXJzaW9uQ3JlYXRlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgZmlsZSBuYW1lCiAgICAgICAgbXkgJEZpbGVuYW1lID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkQ29uZmlnSXRlbS0+e051bWJlcn0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICApOwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnY29uZmlnaXRlbV8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkVmVyc2lvbi0+e05hbWV9ICk7CgogICAgICAgIGlmICglTGlua0RhdGEpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUeXBlTmFtZSA9PiAkTGlua1R5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICAgICAgICAgIG15ICRPYmplY3RMaXN0ID0gJExpbmtEYXRheyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZVJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rU3RyZyA9PiAkSXRlbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCB2ZXJzaW9uIGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAiVmVyc2lvbiIsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBWZXJzaW9uTnVtYmVyICAgICAgICAgPT4gJFZlcnNpb25OdW1iZXIsCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJFZlcnNpb25DcmVhdGVCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyRmlyc3RuYW1lID0+ICRWZXJzaW9uQ3JlYXRlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMYXN0bmFtZSAgPT4gJFZlcnNpb25DcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHhtbCBzdHJ1Y3R1cmUKICAgICAgICBpZiAoCiAgICAgICAgICAgICRWZXJzaW9uCiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbiBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufQogICAgICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9CiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0gICAgICAgZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0KICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0KICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259IGVxICdBUlJBWScKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPl9IVE1MT3V0cHV0WE1MU3RydWN0dXJlKAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckxvZ2luICAgICA9PiAkQ29uZmlnSXRlbUNyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENvbmZpZ0l0ZW1DcmVhdGVCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckxhc3RuYW1lICA9PiAkQ29uZmlnSXRlbUNyZWF0ZUJ5e1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJMb2dpbiAgICAgPT4gJENvbmZpZ0l0ZW1DaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDb25maWdJdGVtQ2hhbmdlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJMYXN0bmFtZSAgPT4gJENvbmZpZ0l0ZW1DaGFuZ2VCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICAjIHJldHVybiBvdXRwdXQKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRHZW5lcmFsSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBDb25maWdJdGVtIENyZWF0ZUJ5IENoYW5nZUJ5KSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2xhc3MnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NvbmZpZ0l0ZW19LT57Q2xhc3N9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ29uZmlnSXRlbScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q29uZmlnSXRlbX0tPntDdXJyZW50TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbX0tPntDdXJEZXBsU3RhdGV9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VycmVudCBJbmNpZGVudCBTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtfS0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGFzdCBjaGFuZ2VkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjQUFBQUFBJzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvck9kZH0gICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJExpbmtUeXBlTmFtZSk7CgogICAgICAgICMgZGVmaW5lIGhlYWRsaW5lCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExpbmtUeXBlTmFtZSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJyc7CgogICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFBhcmFte0xpbmtEYXRhfS0+eyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSB8fD0gJyc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkSXRlbS0+e1RpdGxlfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZSB7CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMaW5rZWQgT2JqZWN0cycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRWZXJzaW9uSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBWZXJzaW9uIFZlcnNpb25OdW1iZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVmVyc2lvbicpIC4gJyAnCiAgICAgICAgICAgIC4gJFBhcmFte1ZlcnNpb25OdW1iZXJ9LAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyBjcmVhdGUgdGFibGUKICAgIG15ICRUYWJsZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17VmVyc2lvbn0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJyAnLAogICAgICAgICAgICBWYWx1ZSA9PiAnICcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdOYW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtWZXJzaW9ufS0+e05hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRGVwbG95bWVudCBTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZlcnNpb259LT57RGVwbFN0YXRlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW5jaWRlbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWZXJzaW9ufS0+e0luY2lTdGF0ZX0gKSwKICAgICAgICB9LAogICAgXTsKCiAgICAjIGFkZCB4bWwgZGF0YSB0byB0YWJsZQogICAgaWYgKAogICAgICAgIHJlZiAkUGFyYW17VmVyc2lvbn0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGVmaW5pdGlvbn0KICAgICAgICAmJiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEZWZpbml0aW9ufSBlcSAnQVJSQVknCiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9ICAgICAgIGVxICdBUlJBWScKICAgICAgICAmJiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdCiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259CiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5fUERGT3V0cHV0WE1MT3V0cHV0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRQYXJhbXtWZXJzaW9ufS0+e1hNTERlZmluaXRpb259LAogICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICBUYWJsZURhdGEgICAgID0+ICRUYWJsZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvd3MgPSBAeyRUYWJsZX07CgogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRUYWJsZS0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDEwMDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQxMTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRYTUxPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17VGFibGVEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGF9OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtUYWJsZURhdGF9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc3RvcCBsb29wLCBpZiBubyBjb250ZW50IHdhcyBnaXZlbgogICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CgogICAgICAgICAgICAjIGxvb2t1cCB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuZXcgcm93CiAgICAgICAgICAgIG15ICROZXdSb3cgPSB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJEl0ZW0tPntOYW1lfSApIC4gJzonLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgIyBvdXRwdXQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE5ld1Jvdy0+e0tleX0gICA9ICcgICAgJyAuICROZXdSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgICAgICROZXdSb3ctPntWYWx1ZX0gPSAnICAgICcgLiAkTmV3Um93LT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByb3cgZGF0YQogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtUYWJsZURhdGF9IH0sICROZXdSb3c7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRYTUxPdXRwdXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgVGFibGVEYXRhICAgICA9PiAkUGFyYW17VGFibGVEYXRhfSwKICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxPdXRwdXRYTUxTdHJ1Y3R1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBkYXRhIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVmVyc2lvblJvd05hbWVQcmUnICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVmVyc2lvblJvd1ZhbHVlUHJlJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9IVE1MT3V0cHV0WE1MU3RydWN0dXJlKAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBzZWFyY2ggbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBzZWFyY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBdHRyaWJ1dGUnICkgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdObyBDbGFzc0lEIGlzIGdpdmVuIScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIERlcGxTdGF0ZU9wdGlvblN0cmcKICAgICAgICBteSAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgU2l6ZSAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICAgICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEluY2lTdGF0ZU9wdGlvblN0cmcKICAgICAgICBteSAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgU2l6ZSAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcKICAgICAgICBteSAkUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByZXZpb3VzVmVyc2lvblNlYXJjaCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAgICAgMSA9PiAnWWVzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dHJpYnV0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgICAgPT4gJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVPcHRpb25TdHJnICAgID0+ICRDdXJJbmNpU3RhdGVPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyA9PiAkUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgICAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhYm9ydCwgaWYgbm8gZGVmaW5pdGlvbiBpcyBkZWZpbmVkCiAgICAgICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIERlZmluaXRpb24gd2FzIGRlZmluaWVkIGZvciBjbGFzcyAkQ2xhc3NMaXN0LT57JENsYXNzSUR9ISIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHhtbCBzZWFyY2ggZm9ybQogICAgICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtT3V0cHV0KAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnU2VhcmNoJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY29uZmlnIGl0ZW0gY2xhc3Mgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQgfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY2xhc3MgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnU2VhcmNoJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1hNTFNlYXJjaEZvcm1PdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgICAgID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgICROYW1lICAgICA9ICRQYXJhbXtQcmVmaXhOYW1lfSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSwgaWYgbWFya2VkIGFzIHNlYXJjaGFibGUKICAgICAgICBpZiAoICRJdGVtLT57U2VhcmNoYWJsZX0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRyaWJ1dGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hSZXN1bHQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBzZWFyY2ggcmVzdWx0IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdC5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjU3OjA1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNsYXNzIGlkCiAgICBteSAlU2VhcmNoQXR0cmlidXRlOwogICAgJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc0lEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgaWYgKCAhJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc0lEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ0xhc3NJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbHVlcwogICAgRk9STVZBTFVFOgogICAgZm9yIG15ICRGb3JtVmFsdWUgKHF3KE51bWJlciBOYW1lIFByZXZpb3VzVmVyc2lvblNlYXJjaCkpIHsKCiAgICAgICAgIyBnZXQgdmFsdWUKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtVmFsdWUgKTsKCiAgICAgICAgbmV4dCBGT1JNVkFMVUUgaWYgISRWYWx1ZTsKCiAgICAgICAgJFNlYXJjaEF0dHJpYnV0ZXskRm9ybVZhbHVlfSA9ICRWYWx1ZTsKICAgIH0KCiAgICAjIGdldCBhcnJheXMKICAgIEZPUk1BUlJBWToKICAgIGZvciBteSAkRm9ybUFycmF5IChxdyhEZXBsU3RhdGVJRHMgSW5jaVN0YXRlSURzKSkgewoKICAgICAgICAjIGdldCBhcnJheQogICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJEZvcm1BcnJheSApOwoKICAgICAgICBuZXh0IEZPUk1BUlJBWSBpZiAhQEFycmF5OwoKICAgICAgICAkU2VhcmNoQXR0cmlidXRleyRGb3JtQXJyYXl9ID0gXEBBcnJheTsKICAgIH0KCiAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0sCiAgICApOwoKICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBEZWZpbml0aW9uIHdhcyBkZWZpbmllZCBmb3IgY2xhc3MgJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc30hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB4bWwgc2VhcmNoIGZvcm0KICAgIG15ICRYTUxGb3JtRGF0YSA9IFtdOwogICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtR2V0KAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBYTUxGb3JtRGF0YSAgID0+ICRYTUxGb3JtRGF0YSwKICAgICk7CgogICAgaWYgKCBAeyRYTUxGb3JtRGF0YX0gKSB7CiAgICAgICAgJFNlYXJjaEF0dHJpYnV0ZXtXaGF0fSA9ICRYTUxGb3JtRGF0YTsKICAgIH0KCiAgICAjIHN0YXJ0IHNlYXJjaAogICAgbXkgJFNlYXJjaFJlc3VsdExpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgJVNlYXJjaEF0dHJpYnV0ZSwKICAgICAgICBDbGFzc0lEcyA9PiBbICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0gXSwKICAgICk7CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgbXkgJFRvdGFsSGl0cyA9IEB7JFNlYXJjaFJlc3VsdExpc3R9OwogICAgbXkgJENzc0NsYXNzICA9ICcnOwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRTZWFyY2hSZXN1bHRMaXN0fSApIHsKCiAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskTGFzdFZlcnNpb259LAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRMYXN0VmVyc2lvbi0+e0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZWFyY2gnICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVNlYXJjaEF0dHJpYnV0ZSwKICAgICAgICAgICAgVG90YWxIaXRzID0+ICRUb3RhbEhpdHMsCiAgICAgICAgICAgIENsYXNzICAgICA9PiAkQ2xhc3NMaXN0LT57ICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1hNTFNlYXJjaEZvcm1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxGb3JtRGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRm9ybURhdGF9IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgY3JlYXRlIGlucHV0a2V5CiAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlYXJjaCBmb3JtIGRhdGEKICAgICAgICBteSAkVmFsdWVzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgICAgICBLZXkgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggYXJyYXkKICAgICAgICBteSBAU2VhcmNoVmFsdWVzOwogICAgICAgIFZBTFVFOgogICAgICAgIGZvciBteSAkVmFsdWUgKCBAeyRWYWx1ZXN9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgcHVzaCBAU2VhcmNoVmFsdWVzLCAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFNlYXJjaFZhbHVlcykgewoKICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGtleQogICAgICAgICAgICBteSAkU2VhcmNoS2V5ID0gJElucHV0S2V5OwogICAgICAgICAgICAkU2VhcmNoS2V5ID1+IHN7IDo6IH17XCdcfVslXVx7XCd9eG1zZzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiBcQFNlYXJjaFZhbHVlcywKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEZvcm1EYXRhfSB9LCAkU2VhcmNoSGFzaDsKICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgWE1MRm9ybURhdGEgICA9PiAkUGFyYW17WE1MRm9ybURhdGF9LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICkgfHwgMDsKICAgIG15ICRWZXJzaW9uSUQgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWZXJzaW9uSUQnICkgICAgfHwgMDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc2hvdyB2ZXJzaW9ucwogICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAwOwogICAgaWYgKCAkU2VsZi0+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+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0KICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtT3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBkYXRhIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnRGF0YU5hbWVQcmUnICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnRGF0YVZhbHVlUHJlJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPl9YTUxPdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXIgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY3VzdG9tZXIgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBjaGVjayBzZWFyY2ggYnV0dG9uCiAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApOwogICAgfQoKICAgICMgY2hlY2sgc2VsZWN0IGJ1dHRvbgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uU2VsZWN0JyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXNldCB2YWx1ZSBpZiBzZWFyY2ggZmllbGQgaXMgZW10eQogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJyc7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CiAgICBteSAkU2l6ZSAgICAgICAgID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNTA7CiAgICBteSAkU2VhcmNoICAgICAgID0gJyc7CiAgICBteSAkU3RyaW5nT3B0aW9uID0gJyc7CiAgICBteSAkU3RyaW5nU2VsZWN0ID0gJyc7CgogICAgIyBjdXN0b21lciBzZWFyY2gKICAgIGlmICggJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0gKSB7CgogICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofSwKICAgICAgICApOwogICAgICAgIGlmICglQ3VzdG9tZXJTZWFyY2hMaXN0KSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBvcHRpb24gbGlzdAogICAgICAgICAgICAkU3RyaW5nT3B0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0tleX0gLiAnOjpTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyU2VhcmNoTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiAuPSAnPGJyPic7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWxlY3QgYnV0dG9uCiAgICAgICAgICAgICRTdHJpbmdTZWxlY3QgPSAnPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJwogICAgICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAgICAgLiAnOjpCdXR0b25TZWxlY3QiICcKICAgICAgICAgICAgICAgIC4gJ3ZhbHVlPSIkVGV4dHsiU2VsZWN0In0iPiZuYnNwOyc7CgogICAgICAgICAgICAjIHNldCBzZWFyY2gKICAgICAgICAgICAgJFNlYXJjaCA9ICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBjdXN0b21lciBzdHJpbmcKICAgIGVsc2lmICgkVmFsdWUpIHsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgICAgIG15ICVDdXN0b21lclNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFZhbHVlLAogICAgICAgICk7CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRDdXN0b21lclNlYXJjaExpc3R7JFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIHN0cmluZwogICAgbXkgJFN0cmluZwogICAgICAgID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgIC4gJFZhbHVlIC4gJyI+JwogICAgICAgIC4gJzxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSInCiAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgIC4gJzo6U2VhcmNoIiBzaXplPSInCiAgICAgICAgLiAkU2l6ZQogICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAuICRTZWFyY2ggLiAnIj4nIC4gJzxicj4nCiAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgLiAkU3RyaW5nU2VsZWN0CiAgICAgICAgLiAnPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICc6OkJ1dHRvblNlYXJjaCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSI+JwogICAgICAgIC4gJyZuYnNwOycKICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgIC4gJzo6QnV0dG9uQ2xlYXIiIHZhbHVlPSIkVGV4dHsiQ2xlYXIifSI+JzsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIjYwXCI+IjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGUucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0RGF0ZS5wbSx2IDEuMyAyMDA5LzA3LzIxIDAwOjQ0OjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RGF0ZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDEtMDEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJFFEYXRheyJEYXRlIn0ifScsCiAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICBEYXRlID0+ICRQYXJhbXtWYWx1ZX0gLiAnIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtWYWx1ZX0gPX4gcy8wMDowMDowMC8vOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJERheSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNb250aCcgKTsKICAgIG15ICRZZWFyICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwoKICAgIGlmICggJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJERheSAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICk7CgogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkWWVhciAuICctJyAuICRNb250aCAuICctJyAuICREYXk7CiAgICB9CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVZhbHVlczsKICAgIGlmICggJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKCiAgICAgICAgaWYgKCAkVmFsdWUgPX4gL14oXGRcZFxkXGQpLShcZFxkfFxkKS0oXGRcZHxcZCkkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgfSAgPSAkMTsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpNb250aCcgfSA9ICQyOwogICAgICAgICAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6OkRheScgfSAgID0gJDM7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQYXJhbXtLZXl9IC4gJzo6JywKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRVc2VkICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpVc2VkJyApOwogICAgbXkgJERheSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNb250aCcgKTsKICAgIG15ICRZZWFyICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwoKICAgIG15ICRWYWx1ZXMgPSBbXTsKICAgIGlmICggJFVzZWQgJiYgJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJERheSAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICk7CgogICAgICAgIG15ICREYXRlID0gJFllYXIgLiAnLScgLiAkTW9udGggLiAnLScgLiAkRGF5OwogICAgICAgIHB1c2ggQHskVmFsdWVzfSwgJERhdGU7CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWYWx1ZXM7CiAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6Ok9wdGlvbmFsJyB9ID0gMTsKCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUGFyYW17S2V5fSAuICc6OicsCiAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJVZhbHVlcywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDo0NDo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RGF0ZVRpbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGRhdGV0aW1lIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlVGltZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDEtMDEgMTI6MDAnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte1ZhbHVlfSAuICc6MDAnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJERheSAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpEYXknICk7CiAgICBteSAkTW9udGggID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1vbnRoJyApOwogICAgbXkgJFllYXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwogICAgbXkgJEhvdXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpIb3VyJyApOwogICAgbXkgJE1pbnV0ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNaW51dGUnICk7CgogICAgaWYgKCAkRGF5ICYmICRNb250aCAmJiAkWWVhciApIHsKICAgICAgICAkRGF5ICAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoICA9IHNwcmludGYoICIlMDJkIiwgJE1vbnRoICk7CiAgICAgICAgJFllYXIgICA9IHNwcmludGYoICIlMDJkIiwgJFllYXIgKTsKICAgICAgICAkSG91ciAgID0gc3ByaW50ZiggIiUwMmQiLCAkSG91ciApOwogICAgICAgICRNaW51dGUgPSBzcHJpbnRmKCAiJTAyZCIsICRNaW51dGUgKTsKCiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRZZWFyIC4gJy0nIC4gJE1vbnRoIC4gJy0nIC4gJERheSAuICcgJyAuICRIb3VyIC4gJzonIC4gJE1pbnV0ZTsKICAgIH0KCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+ICcyMDA3LTAzLTI2IDEyOjAwJywgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWYWx1ZXM7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgICAgIGlmICggJFZhbHVlID1+IC9eKFxkXGRcZFxkKS0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCkkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgfSAgID0gJDE7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnIH0gID0gJDI7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6RGF5JyB9ICAgID0gJDM7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6SG91cicgfSAgID0gJDQ7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TWludXRlJyB9ID0gJDU7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQYXJhbXtLZXl9IC4gJzo6JywKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJVZhbHVlcywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVXNlZCAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlVzZWQnICk7CiAgICBteSAkRGF5ICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnICk7CiAgICBteSAkWWVhciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlllYXInICk7CiAgICBteSAkSG91ciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkhvdXInICk7CiAgICBteSAkTWludXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1pbnV0ZScgKTsKCiAgICBteSAkVmFsdWVzID0gW107CiAgICBpZiAoICRVc2VkICYmICREYXkgJiYgJE1vbnRoICYmICRZZWFyICkgewogICAgICAgICREYXkgICAgPSBzcHJpbnRmKCAiJTAyZCIsICREYXkgKTsKICAgICAgICAkTW9udGggID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgID0gc3ByaW50ZiggIiUwMmQiLCAkWWVhciApOwogICAgICAgICRIb3VyICAgPSBzcHJpbnRmKCAiJTAyZCIsICRIb3VyICk7CiAgICAgICAgJE1pbnV0ZSA9IHNwcmludGYoICIlMDJkIiwgJE1pbnV0ZSApOwoKICAgICAgICBteSAkRGF0ZSA9ICRZZWFyIC4gJy0nIC4gJE1vbnRoIC4gJy0nIC4gJERheSAuICcgJyAuICRIb3VyIC4gJzonIC4gJE1pbnV0ZTsKICAgICAgICBwdXNoIEB7JFZhbHVlc30sICREYXRlOwogICAgfQoKICAgIHJldHVybiAkVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVmFsdWVzOwogICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpPcHRpb25hbCcgfSA9IDE7CgogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFBhcmFte0tleX0gLiAnOjonLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RHVtbXk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dER1bW15IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGR1bW15IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREdW1teS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgpOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICByZXR1cm4gJyZuYnNwOyc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICByZXR1cm4ge307Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICByZXR1cm4gW107Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0R2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRHZW5lcmFsQ2F0YWxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBnZW5lcmFsIGNhdGFsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtWYWx1ZX0gfHw9ICcnOwoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNlbGVjdGVkSUQgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CgogICAgIyB0cmFuc2xhdGlvbiBvbiBvciBvZmYKICAgIG15ICRUcmFuc2xhdGlvbiA9IDA7CiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkVHJhbnNsYXRpb24gPSAxOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJhbnNsYXRpb24sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZElELAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNsYXRpb24gb24gb3Igb2ZmCiAgICBteSAkVHJhbnNsYXRpb24gPSAwOwogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFRyYW5zbGF0aW9uID0gMTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uID0+ICRUcmFuc2xhdGlvbiwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDo0NDo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXIucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0SW50ZWdlci5wbSx2IDEuMyAyMDA5LzA3LzIxIDAwOjQ0OjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXIgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgaW50ZWdlciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0SW50ZWdlci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSB8fCAnJzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbWluLCBtYXggYW5kIGRlZmF1bHQKICAgIG15ICRWYWx1ZU1pbiA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWlufSB8fCAxOwogICAgbXkgJFZhbHVlTWF4ID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNYXh9IHx8IDE7CiAgICBpZiAoICRWYWx1ZU1pbiA+ICRWYWx1ZU1heCApIHsKICAgICAgICAkVmFsdWVNaW4gPSAkVmFsdWVNYXg7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fQogICAgICAgICYmICgKICAgICAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA8ICRWYWx1ZU1pbgogICAgICAgICAgICB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ID4gJFZhbHVlTWF4CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ID0gJyc7CiAgICB9CgogICAgIyBjcmVhdGUgZGF0YSBhcnJheQogICAgbXkgJEludGVnZXJMaXN0ID0gW107CiAgICBmb3IgbXkgJENvdW50ZXIgKCAkVmFsdWVNaW4gLi4gJFZhbHVlTWF4ICkgewogICAgICAgIHB1c2ggQHskSW50ZWdlckxpc3R9LCAkQ291bnRlcjsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbnRlZ2VyTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBtaW4sIG1heCBhbmQgZGVmYXVsdAogICAgbXkgJFZhbHVlTWluID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNaW59IHx8IDE7CiAgICBteSAkVmFsdWVNYXggPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1heH0gfHwgMTsKICAgIGlmICggJFZhbHVlTWluID4gJFZhbHVlTWF4ICkgewogICAgICAgICRWYWx1ZU1pbiA9ICRWYWx1ZU1heDsKICAgIH0KICAgIGlmICgKICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IDwgJFZhbHVlTWluCiAgICAgICAgICAgIHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPiAkVmFsdWVNYXgKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPSAnJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBkYXRhIGFycmF5CiAgICBteSAkSW50ZWdlckxpc3QgPSBbXTsKICAgIGZvciBteSAkQ291bnRlciAoICRWYWx1ZU1pbiAuLiAkVmFsdWVNYXggKSB7CiAgICAgICAgcHVzaCBAeyRJbnRlZ2VyTGlzdH0sICRDb3VudGVyOwogICAgfQoKICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiAkSW50ZWdlckxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSB8fCAnJywKICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHQucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0VGV4dC5wbSx2IDEuMyAyMDA5LzA3LzIxIDAwOjQ0OjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGV4dCBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtWYWx1ZX0gfHw9ICcnOwoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgbXkgJFNpemUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA0MDsKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIiRTaXplXCIgIjsKCiAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZyAuPSAidmFsdWU9XCIkVmFsdWVcIiAiOwogICAgfQoKICAgICMgYWRkIG1heGltdW0gbGVuZ3RoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAibWF4bGVuZ3RoPVwiJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofVwiICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAiPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIjYwXCI+IjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dEFyZWE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRleHRhcmVhIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0QXJlYS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtWYWx1ZX0gfHw9ICcnOwoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbHMgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDb2xzfSB8fCA1ODsKICAgIG15ICRSb3dzID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Um93c30gfHwgMTA7CiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICB9CiAgICBteSAkU3RyaW5nID0gIjx0ZXh0YXJlYSBuYW1lPVwiJFBhcmFte0tleX1cIiBjb2xzPVwiJENvbHNcIiByb3dzPVwiJFJvd3NcIj4kVmFsdWU8L3RleHRhcmVhPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDo0NDo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ29uZmlnSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGFjY2VzcwogICAgbXkgJEFjY2VzcyA9IDE7CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkR3JvdXBzUm8KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cFJvfQogICAgICAgIHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3CiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXB9CiAgICAgICAgfHwgW107CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSAmJiAoIEB7JEdyb3Vwc1JvfSB8fCBAeyRHcm91cHNSd30gKSApIHsKCiAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICMgZmluZCByZWFkIG9ubHkgZ3JvdXBzCiAgICAgICAgUk9HUk9VUDoKICAgICAgICBmb3IgbXkgJFJvR3JvdXAgKCBAeyRHcm91cHNSb30gKSB7CgogICAgICAgICAgICBuZXh0IFJPR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9OwogICAgICAgICAgICBuZXh0IFJPR1JPVVAgaWYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIGxhc3QgUk9HUk9VUDsKICAgICAgICB9CgogICAgICAgICMgZmluZCByZWFkIHdyaXRlIGdyb3VwcwogICAgICAgIFJXR1JPVVA6CiAgICAgICAgZm9yIG15ICRSd0dyb3VwICggQHskR3JvdXBzUnd9ICkgewoKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJFJ3R3JvdXBdIn07CiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJFJ3R3JvdXBdIn0gbmUgJ1llcyc7CgogICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIGxhc3QgUldHUk9VUDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIG91dHB1dCBtZW51IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IHNlcGVyYXRvcgogICAgaWYgKCAkUGFyYW17Q291bnRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZW51IGl0ZW0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVWZXJzaW9ucy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnMucG0sdiAxLjMgMjAwOS8wNy8yMSAwMDo0NDo1NyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ29uZmlnSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQogICAgaWYgKCAkUGFyYW17U2hvd1ZlcnNpb25zfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0hpZGUgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0hpZGUgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtTaG93VmVyc2lvbnM9MCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU2hvdyBWZXJzaW9ucycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2hvdyBWZXJzaW9ucycsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZhbXA7Q29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0mYW1wO1Nob3dWZXJzaW9ucz0xJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgSFRNTCBvdXRwdXQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA1LzE4IDEwOjAwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm5zIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0IHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSVRTTUNvbmZpZ0l0ZW1Gb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaHRtbCBmb3JtIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIHt9IGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIGlucHV0IGZpZWxkIGh0bWwgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSVRTTUNvbmZpZ0l0ZW1TZWFyY2hGb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2VhcmNoIGh0bWwgZm9ybQoKICAgIG15ICRBcnJheVJlZiA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZXM7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIHNlYXJjaCBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbVNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1TZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gX0lUU01Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgaW5wdXQgdHlwZSBiYWNrZW5kIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICApOwoKPWN1dAoKc3ViIF9JVFNNTG9hZExheW91dEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SVRTTUxvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SVRTTUxvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfTsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntJVFNNTG9hZExheW91dEJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwo=
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=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICRUZXh0eyJDb25maWcgSXRlbXMgc2hvd24ifTogJFFEYXRheyJSZXN1bHQifSAtCiAgICAgICRUZXh0eyJQYWdlIn06ICRRRGF0YXsiUGFnZU51bGwifQo8IS0tIGR0bDpibG9jazpQYWdlIC0tPgo8IS0tIGR0bDpibG9jazpQYWdlTm9ybWFsIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+JFFEYXRheyJQYWdlIn08L2E+CjwhLS0gZHRsOmJsb2NrOlBhZ2VOb3JtYWwgLS0+CjwhLS0gZHRsOmJsb2NrOlBhZ2VCb2xkIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+PGI+JFFEYXRheyJQYWdlIn08L2I+PC9hPgo8IS0tIGR0bDpibG9jazpQYWdlQm9sZCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFnZSAtLT4KICAgICAgLQogICAgICAkVGV4dHsiQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSJ9OiAkUURhdGF7IkNvbmZpZ0l0ZW1zQXZhaWwifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAkVGV4dHsiQ2xhc3MifToKPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDbGFzc0lEPSRRRGF0YXsiQ2xhc3NJRCJ9Ij4kUURhdGF7IkNsYXNzIn0gKCRRRGF0YXsiQ291bnQifSk8L2E+Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzc1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9Ij4kUURhdGF7Ik51bWJlciJ9PC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7Ik5hbWUiLCI0MCJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJDdXJEZXBsU3RhdGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiB3aWR0aD0iMTUwIj4kVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNsYXNzUm93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNsYXNzIC0tPgo8L3RhYmxlPg==
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=
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
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2guZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJFRleHR7IkNvbmZpZyBJdGVtIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiIG5hbWU9ImNvbmZpZ2l0ZW1jbGFzcyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkF0dHJpYnV0ZSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNsYXNzIn06CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNlYXJjaCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiREYXRheyJDbGFzc0lEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJOdW1iZXIiIHNpemU9IjgwIiBtYXhsZW5ndGg9IjI1MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iTmFtZSIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjUwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluY2lkZW50IFN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDdXJJbmNpU3RhdGVPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlUm93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06PC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRyaWJ1dGVSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/In08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlIC0tPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hSZXN1bHQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0LmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCkiPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJUb3RhbCBoaXRzIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn0kUURhdGF7IkN1ckluY2lTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSI+JFFEYXRheyJOdW1iZXIifTwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICRRRGF0YXsiTmFtZSIsIjQwIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IkN1ckRlcGxTdGF0ZSJ9In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVUaW1lIn0ifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifSAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUFjdGl2ZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgdmFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiSW5jaVNpZ25hbCJ9LXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiSW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwO3wtLSZndDsmZ3Q7Jmd0OyZuYnNwOwogICAgICAgICAgICAgICAgICA8aT4KICAgICAgICAgICAgICAgICAgPGI+CiAgICAgICAgICAgICAgICAgIDx1PgogICAgICAgICAgICAgICAgICAkUURhdGF7IkNvdW50In0uCiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0mVmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn0mU2hvd1ZlcnNpb25zPSRRRGF0YXsiU2hvd1ZlcnNpb25zIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifSAoJFRleHR7IiRRRGF0YXsiRGVwbFN0YXRlIn0ifSkKICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjMwIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIzMCJ9KSAtICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVUaW1lIn0ifQogICAgICAgICAgICAgICAgICA8L3U+CiAgICAgICAgICAgICAgICAgIDwvYj4KICAgICAgICAgICAgICAgICAgPC9pPgogICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BY3RpdmUgLS0+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtSW5hY3RpdmUgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiIHZhbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn0kUURhdGF7IkluY2lTaWduYWwifS1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDt8LS0mZ3Q7Jm5ic3A7JFFEYXRheyJDb3VudCJ9LgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JlZlcnNpb25JRD0kUURhdGF7IlZlcnNpb25JRCJ9JlNob3dWZXJzaW9ucz0kUURhdGF7IlNob3dWZXJzaW9ucyJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0gKCRUZXh0eyIkUURhdGF7IkRlcGxTdGF0ZSJ9In0pCiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIzMCJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMzAifSkgLSAkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtSW5hY3RpdmUgLS0+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpUcmVlIC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgo8IS0tIGR0bDpibG9jazpEYXRhIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifSI+CjwhLS0gZHRsOmJsb2NrOkRhdGFOYW1lUHJlIC0tPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6RGF0YU5hbWVQcmUgLS0+CiAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9OiZuYnNwOyZuYnNwOwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkRhdGFWYWx1ZVByZSAtLT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOkRhdGFWYWx1ZVByZSAtLT4KICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RGF0YSAtLT4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgPGhyIHNpemU9IjIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSB3aWR0aD0iOTglIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjI1JSIgdmFsaWduPSJ0b3AiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJDbGFzcyJ9OiA8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kUURhdGF7IkNsYXNzIiwiMjUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiTmFtZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7Ik5hbWUifSI+JFFEYXRheyJOYW1lIiwiMjUifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiQ3VyRGVwbFN0YXRlIn0ifSIsIjI1In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJDdXJyZW50IEluY2lkZW50IFN0YXRlIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJJbmNpU3RhdGUifSJ9IiwiMjUifSZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDcmVhdGVVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0gLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjIyOjAwIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbSAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgSVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyB0byBpbXBvcnQgYW5kIGV4cG9ydCBJVFNNIGNvbmZpZyBpdGVtcwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEltcG9ydEV4cG9ydE9iamVjdCA9PiAkSW1wb3J0RXhwb3J0T2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgSW1wb3J0RXhwb3J0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJE9iamVjdEJhY2tlbmQtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICkgfHwge307CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdDbGFzcycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ291bnRNYXgnLAogICAgICAgICAgICBOYW1lICA9PiAnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICcxMCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlZ2V4ICAgICAgICA9PiBxcnsgXEEgXGQrIFx6IH14bXMsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIG1hcHBpbmcgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YTsKICAgIHJldHVybiBbXSBpZiByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YS0+e0NsYXNzSUR9OwoKICAgICMgZ2V0IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb247CiAgICByZXR1cm4gW10gaWYgcmVmICRYTUxEZWZpbml0aW9uIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSBuZSAnQVJSQVknOwoKICAgIG15ICRFbGVtZW50TGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAnTnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ05hbWUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnTmFtZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHhtbCBlbGVtZW50cwogICAgJFNlbGYtPl9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgRWxlbWVudExpc3QgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgQ291bnRNYXggICAgICA9PiAkT2JqZWN0RGF0YS0+e0NvdW50TWF4fSB8fCAxMCwKICAgICk7CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnS2V5JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0tleScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBfTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKcmVjdXNpb24gZnVuY3Rpb24gZm9yIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCiAgICAkT2JqZWN0QmFja2VuZC0+X01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIEVsZW1lbnRMaXN0ICAgPT4gJEFycmF5UmVmLAogICAgKTsKCj1jdXQKCnN1YiBfTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtDb3VudE1heH07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte0VsZW1lbnRMaXN0fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtFbGVtZW50TGlzdH0gbmUgJ0FSUkFZJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgIG15ICRDb3VudE1heCA9ICRJdGVtLT57Q291bnRNYXh9ID4gJFBhcmFte0NvdW50TWF4fSA/ICRQYXJhbXtDb3VudE1heH0gOiAkSXRlbS0+e0NvdW50TWF4fTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJENvdW50TWF4ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUga2V5IHN0cmluZwogICAgICAgICAgICBteSAkS2V5ID0gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudDsKCiAgICAgICAgICAgICMgYWRkIHByZWZpeCB0byBrZXkKICAgICAgICAgICAgaWYgKCAkUGFyYW17S2V5UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRLZXkgPSAkUGFyYW17S2V5UHJlZml4fSAuICc6OicgLiAkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSB2YWx1ZSBzdHJpbmcKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEl0ZW0tPntLZXl9OwoKICAgICAgICAgICAgIyBhZGQgY291bnQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkQ291bnRNYXggPiAxIHx8ICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSAuPSAnOjonIC4gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBwcmVmaXggdG8ga2V5CiAgICAgICAgICAgIGlmICggJFBhcmFte1ZhbHVlUHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZVByZWZpeH0gLiAnOjonIC4gJFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCByb3cKICAgICAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0VsZW1lbnRMaXN0fSB9LCBcJVJvdzsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgICAgICRTZWxmLT5fTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIEVsZW1lbnRMaXN0ICAgPT4gJFBhcmFte0VsZW1lbnRMaXN0fSwKICAgICAgICAgICAgICAgIEtleVByZWZpeCAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlUHJlZml4ICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQ291bnRNYXggICAgICA9PiAkQ291bnRNYXgsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgc2VhcmNoIG9iamVjdCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVMaXN0ID0gJE9iamVjdEJhY2tlbmQtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YTsKICAgIHJldHVybiBbXSBpZiByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkT2JqZWN0RGF0YS0+e0NsYXNzSUR9OwoKICAgICMgZ2V0IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb247CiAgICByZXR1cm4gW10gaWYgcmVmICRYTUxEZWZpbml0aW9uIG5lICdIQVNIJzsKICAgIHJldHVybiBbXSBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSBuZSAnQVJSQVknOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApIHx8IHt9OwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICkgfHwge307CgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gODAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjU1LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTmFtZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdOYW1lJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyNTUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnRGVwbG95bWVudCBTdGF0ZScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJbmNpU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lICA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHhtbCBhdHRyaWJ1dGVzCiAgICAkU2VsZi0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIEF0dHJpYnV0ZUxpc3QgPT4gJEF0dHJpYnV0ZUxpc3QsCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlTGlzdDsKfQoKPWl0ZW0gX1NlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKcmVjdXNpb24gZnVuY3Rpb24gZm9yIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCiAgICAkT2JqZWN0QmFja2VuZC0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9TZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17QXR0cmlidXRlTGlzdH07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17QXR0cmlidXRlTGlzdH0gbmUgJ0FSUkFZJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgc2V0IHByZWZpeAogICAgICAgIG15ICRLZXkgID0gJEl0ZW0tPntLZXl9OwogICAgICAgIG15ICROYW1lID0gJEl0ZW0tPntOYW1lfTsKCiAgICAgICAgaWYgKCAkUGFyYW17S2V5UHJlZml4fSApIHsKICAgICAgICAgICAgJEtleSA9ICRQYXJhbXtLZXlQcmVmaXh9IC4gJzo6JyAuICRLZXk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtOYW1lUHJlZml4fSApIHsKICAgICAgICAgICAgJE5hbWUgPSAkUGFyYW17TmFtZVByZWZpeH0gLiAnOjonIC4gJE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhdHRyaWJ1dGUsIGlmIG1hcmtlZCBhcyBzZWFyY2hhYmxlCiAgICAgICAgaWYgKCAkSXRlbS0+e1NlYXJjaGFibGV9ICkgewoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdUZXh0JyB8fCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdUZXh0QXJlYScgKSB7CgogICAgICAgICAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICROYW1lLAogICAgICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntTaXplfSB8fCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntNYXhMZW5ndGh9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dHJpYnV0ZUxpc3R9IH0sIFwlUm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntJbnB1dH0tPntUeXBlfSBlcSAnR2VuZXJhbENhdGFsb2cnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBsaXN0CiAgICAgICAgICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtLT57SW5wdXR9LT57Q2xhc3N9LAogICAgICAgICAgICAgICAgKSB8fCB7fTsKCiAgICAgICAgICAgICAgICBteSAlUm93ID0gKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJEl0ZW0tPntJbnB1dH0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0cmlidXRlTGlzdH0gfSwgXCVSb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgJFNlbGYtPl9TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkUGFyYW17QXR0cmlidXRlTGlzdH0sCiAgICAgICAgICAgIEtleVByZWZpeCAgICAgPT4gJEtleSwKICAgICAgICAgICAgTmFtZVByZWZpeCAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBFeHBvcnREYXRhR2V0KCkKCmdldCBleHBvcnQgZGF0YSBhcyAyRC1hcnJheS1oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBvYmplY3QgZGF0YQogICAgaWYgKCAhJE9iamVjdERhdGEgfHwgcmVmICRPYmplY3REYXRhIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG9iamVjdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdCB8fCByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgY2xhc3MgaWQKICAgIGlmICggISRPYmplY3REYXRhLT57Q2xhc3NJRH0gfHwgISRDbGFzc0xpc3QtPnsgJE9iamVjdERhdGEtPntDbGFzc0lEfSB9ICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNsYXNzIGlkIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgbWFwcGluZyBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGhlIG1hcHBpbmcgbGlzdAogICAgaWYgKCAhJE1hcHBpbmdMaXN0IHx8IHJlZiAkTWFwcGluZ0xpc3QgbmUgJ0FSUkFZJyB8fCAhQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIG1hcHBpbmcgb2JqZWN0IGxpc3QKICAgIG15IEBNYXBwaW5nT2JqZWN0TGlzdDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YTsKICAgIH0KCiAgICAjIGdldCBzZWFyY2ggZGF0YQogICAgbXkgJFNlYXJjaERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU2VhcmNoRGF0YSB8fCByZWYgJFNlYXJjaERhdGEgbmUgJ0hBU0gnOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdCB8fCByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZ2VuZXJhbCBjYXRhbG9nIGxpc3QgSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIGlmICggISRJbmNpU3RhdGVMaXN0IHx8IHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uIG9mIHRoaXMgY2xhc3MKICAgIG15ICREZWZpbml0aW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVTZWFyY2hQYXJhbXM7CgogICAgIyBhZGQgbnVtYmVyIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57TnVtYmVyfSApIHsKICAgICAgICAkU2VhcmNoUGFyYW1ze051bWJlcn0gPSAkU2VhcmNoRGF0YS0+e051bWJlcn07CiAgICAgICAgZGVsZXRlICRTZWFyY2hEYXRhLT57TnVtYmVyfTsKICAgIH0KCiAgICAjIGFkZCBuYW1lIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tOYW1lfSA9ICRTZWFyY2hEYXRhLT57TmFtZX07CiAgICAgICAgZGVsZXRlICRTZWFyY2hEYXRhLT57TmFtZX07CiAgICB9CgogICAgIyBhZGQgZGVwbG95bWVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgaWYgKCAkU2VhcmNoRGF0YS0+e0RlcGxTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQERlcGxTdGF0ZUlEcyA9IHNwbGl0ICcjIyMjIycsICRTZWFyY2hEYXRhLT57RGVwbFN0YXRlSURzfTsKICAgICAgICAkU2VhcmNoUGFyYW1ze0RlcGxTdGF0ZUlEc30gPSBcQERlcGxTdGF0ZUlEczsKICAgICAgICBkZWxldGUgJFNlYXJjaERhdGEtPntEZXBsU3RhdGVJRHN9OwogICAgfQoKICAgICMgYWRkIGluY2lkZW50IHN0YXRlIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57SW5jaVN0YXRlSURzfSApIHsKICAgICAgICBteSBASW5jaVN0YXRlSURzID0gc3BsaXQgJyMjIyMjJywgJFNlYXJjaERhdGEtPntJbmNpU3RhdGVJRHN9OwogICAgICAgICRTZWFyY2hQYXJhbXN7SW5jaVN0YXRlSURzfSA9IFxASW5jaVN0YXRlSURzOwogICAgICAgIGRlbGV0ZSAkU2VhcmNoRGF0YS0+e0luY2lTdGF0ZUlEc307CiAgICB9CgogICAgIyBhZGQgYWxsIFhNTCBkYXRhIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBteSBAU2VhcmNoUGFyYW1zV2hhdDsKICAgICRTZWxmLT5fRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBXaGF0ICAgICAgICAgID0+IFxAU2VhcmNoUGFyYW1zV2hhdCwKICAgICAgICBTZWFyY2hEYXRhICAgID0+ICRTZWFyY2hEYXRhLAogICAgKTsKCiAgICAjIGFkZCBYTUwgc2VhcmNoIHBhcmFtcyB0byB0aGUgc2VhcmNoIGhhc2gKICAgIGlmIChAU2VhcmNoUGFyYW1zV2hhdCkgewogICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gPSBcQFNlYXJjaFBhcmFtc1doYXQ7CiAgICB9CgogICAgIyBzZWFyY2ggdGhlIGNvbmZpZyBpdGVtcwogICAgbXkgJENvbmZpZ0l0ZW1MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICVTZWFyY2hQYXJhbXMsCiAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJE9iamVjdERhdGEtPntDbGFzc0lEfSBdLAogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQEV4cG9ydERhdGE7CiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JENvbmZpZ0l0ZW1MaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uRGF0YTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJzsKCiAgICAgICAgIyB0cmFuc2xhdGUgeG1sZGF0YSB0byBhIDJkIGhhc2gKICAgICAgICBteSAlWE1MRGF0YTJEOwogICAgICAgICRTZWxmLT5fRXhwb3J0WE1MRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJERlZmluaXRpb25EYXRhLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259LT5bMV0sCiAgICAgICAgICAgIFhNTERhdGEyRCAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZGF0YSB0byB0aGUgZXhwb3J0IGRhdGEgYXJyYXkKICAgICAgICBteSBASXRlbTsKICAgICAgICBNQVBQSU5HT0JKRUNUOgogICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdCAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgICAgICAjIGV4dHJhY3Qga2V5CiAgICAgICAgICAgIG15ICRLZXkgPSAkTWFwcGluZ09iamVjdC0+e0tleX07CgogICAgICAgICAgICAjIGhhbmRsZSBlbXB0eSBrZXkKICAgICAgICAgICAgaWYgKCAhJEtleSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICcnOwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdOdW1iZXInICkgewogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJFZlcnNpb25EYXRhLT57TnVtYmVyfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgY3VycmVudCBjb25maWcgaXRlbSBuYW1lCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkVmVyc2lvbkRhdGEtPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kZWwgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ0RlcGxTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbkRhdGEtPntEZXBsU3RhdGVJRH0gfHw9ICdEVU1NWSc7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkRGVwbFN0YXRlTGlzdC0+eyAkVmVyc2lvbkRhdGEtPntEZXBsU3RhdGVJRH0gfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kZWwgaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdJbmNpU3RhdGUnICkgewogICAgICAgICAgICAgICAgJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9IHx8PSAnRFVNTVknOwogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJEluY2lTdGF0ZUxpc3QtPnsgJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9IH07CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGFsbCBYTUwgZGF0YSBlbGVtZW50cwogICAgICAgICAgICBwdXNoIEBJdGVtLCAkWE1MRGF0YTJEeyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgcHVzaCBARXhwb3J0RGF0YSwgXEBJdGVtOwogICAgfQoKICAgIHJldHVybiBcQEV4cG9ydERhdGE7Cn0KCj1pdGVtIF9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgpCgpyZWN1c2lvbiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBleHBvcnQgWE1MIHNlYXJjaCBwYXJhbXMKCiAgICAkT2JqZWN0QmFja2VuZC0+X0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFdoYXQgICAgICAgICAgPT4gJEFycmF5UmVmLAogICAgICAgIFNlYXJjaERhdGEgICAgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte1doYXR9OwogICAgcmV0dXJuIGlmICEkUGFyYW17U2VhcmNoRGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17V2hhdH0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1NlYXJjaERhdGF9IG5lICdIQVNIJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgY3JlYXRlIGtleQogICAgICAgIG15ICRLZXkgPSAkUGFyYW17UHJlZml4fSA/ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJdGVtLT57S2V5fSA6ICRJdGVtLT57S2V5fTsKCiAgICAgICAgIyBwcmVwYXJlIHZhbHVlCiAgICAgICAgbXkgJFZhbHVlcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZWFyY2hEYXRhfS0+eyRLZXl9LAogICAgICAgICk7CgogICAgICAgIGlmICgkVmFsdWVzKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2gga2V5CiAgICAgICAgICAgIG15ICRTZWFyY2hLZXkgPSAkS2V5OwogICAgICAgICAgICAkU2VhcmNoS2V5ID1+IHN7IDo6IH17XCdcfVslXVx7XCd9eG1zZzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiAkVmFsdWVzLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17V2hhdH0gfSwgJFNlYXJjaEhhc2g7CiAgICAgICAgfQoKICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICRTZWxmLT5fRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+ICRQYXJhbXtXaGF0fSwKICAgICAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkUGFyYW17U2VhcmNoRGF0YX0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRXhwb3J0WE1MRGF0YVByZXBhcmUoKQoKcmVjdXNpb24gZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgZXhwb3J0IFhNTCBkYXRhCgogICAgJE9iamVjdEJhY2tlbmQtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBYTUxEYXRhICAgICAgID0+ICRIYXNoUmVmLAogICAgICAgIFhNTERhdGEyRCAgICAgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9FeHBvcnRYTUxEYXRhUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGF9OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YTJEfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhMkR9IG5lICdIQVNIJzsKCiAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICRQYXJhbXtQcmVmaXh9IC49ICc6Oic7CiAgICB9CiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc3RvcCBsb29wLCBpZiBubyBjb250ZW50IHdhcyBnaXZlbgogICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CgogICAgICAgICAgICAjIGNyZWF0ZSBrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudGVyOwoKICAgICAgICAgICAgIyBwcmVwYXJlIHZhbHVlCiAgICAgICAgICAgICRQYXJhbXtYTUxEYXRhMkR9LT57JEtleX0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxFeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gSW1wb3J0RGF0YVNhdmUoKQoKaW1wb3J0IG9uZSByb3cgb2YgdGhlIGltcG9ydCBkYXRhCgogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgSW1wb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaW1wb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17SW1wb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ltcG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2xhc3NMaXN0IHx8IHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJE9iamVjdERhdGEtPntDbGFzc0lEfSB8fCAhJENsYXNzTGlzdC0+eyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2xhc3MgaWQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgbXkgJUlkZW50aWZpZXI7CiAgICBteSAkQ291bnRlciA9IDA7CiAgICBNQVBQSU5HSUQ6CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgaWYgKCAhJE1hcHBpbmdPYmplY3REYXRhIHx8IHJlZiAkTWFwcGluZ09iamVjdERhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQE1hcHBpbmdPYmplY3RMaXN0LCAkTWFwcGluZ09iamVjdERhdGE7CgogICAgICAgIG5leHQgTUFQUElOR0lEIGlmICEkTWFwcGluZ09iamVjdERhdGEtPntJZGVudGlmaWVyfTsKCiAgICAgICAgIyBjaGVjayBpZiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gIgogICAgICAgICAgICAgICAgICAgIC4gIickTWFwcGluZ09iamVjdERhdGEtPntLZXl9JyBoYXMgYmVlbiB1c2VkIG11bHRpcGxlIHRpbWVzIGFzIGFuIGlkZW50aWZpZXIuISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGlkZW50aWZpZXIgdmFsdWUKICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdOwoKICAgICAgICBuZXh0IE1BUFBJTkdJRCBpZiAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9ICYmICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIElkZW50aWZpZXIgZmllbGQgaXMgZW1wdHkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdCB8fCByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZ2VuZXJhbCBjYXRhbG9nIGxpc3QgSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXZlcnNlIHRoZSBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICVEZXBsU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIGlmICggISRJbmNpU3RhdGVMaXN0IHx8IHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXZlcnNlIHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAlSW5jaVN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKICAgICMgZ2V0IGN1cnJlbnQgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzCiAgICBteSAkRGVmaW5pdGlvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24gZGF0YQogICAgaWYgKCAhJERlZmluaXRpb25EYXRhIHx8IHJlZiAkRGVmaW5pdGlvbkRhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZGVmaW5pdGlvbiBvZiBjbGFzcyBpZCAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWRzICh1c2luZyB0aGUgaWRlbnRpZmllcnMpCiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgaWYgKCVJZGVudGlmaWVyKSB7CgogICAgICAgIG15ICVTZWFyY2hQYXJhbXM7CgogICAgICAgICMgYWRkIG51bWJlciB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7TnVtYmVyfSApIHsKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tOdW1iZXJ9ID0gJElkZW50aWZpZXJ7TnVtYmVyfTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye051bWJlcn07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBuYW1lIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntOYW1lfSApIHsKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tOYW1lfSA9ICRJZGVudGlmaWVye05hbWV9OwogICAgICAgICAgICBkZWxldGUgJElkZW50aWZpZXJ7TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBkZXBsb3ltZW50IHN0YXRlIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntEZXBsU3RhdGV9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRlcGxveW1lbnQgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJERlcGxTdGF0ZUxpc3RSZXZlcnNleyAkSWRlbnRpZmllcntEZXBsU3RhdGV9IH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgZGVwbG95bWVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickSWRlbnRpZmllcntEZXBsU3RhdGV9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0RlcGxTdGF0ZUlEc30gPSBbJERlcGxTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0RlcGxTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbmNpZGVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7SW5jaVN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBpbmNpZGVudCBzdGF0ZSBpZAogICAgICAgICAgICBteSAkSW5jaVN0YXRlSUQgPSAkSW5jaVN0YXRlTGlzdFJldmVyc2V7ICRJZGVudGlmaWVye0luY2lTdGF0ZX0gfSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggISRJbmNpU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIFRoZSBpbmNpZGVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickSWRlbnRpZmllcntJbmNpU3RhdGV9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0luY2lTdGF0ZUlEc30gPSBbJEluY2lTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0luY2lTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgWE1MIGRhdGEgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBteSBAU2VhcmNoUGFyYW1zV2hhdDsKICAgICAgICAkU2VsZi0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+IFxAU2VhcmNoUGFyYW1zV2hhdCwKICAgICAgICAgICAgSWRlbnRpZmllciAgICA9PiBcJUlkZW50aWZpZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgWE1MIHNlYXJjaCBwYXJhbXMgdG8gdGhlIHNlYXJjaCBoYXNoCiAgICAgICAgaWYgKEBTZWFyY2hQYXJhbXNXaGF0KSB7CiAgICAgICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gPSBcQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNlYXJjaCBleGlzdGluZyBjb25maWcgaXRlbSB3aXRoIHNhbWUgaWRlbnRpZmlrYXRvcgogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgJVNlYXJjaFBhcmFtcywKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJE9iamVjdERhdGEtPntDbGFzc0lEfSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMCwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIHNjYWxhciBAeyRDb25maWdJdGVtTGlzdH0gPiAxICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gSWRlbnRpZmllciBmaWVsZHMgTk9UIHVuaXF1ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1MaXN0LT5bMF07CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbiBkYXRhIG9mIHRoZSBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb25EYXRhID0ge307CiAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewoKICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgICAgICAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBlbXB0eSB4bWwgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgISRWZXJzaW9uRGF0YS0+e1hNTERhdGF9CiAgICAgICAgICAgIHx8IHJlZiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSBuZSAnQVJSQVknCiAgICAgICAgICAgIHx8ICFAeyAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZSAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVhNTERhdGEyRDsKICAgICRDb3VudGVyID0gMDsKICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEEgaWYgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnTnVtYmVyJzsKCiAgICAgICAgIyBoYW5kbGUgbmFtZQogICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e05hbWV9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdOwogICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZGVwbG95bWVudCBzdGF0ZQogICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnRGVwbFN0YXRlJyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICAgICAgICAgIG15ICREZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXsgJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdIH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgZGVwbG95bWVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickUGFyYW17SW1wb3J0RGF0YVJvd30tPlskQ291bnRlcl0nIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSA9ICREZXBsU3RhdGVJRDsKICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUREFUQTsKICAgICAgICB9CgogICAgICAgICMgaGFuZGxlIGluY2lkZW50IHN0YXRlCiAgICAgICAgaWYgKCAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IGVxICdJbmNpU3RhdGUnICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGluY2lkZW50IHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRJbmNpU3RhdGVJRCA9ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXsgJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdIH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkSW5jaVN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgaW5jaWRlbnQgc3RhdGUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICInJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdJyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVmVyc2lvbkRhdGEtPntJbmNpU3RhdGVJRH0gPSAkSW5jaVN0YXRlSUQ7CiAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEE7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSB4bWwgZGF0YQogICAgICAgICRYTUxEYXRhMkR7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSA9ICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgdHJhbnNsYXRlIHhtbGRhdGEgZnJvbSAyZCBoYXNoIHRvIHRoZSBtdWx0aWRpbSBzdHJ1Y3R1cmUKICAgIG15ICRYTUxEYXRhID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIFhNTERhdGEyRCAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICApOwoKICAgICMgYWRkIFhNTCBkYXRhIHRvIHRoZSB2ZXJzaW9uIGRhdGEKICAgIGlmICggJFhNTERhdGEgJiYgcmVmICRYTUxEYXRhIGVxICdIQVNIJyAmJiAleyRYTUxEYXRhfSApIHsKICAgICAgICAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSA9ICRYTUxEYXRhOwogICAgfQoKICAgICMgYWRkIHRoZSBuZXcgY29uZmlnIGl0ZW0KICAgIG15ICROZXdDb25maWdJdGVtOwogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKCiAgICAgICAgIyBhZGQgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGNvbmZpZyBpdGVtIGlkCiAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIEVycm9yIHdoZW4gYWRkaW5nIHRoZSBuZXcgY29uZmlnIGl0ZW0uIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJE5ld0NvbmZpZ0l0ZW0gPSAxOwogICAgfQoKICAgICMgYWRkIG5ldyB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFZlcnNpb25EYXRhLT57TmFtZX0sCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9LAogICAgICAgIFhNTERhdGEgICAgICA9PiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ29uZmlnSXRlbUlEIGlmICRWZXJzaW9uSUQ7CgogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBFcnJvciB3aGVuIGFkZGluZyB0aGUgbmV3IGNvbmZpZyBpdGVtIHZlcnNpb24uIiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTmV3Q29uZmlnSXRlbTsKCiAgICAjIGRlbGV0ZSB0aGUgbmV3IGNvbmZpZyBpdGVtCiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBfSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoKQoKcmVjdXNpb24gZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgaW1wb3J0IFhNTCBzZWFyY2ggcGFyYW1zCgogICAgJE9iamVjdEJhY2tlbmQtPl9JbXBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBXaGF0ICAgICAgICAgID0+ICRBcnJheVJlZiwKICAgICAgICBJZGVudGlmaWVyICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtXaGF0fTsKICAgIHJldHVybiBpZiAhJFBhcmFte0lkZW50aWZpZXJ9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1doYXR9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtJZGVudGlmaWVyfSBuZSAnSEFTSCc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIGNyZWF0ZSBrZXkKICAgICAgICBteSAkS2V5ID0gJFBhcmFte1ByZWZpeH0gPyAkUGFyYW17UHJlZml4fSAuICc6OlxkKzo6JyAuICRJdGVtLT57S2V5fSA6ICRJdGVtLT57S2V5fTsKICAgICAgICAkS2V5IC49ICc6OlxkKyc7CgogICAgICAgIG15ICRJZGVudGlmaWVyS2V5OwogICAgICAgIElERU5USUZJRVJLRVk6CiAgICAgICAgZm9yIG15ICRJZGVudEtleSAoIGtleXMgJXsgJFBhcmFte0lkZW50aWZpZXJ9IH0gKSB7CgogICAgICAgICAgICBuZXh0IElERU5USUZJRVJLRVkgaWYgJElkZW50S2V5ICF+IG17IFxBICRLZXkgXHogfXhtczsKCiAgICAgICAgICAgICRJZGVudGlmaWVyS2V5ID0gJElkZW50S2V5OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRJZGVudGlmaWVyS2V5KSB7CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17SWRlbnRpZmllcn0tPnskSWRlbnRpZmllcktleX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICAgICAgICAgIyBwcmVwYXJlIGtleQogICAgICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCAkSWRlbnRpZmllcktleSA9fiBteyA6OiB9eG1zICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyICUgMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElkZW50aWZpZXJLZXkgPX4gc3sgOjogfXtdXHsnfXhtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJZGVudGlmaWVyS2V5ID1+IHN7IDo6IH17J1x9W314bXM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkSWRlbnRpZmllcktleSAuICdde1wnQ29udGVudFwnfScgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtXaGF0fSB9LCAkU2VhcmNoSGFzaDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgV2hhdCAgICAgICAgICA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgICAgIElkZW50aWZpZXIgICAgPT4gJFBhcmFte0lkZW50aWZpZXJ9LAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ltcG9ydFhNTERhdGFQcmVwYXJlKCkKCnJlY3VzaW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGltcG9ydCBYTUwgZGF0YQoKICAgIG15ICRYTUxEYXRhID0gJE9iamVjdEJhY2tlbmQtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfSW1wb3J0WE1MRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhMkR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGEyRH0gbmUgJ0hBU0gnOwoKICAgIG15ICRYTUxEYXRhID0gKCk7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MSW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YTJEfS0+eyRLZXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgIG15ICRTdWJYTUxEYXRhID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFhNTERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0gPSAkU3ViWE1MRGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRYTUxEYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gPSAkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRYTUxEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMDcvMjAgMjM6MjI6MDAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhbGwgY29uZmlnIGl0ZW0gZnVuY3Rpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtLnBtLHYgMS45IDIwMDkvMDcvMjAgMjM6MjE6MzggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCkBJU0EgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtIC0gY29uZmlnIGl0ZW0gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjb25maWcgaXRlbSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1hNTE9iamVjdH0gICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1Db3VudCgpCgpjb3VudCBhbGwgcmVjb3JkcyBvZiBhIGNvbmZpZyBpdGVtIGNsYXNzCgogICAgbXkgJENvdW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Db3VudCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUNvdW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc0lEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDbGFzc0lEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBGdW5jdGlvbmFsaXR5ID0+IFsgJ3ByZXByb2R1Y3RpdmUnLCAncHJvZHVjdGl2ZScgXSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgISV7JFN0YXRlTGlzdH07CgogICAgIyBxdW90ZQogICAgJFBhcmFte0NsYXNzSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q2xhc3NJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgY3JlYXRlIHN0YXRlIHN0cmluZwogICAgbXkgJERlcGxTdGF0ZVN0cmluZyA9IGpvaW4gcXssIH0sIGtleXMgJXskU3RhdGVMaXN0fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgQ09VTlQoaWQpIEZST00gY29uZmlnaXRlbSBXSEVSRSBjbGFzc19pZCA9ICRQYXJhbXtDbGFzc0lEfSBBTkQgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ291bnQgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQ291bnQ7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1SZXN1bHRMaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVJlc3VsdExpc3QoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgU3RhcnQgICA9PiAxMDAsCiAgICAgICAgTGltaXQgICA9PiA1MCwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc3VsdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENsYXNzSUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17Q2xhc3NJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDbGFzc0lEfSwgJ0ludGVnZXInICk7CiAgICBpZiAoICRQYXJhbXtTdGFydH0gKSB7CiAgICAgICAgJFBhcmFte1N0YXJ0fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1N0YXJ0fSwgJ0ludGVnZXInICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtMaW1pdH0gKSB7CiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0xpbWl0fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBGdW5jdGlvbmFsaXR5ID0+IFsgJ3ByZXByb2R1Y3RpdmUnLCAncHJvZHVjdGl2ZScgXSwKICAgICk7CgogICAgIyBjcmVhdGUgc3RhdGUgc3RyaW5nCiAgICBteSAkRGVwbFN0YXRlU3RyaW5nID0gam9pbiBxeywgfSwga2V5cyAleyRTdGF0ZUxpc3R9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gIgogICAgICAgICAgICAuICJXSEVSRSBjbGFzc19pZCA9ICRQYXJhbXtDbGFzc0lEfSBBTkQgY3VyX2RlcGxfc3RhdGVfaWQgSU4gKCAkRGVwbFN0YXRlU3RyaW5nICkgIgogICAgICAgICAgICAuICJPUkRFUiBCWSBjaGFuZ2VfdGltZSBERVNDIiwKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1JRExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRExpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9ucyBkYXRhCiAgICBteSBAQ29uZmlnSXRlbUxpc3Q7CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRExpc3QpIHsKCiAgICAgICAgIyBnZXQgdmVyc2lvbiBkYXRhCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJExhc3RWZXJzaW9uOwogICAgfQoKICAgIHJldHVybiBcQENvbmZpZ0l0ZW1MaXN0Owp9Cgo9aXRlbSBDb25maWdJdGVtR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGFzIGhhc2ggcmVmZXJlbmNlCgpSZXR1cm4KICAgICRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0KICAgICRDb25maWdJdGVte051bWJlcn0KICAgICRDb25maWdJdGVte0NsYXNzSUR9CiAgICAkQ29uZmlnSXRlbXtDbGFzc30KICAgICRDb25maWdJdGVte0xhc3RWZXJzaW9uSUR9CiAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZX0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZVR5cGV9CiAgICAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZX0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZVR5cGV9CiAgICAkQ29uZmlnSXRlbXtDcmVhdGVUaW1lfQogICAgJENvbmZpZ0l0ZW17Q3JlYXRlQnl9CiAgICAkQ29uZmlnSXRlbXtDaGFuZ2VUaW1lfQogICAgJENvbmZpZ0l0ZW17Q2hhbmdlQnl9CgogICAgbXkgJENvbmZpZ0l0ZW1SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIENhY2hlICAgICAgICA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0NhY2hlfSApIHsKICAgICAgICAkUGFyYW17Q2FjaGV9ID0gMTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbUdldH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfQogICAgICAgIGlmICRQYXJhbXtDYWNoZX0gJiYgJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtR2V0fS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9OwoKICAgICMgcXVvdGUKICAgICRQYXJhbXtDb25maWdJdGVtSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q29uZmlnSXRlbUlEfSwgJ0ludGVnZXInICk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBjb25maWdpdGVtX251bWJlciwgY2xhc3NfaWQsIGxhc3RfdmVyc2lvbl9pZCwgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCwgY3VyX2luY2lfc3RhdGVfaWQsICIKICAgICAgICAgICAgLiAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAiCiAgICAgICAgICAgIC4gIkZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ICRQYXJhbXtDb25maWdJdGVtSUR9IiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVDb25maWdJdGVtOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbXtDb25maWdJdGVtSUR9ICAgPSAkUm93WzBdOwogICAgICAgICRDb25maWdJdGVte051bWJlcn0gICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJENvbmZpZ0l0ZW17Q2xhc3NJRH0gICAgICAgID0gJFJvd1syXTsKICAgICAgICAkQ29uZmlnSXRlbXtMYXN0VmVyc2lvbklEfSAgPSAkUm93WzNdOwogICAgICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfSA9ICRSb3dbNF07CiAgICAgICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9ID0gJFJvd1s1XTsKICAgICAgICAkQ29uZmlnSXRlbXtDcmVhdGVUaW1lfSAgICAgPSAkUm93WzZdOwogICAgICAgICRDb25maWdJdGVte0NyZWF0ZUJ5fSAgICAgICA9ICRSb3dbN107CiAgICAgICAgJENvbmZpZ0l0ZW17Q2hhbmdlVGltZX0gICAgID0gJFJvd1s4XTsKICAgICAgICAkQ29uZmlnSXRlbXtDaGFuZ2VCeX0gICAgICAgPSAkUm93WzldOwogICAgfQoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0KICAgIGlmICggISRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIENvbmZpZ0l0ZW1JRCAoJFBhcmFte0NvbmZpZ0l0ZW1JRH0pISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAkQ29uZmlnSXRlbXtDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVte0NsYXNzSUR9IH07CgogICAgcmV0dXJuIFwlQ29uZmlnSXRlbSBpZiAhJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlSUR9IHx8ICEkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH07CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkRGVwbFN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkSW5jaVN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfSwKICAgICk7CgogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGNhY2hlIHVzZXIgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1HZXR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0gPSBcJUNvbmZpZ0l0ZW07CgogICAgcmV0dXJuIFwlQ29uZmlnSXRlbTsKfQoKPWl0ZW0gQ29uZmlnSXRlbUFkZCgpCgphZGQgYSBuZXcgY29uZmlnIGl0ZW0KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgTnVtYmVyICA9PiAnMTExJywgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdDsKICAgIHJldHVybiBpZiByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgY2xhc3MgaWQKICAgIGlmICggISRDbGFzc0xpc3QtPnsgJFBhcmFte0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2xhc3MgaWQgZ2l2ZW4hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIGNvbmZpZyBpdGVtIG51bWJlcgogICAgaWYgKCAkUGFyYW17TnVtYmVyfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtOdW1iZXJ9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TnVtYmVyfSApOwoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgbXkgJEV4aXN0cyA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRQYXJhbXtOdW1iZXJ9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb25maWcgaXRlbSBudW1iZXIgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNyZWF0ZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6TnVtYmVyR2VuZXJhdG9yJyksCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IGNvbmZpZyBpdGVtCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGNvbmZpZ2l0ZW0gIgogICAgICAgICAgICAuICIoY29uZmlnaXRlbV9udW1iZXIsIGNsYXNzX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAiCiAgICAgICAgICAgIC4gIlZBTFVFUyAoJyRQYXJhbXtOdW1iZXJ9JywgJFBhcmFte0NsYXNzSUR9LCBjdXJyZW50X3RpbWVzdGFtcCwgIgogICAgICAgICAgICAuICIkUGFyYW17VXNlcklEfSwgY3VycmVudF90aW1lc3RhbXAsICRQYXJhbXtVc2VySUR9KSIKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSAiCiAgICAgICAgICAgIC4gImNvbmZpZ2l0ZW1fbnVtYmVyID0gJyRQYXJhbXtOdW1iZXJ9JyBBTkQgY2xhc3NfaWQgPSAkUGFyYW17Q2xhc3NJRH0gIgogICAgICAgICAgICAuICIgT1JERVIgQlkgaWQgREVTQyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbURlbGV0ZSgpCgpkZWxldGUgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyB2ZXJzaW9ucwogICAgJFNlbGYtPlZlcnNpb25EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ICRQYXJhbXtDb25maWdJdGVtSUR9IiwKICAgICk7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBsaXN0IGFzIGFuIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICBOdW1iZXIgICAgICAgPT4gJ1RoZSBDb25maWdJdGVtIE51bWJlcicsICAjIChvcHRpb25hbCkKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWzksIDgsIDcsIDZdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAjIChvcHRpb25hbCkKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgIyAob3B0aW9uYWwpCgogICAgICAgIFdoYXQgPT4gWwogICAgICAgICAgICAjIGVhY2ggYXJyYXkgZWxlbWVudCBpcyBhIGFuZCBjb25kaXRpb24KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBvciBjb25kaXRpb24gaW4gaGFzaAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEInfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEElJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEInfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEIlJywKICAgICAgICAgICAgfQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIHVzZSBhcnJheSByZWZlcmVuY2UgaWYgZGlmZmVyZW50IGNvbnRlbnQgd2l0aCBzYW1lIGtleSB3YXMgc2VhcmNoZWQKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gWyclY29udGVudEMlJywgJyVjb250ZW50RCUnLCAnJWNvbnRlbnRFJSddLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiBbJyVjb250ZW50QyUnLCAnJWNvbnRlbnREJScsICclY29udGVudEUlJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCgogICAgICAgIE9yZGVyQnkgPT4gJ051bWJlcicsICAjIChvcHRpb25hbCkgZGVmYXVsdCBDb25maWdJdGVtSUQKICAgICAgICAjIChDb25maWdJdGVtSUQsIE51bWJlciwgQ2xhc3NJRCwgRGVwbFN0YXRlSUQsIEluY2lTdGF0ZUlELAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAjIChvcHRpb25hbCkKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGxpbWl0CiAgICBteSAkTGltaXQgPSAkUGFyYW17TGltaXR9OwogICAgJFBhcmFte0xpbWl0fSA9IHVuZGVmOwoKICAgICMgY29uZmlnIGl0ZW0gc2VhcmNoIGlzIHJlcXVpcmVkIGlmIG9uZSBvZiB0aGlzIHBhcmFtcyBhcmUgZ2l2ZW4KICAgIG15IEBDb25maWdJdGVtU2VhcmNoUGFyYW1zID0gKAogICAgICAgICdOdW1iZXInLAogICAgICAgICdDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAnQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUnLAogICAgICAgICdDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZScKICAgICk7CgogICAgIyBjaGVjaywgaWYgY29uZmlnIGl0ZW0gc2VhcmNoIGlzIHJlcXVpcmVkCiAgICBteSAlUmVxdWlyZWRTZWFyY2g7CiAgICBDT05GSUdJVEVNUEFSQU06CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1QYXJhbSAoQENvbmZpZ0l0ZW1TZWFyY2hQYXJhbXMpIHsKICAgICAgICBuZXh0IENPTkZJR0lURU1QQVJBTSBpZiAhJFBhcmFteyRDb25maWdJdGVtUGFyYW19OwoKICAgICAgICAkUmVxdWlyZWRTZWFyY2h7Q29uZmlnSXRlbX0gPSAxOwogICAgICAgIGxhc3QgQ09ORklHSVRFTVBBUkFNOwogICAgfQoKICAgICMgdmVyc2lvbiBzZWFyY2ggaXMgcmVxdWlyZWQgaWYgTmFtZSwgV2hhdCBvciBQcmV2aW91c1ZlcnNpb25TZWFyY2ggaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte05hbWV9IHx8ICRQYXJhbXtXaGF0fSB8fCAkUGFyYW17UHJldmlvdXNWZXJzaW9uU2VhcmNofSApIHsKICAgICAgICAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gPSAxOwogICAgfQoKICAgICMgeG1sIHZlcnNpb24gc2VhcmNoIGlzIHJlcXVpcmVkIGlmIFdoYXQgaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte1doYXR9ICkgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtYTUxWZXJzaW9ufSA9IDE7CiAgICB9CgogICAgIyB1c2UgY29uZmlnIGl0ZW0gc2VhcmNoIGFzIGZhbGxiYWNrCiAgICBpZiAoICElUmVxdWlyZWRTZWFyY2ggKSB7CiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ID0gMTsKICAgIH0KCiAgICAjIHN0YXJ0IGNvbmZpZyBpdGVtIHNlYXJjaAogICAgbXkgJUNvbmZpZ0l0ZW1MaXN0czsKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ICkgewoKICAgICAgICAjIHNlYXJjaCBjb25maWcgaXRlbXMKICAgICAgICAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19ID0gJFNlbGYtPkNvbmZpZ0l0ZW1TZWFyY2goJVBhcmFtKTsKCiAgICAgICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19OwogICAgICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSBuZSAnQVJSQVknOwogICAgICAgIHJldHVybiBbXSBpZiAhQHsgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSB9OwogICAgfQoKICAgICMgc3RhcnQgdmVyc2lvbiBzZWFyY2gKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe1ZlcnNpb259ICkgewoKICAgICAgICAjIHNlYXJjaCB2ZXJzaW9ucwogICAgICAgICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gPSAkU2VsZi0+VmVyc2lvblNlYXJjaCglUGFyYW0pOwoKICAgICAgICByZXR1cm4gaWYgISRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn07CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IG5lICdBUlJBWSc7CiAgICAgICAgcmV0dXJuIFtdIGlmICFAeyAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IH07CiAgICB9CgogICAgIyBzdGFydCB4bWwgdmVyc2lvbiBzZWFyY2gKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe1hNTFZlcnNpb259ICkgewoKICAgICAgICAjIHNlYXJjaCB4bWwgdmVyc2lvbnMKICAgICAgICBteSAkWE1MVmVyc2lvbkxpc3QgPSAkU2VsZi0+X1hNTFZlcnNpb25TZWFyY2goJVBhcmFtKTsKCiAgICAgICAgcmV0dXJuIGlmICEkWE1MVmVyc2lvbkxpc3Q7CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkWE1MVmVyc2lvbkxpc3QgbmUgJ0hBU0gnOwogICAgICAgIHJldHVybiBbXSBpZiAhJXskWE1MVmVyc2lvbkxpc3R9OwoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSBpZHMKICAgICAgICBteSAlQ29uZmlnSXRlbUxpc3RUbXA7CiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKCBrZXlzICV7JFhNTFZlcnNpb25MaXN0fSApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT5WZXJzaW9uQ29uZmlnSXRlbUlER2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDb25maWdJdGVtTGlzdFRtcHskQ29uZmlnSXRlbUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpZHMgdG8gY29uZmlnIGl0ZW0gbGlzdAogICAgICAgICRDb25maWdJdGVtTGlzdHN7WE1MVmVyc2lvbn0gPSBcJUNvbmZpZ0l0ZW1MaXN0VG1wOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSByZXN1bHQgbGlzdAogICAgbXkgQFJlc3VsdExpc3Q7CiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSAmJiAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gKSB7CgogICAgICAgIG15ICVWZXJzaW9uVGVtcExpc3Q7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IH0gKSB7CiAgICAgICAgICAgICRWZXJzaW9uVGVtcExpc3R7JENvbmZpZ0l0ZW1JRH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHsgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uVGVtcExpc3R7JENvbmZpZ0l0ZW1JRH07CgogICAgICAgICAgICBwdXNoIEBSZXN1bHRMaXN0LCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ICkgewogICAgICAgIEBSZXN1bHRMaXN0ID0gQHsgJENvbmZpZ0l0ZW1MaXN0c3tDb25maWdJdGVtfSB9OwogICAgfQogICAgZWxzaWYgKCAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gKSB7CiAgICAgICAgQFJlc3VsdExpc3QgPSBAeyAkQ29uZmlnSXRlbUxpc3Rze1ZlcnNpb259IH07CiAgICB9CgogICAgIyBjb25zaWRlciB0aGUgWE1MIHJlc3VsdAogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7WE1MVmVyc2lvbn0gKSB7CiAgICAgICAgQFJlc3VsdExpc3QgPSBncmVwIHsgJENvbmZpZ0l0ZW1MaXN0c3tYTUxWZXJzaW9ufS0+eyRffSB9IEBSZXN1bHRMaXN0OwogICAgfQoKICAgICMgY29uc2lkZXIgbGltaXQKICAgIGlmICggJExpbWl0ICYmICRMaW1pdCA8IHNjYWxhciBAUmVzdWx0TGlzdCApIHsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBsaW1pdGVkIGlkcwogICAgICAgICRMaW1pdC0tOwogICAgICAgIEBSZXN1bHRMaXN0ID0gQFJlc3VsdExpc3RbIDAgLi4gJExpbWl0IF07CiAgICB9CgogICAgcmV0dXJuIFxAUmVzdWx0TGlzdDsKfQoKPWl0ZW0gQ29uZmlnSXRlbVNlYXJjaCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSBsaXN0IGFzIGFuIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgTnVtYmVyICAgICAgID0+ICdUaGUgQ29uZmlnSXRlbSBOdW1iZXInLCAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgID0+IFs5LCA4LCA3LCA2XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVwbFN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ3JlYXRlQnkgICAgID0+IFsxLCAyLCAzXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlQnkgICAgID0+IFszLCAyLCAxXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICMgKG9wdGlvbmFsKQogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICBPcmRlckJ5ID0+ICdOdW1iZXInLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgQ29uZmlnSXRlbUlECiAgICAgICAgIyAoQ29uZmlnSXRlbUlELCBOdW1iZXIsIENsYXNzSUQsIERlcGxTdGF0ZUlELCBJbmNpU3RhdGVJRCwKICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgTGltaXQgICAgICAgICAgPT4gMTIyLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKICAgICAgICAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ID0gMTsKICAgIH0KICAgICRQYXJhbXtPcmRlckJ5fSB8fD0gJ2lkJzsKCiAgICAjIGFkZCBudW1iZXIgdG8gc3FsIHdoZXJlIGFycmF5CiAgICBteSBAU1FMV2hlcmU7CiAgICBpZiAoICRQYXJhbXtOdW1iZXJ9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtOdW1iZXJ9ICk7CgogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBsaWtlIHN0cmluZwogICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJFBhcmFte051bWJlcn0gKTsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiTE9XRVIoY29uZmlnaXRlbV9udW1iZXIpIExJS0UgTE9XRVIoJyRQYXJhbXtOdW1iZXJ9JykiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJMT1dFUihjb25maWdpdGVtX251bWJlcikgPSBMT1dFUignJFBhcmFte051bWJlcn0nKSI7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGFycmF5IHBhcmFtcwogICAgbXkgJUFycmF5UGFyYW1zID0gKAogICAgICAgIENsYXNzSURzICAgICA9PiAnY2xhc3NfaWQnLAogICAgICAgIERlcGxTdGF0ZUlEcyA9PiAnY3VyX2RlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEcyA9PiAnY3VyX2luY2lfc3RhdGVfaWQnLAogICAgICAgIENyZWF0ZUJ5ICAgICA9PiAnY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VCeSAgICAgPT4gJ2NoYW5nZV9ieScsCiAgICApOwoKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkUGFyYW17JEFycmF5UGFyYW19OwoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFycmF5UGFyYW19IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJyYXlQYXJhbSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiBxeywgfSwgQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgISRJblN0cmluZzsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkQXJyYXlQYXJhbXN7ICRBcnJheVBhcmFtIH0gSU4gKCRJblN0cmluZykiOwogICAgfQoKICAgICMgc2V0IHRpbWUgcGFyYW1zCiAgICBteSAlVGltZVBhcmFtcyA9ICgKICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnY3JlYXRlX3RpbWUgPj0nLAogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICdjcmVhdGVfdGltZSA8PScsCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVOZXdlckRhdGUgPT4gJ2NoYW5nZV90aW1lID49JywKICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnY2hhbmdlX3RpbWUgPD0nLAogICAgKTsKCiAgICBUSU1FUEFSQU06CiAgICBmb3IgbXkgJFRpbWVQYXJhbSAoIGtleXMgJVRpbWVQYXJhbXMgKSB7CgogICAgICAgIG5leHQgVElNRVBBUkFNIGlmICEkUGFyYW17JFRpbWVQYXJhbX07CgogICAgICAgIGlmICggJFBhcmFteyRUaW1lUGFyYW19ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBkYXRlIGZvcm1hdCBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFteyRUaW1lUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFRpbWVQYXJhbX0gKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3sgJFRpbWVQYXJhbSB9ICckUGFyYW17ICRUaW1lUGFyYW0gfSciOwogICAgfQoKICAgICMgY3JlYXRlIHdoZXJlIHN0cmluZwogICAgbXkgJFdoZXJlU3RyaW5nID0gQFNRTFdoZXJlID8gJyBXSEVSRSAnIC4gam9pbiBxeyBBTkQgfSwgQFNRTFdoZXJlIDogJyc7CgogICAgIyBkZWZpbmUgb3JkZXIgdGFibGUKICAgIG15ICVPcmRlckJ5VGFibGUgPSAoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICdpZCcsCiAgICAgICAgTnVtYmVyICAgICAgID0+ICdjb25maWdpdGVtX251bWJlcicsCiAgICAgICAgQ2xhc3NJRCAgICAgID0+ICdjbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICdjdXJfZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICdjdXJfaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgQ3JlYXRlVGltZSAgID0+ICdjcmVhdGVfdGltZScsCiAgICAgICAgQ3JlYXRlQnkgICAgID0+ICdjcmVhdGVfYnknLAogICAgICAgIENoYW5nZVRpbWUgICA9PiAnY2hhbmdlX3RpbWUnLAogICAgICAgIENoYW5nZUJ5ICAgICA9PiAnY2hhbmdlX2J5JywKICAgICk7CgogICAgIyBzZXQgb3JkZXIgYnkKICAgIG15ICRPcmRlckJ5ID0gJE9yZGVyQnlUYWJsZXsgJFBhcmFte09yZGVyQnl9IH0gfHwgJE9yZGVyQnlUYWJsZXtDb25maWdJdGVtSUR9OwoKICAgICMgc2V0IGxpbWl0CiAgICBpZiAoICRQYXJhbXtMaW1pdH0gKSB7CiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0xpbWl0fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtICRXaGVyZVN0cmluZyBPUkRFUiBCWSAkT3JkZXJCeSBBU0MiLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBDb25maWdJdGVtTGlzdDsKfQoKPWl0ZW0gQ3VySW5jaVN0YXRlUmVjYWxjKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1ckluY2lTdGF0ZVJlY2FsYyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDb25maWdJdGVtSUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTGlua1R5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZScpOwogICAgbXkgJVNjYW5uZWRDb25maWdJdGVtSURzOwoKICAgICMgZmluZCBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYW4gaW5jaWRlbnQgc3RhdGUKICAgICRTZWxmLT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gXCVTY2FubmVkQ29uZmlnSXRlbUlEcywKICAgICk7CgogICAgIyBpbnZlc3RpZ2F0ZSBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYW4gd2FybmluZyBzdGF0ZQogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVTY2FubmVkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9LT57VHlwZX0gbmUgJ2luY2lkZW50JzsKCiAgICAgICAgJFNlbGYtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgaW5jaWRlbnQgc3RhdGUgbGlzdCBvZiB3YXJuaW5ncwogICAgbXkgJFdhcm5TdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnd2FybmluZycsCiAgICApOwoKICAgIG15ICVSZXZlcnNlV2FyblN0YXRlTGlzdCA9IHJldmVyc2UgJXskV2FyblN0YXRlTGlzdH07CiAgICBteSBAU29ydGVkV2Fybkxpc3QgICAgICAgPSBzb3J0IGtleXMgJVJldmVyc2VXYXJuU3RhdGVMaXN0OwogICAgbXkgJFdhcm5pbmdTdGF0ZUlECiAgICAgICAgPSAkUmV2ZXJzZVdhcm5TdGF0ZUxpc3R7V2FybmluZ30gfHwgJFJldmVyc2VXYXJuU3RhdGVMaXN0eyAkU29ydGVkV2Fybkxpc3RbMF0gfTsKCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIGtleXMgJVNjYW5uZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIGV4dHJhY3QgaW5jaWRlbnQgc3RhdGUgdHlwZQogICAgICAgIG15ICRJbmNpU3RhdGVUeXBlID0gJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9e1R5cGV9OwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkSW5jaVN0YXRlVHlwZSBlcSAnaW5jaWRlbnQnOwoKICAgICAgICBteSAkQ3VySW5jaVN0YXRlSUQgPSAkV2FybmluZ1N0YXRlSUQ7CiAgICAgICAgaWYgKCAkSW5jaVN0YXRlVHlwZSBlcSAnb3BlcmF0aW9uYWwnICkgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDdXJJbmNpU3RhdGVJRCA9ICRMYXN0VmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGN1cl9pbmNpX3N0YXRlX2lkID0gJEN1ckluY2lTdGF0ZUlEICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIGlkID0gJENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e1R5cGV9ID0gJ29wZXJhdGlvbmFsJzsKCiAgICAjIGZpbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMgKGNoaWxkcykKICAgIG15ICVMaW5rZWRDb25maWdJdGVtSURzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0tleUxpc3QoCiAgICAgICAgT2JqZWN0MSAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgS2V5MSAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIE9iamVjdDIgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFN0YXRlICAgICA9PiAnVmFsaWQnLAogICAgICAgIFR5cGUgICAgICA9PiAkUGFyYW17TGlua1R5cGV9LAogICAgICAgIERpcmVjdGlvbiA9PiAnQm90aCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICgga2V5cyAlTGlua2VkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBpbmNpZGVudCBzdGF0ZQogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfSA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAkU2VsZi0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GaW5kV2FybkNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufTsKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufSA9IDE7CgogICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zIChwYXJlbnRzKQogICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdCgKICAgICAgICBPYmplY3QxICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkxICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgT2JqZWN0MiAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgRGlyZWN0aW9uID0+ICdCb3RoJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICRTZWxmLT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSwKICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRAogICAgICAgICAgICBpZiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgIyBzZXQgd2FybmluZyBzdGF0ZQogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnskQ29uZmlnSXRlbUlEfS0+e1R5cGV9ID0gJ3dhcm5pbmcnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfUHJlcGFyZUxpa2VTdHJpbmcoKQoKaW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJlcGFyZSBsaWtlIHN0cmluZ3MKCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X1ByZXBhcmVMaWtlU3RyaW5nKCAkU3RyaW5nUmVmICk7Cgo9Y3V0CgpzdWIgX1ByZXBhcmVMaWtlU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICRWYWx1ZSApID0gQF87CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CiAgICByZXR1cm4gaWYgcmVmICRWYWx1ZSBuZSAnU0NBTEFSJzsKCiAgICAjIFF1b3RlCiAgICAkeyRWYWx1ZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICR7JFZhbHVlfSwgJ0xpa2UnICk7CgogICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAkeyRWYWx1ZX0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS45ICQgJERhdGU6IDIwMDkvMDcvMjAgMjM6MjE6MzggJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRGVmaW5pdGlvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBkZWZpbml0aW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGVmaW5pdGlvbi5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjU5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGRlZmluaXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIERlZmluaXRpb25MaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGRlZmluaXRpb24gbGlzdCBhcyBhcnJheWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJERlZmluaXRpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25MaXN0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ2xhc3NJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtDbGFzc0lEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0NsYXNzSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAiCiAgICAgICAgICAgIC4gIkZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uIFdIRVJFIGNsYXNzX2lkID0gJFBhcmFte0NsYXNzSUR9IE9SREVSIEJZIHZlcnNpb24iLAogICAgKTsKCiAgICBteSBARGVmaW5pdGlvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVEZWZpbml0aW9uOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb259ICAgPSAkUm93WzFdOwogICAgICAgICREZWZpbml0aW9ue1ZlcnNpb259ICAgICAgPSAkUm93WzJdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZVRpbWV9ICAgPSAkUm93WzNdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZUJ5fSAgICAgPSAkUm93WzRdOwoKICAgICAgICBwdXNoIEBEZWZpbml0aW9uTGlzdCwgXCVEZWZpbml0aW9uOwogICAgfQoKICAgIHJldHVybiBcQERlZmluaXRpb25MaXN0Owp9Cgo9aXRlbSBEZWZpbml0aW9uR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGRlZmluaXRpb24gYXMgaGFzaCByZWZlcmVuY2UKClJldHVybgogICAgJERlZmluaXRpb257RGVmaW5pdGlvbklEfQogICAgJERlZmluaXRpb257Q2xhc3NJRH0KICAgICREZWZpbml0aW9ue0NsYXNzfQogICAgJERlZmluaXRpb257RGVmaW5pdGlvbn0KICAgICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9CiAgICAkRGVmaW5pdGlvbntWZXJzaW9ufQogICAgJERlZmluaXRpb257Q3JlYXRlVGltZX0KICAgICREZWZpbml0aW9ue0NyZWF0ZUJ5fQoKICAgIG15ICREZWZpbml0aW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgRGVmaW5pdGlvbklEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkRGVmaW5pdGlvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtEZWZpbml0aW9uSUR9ICYmICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgRGVmaW5pdGlvbklEIG9yIENsYXNzSUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZWZpbml0aW9uSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0RlZmluaXRpb25HZXR9LT57ICRQYXJhbXtEZWZpbml0aW9uSUR9IH0KICAgICAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntEZWZpbml0aW9uR2V0fS0+eyAkUGFyYW17RGVmaW5pdGlvbklEfSB9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte0RlZmluaXRpb25JRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtEZWZpbml0aW9uSUR9LCAnSW50ZWdlcicgKTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGNsYXNzX2lkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgIgogICAgICAgICAgICAgICAgLiAiRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24gV0hFUkUgaWQgPSAkUGFyYW17RGVmaW5pdGlvbklEfSIsCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte0NsYXNzSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q2xhc3NJRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAjIGFzayBkYXRhYmFzZQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgY2xhc3NfaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAiCiAgICAgICAgICAgICAgICAuICJGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBjbGFzc19pZCA9ICRQYXJhbXtDbGFzc0lEfSBPUkRFUiBCWSB2ZXJzaW9uIERFU0MiLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGVmaW5pdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJERlZmluaXRpb257Q2xhc3NJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvbn0gICA9ICRSb3dbMl07CiAgICAgICAgJERlZmluaXRpb257VmVyc2lvbn0gICAgICA9ICRSb3dbM107CiAgICAgICAgJERlZmluaXRpb257Q3JlYXRlVGltZX0gICA9ICRSb3dbNF07CiAgICAgICAgJERlZmluaXRpb257Q3JlYXRlQnl9ICAgICA9ICRSb3dbNV07CgogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9ID0gZXZhbCAkRGVmaW5pdGlvbntEZWZpbml0aW9ufTsKICAgIH0KCiAgICByZXR1cm4ge30gaWYgISREZWZpbml0aW9ue0RlZmluaXRpb25JRH07CgogICAgIyBwcmVwYXJlIGRlZmluaXRpb24KICAgIGlmICggJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gJiYgcmVmICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9IGVxICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICAgICAgRGVmaW5pdGlvblJlZiA9PiAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0gPSAnJzsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgYWRkIGNsYXNzCiAgICAkRGVmaW5pdGlvbntDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICREZWZpbml0aW9ue0NsYXNzSUR9IH07CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0RlZmluaXRpb25HZXR9LT57ICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gfSA9IFwlRGVmaW5pdGlvbjsKCiAgICByZXR1cm4gXCVEZWZpbml0aW9uOwp9Cgo9aXRlbSBEZWZpbml0aW9uQWRkKCkKCmFkZCBhIG5ldyBkZWZpbml0aW9uCgogICAgbXkgJERlZmluaXRpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQWRkKAogICAgICAgIENsYXNzSUQgICAgPT4gMTIzLAogICAgICAgIERlZmluaXRpb24gPT4gJ3RoZSBkZWZpbml0aW9uIGNvZGUnLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVmaW5pdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIERlZmluaXRpb24gVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZGVmaW5pdGlvbgogICAgbXkgJENoZWNrID0gJFNlbGYtPkRlZmluaXRpb25DaGVjaygKICAgICAgICBEZWZpbml0aW9uID0+ICRQYXJhbXtEZWZpbml0aW9ufSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hlY2s7CgogICAgIyBnZXQgbGFzdCBkZWZpbml0aW9uCiAgICBteSAkTGFzdERlZmluaXRpb24gPSAkU2VsZi0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICk7CgogICAgIyBzdG9wIGFkZCwgaWYgZGVmaW5pdGlvbiB3YXMgbm90IGNoYW5nZWQKICAgIGlmICggJExhc3REZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSAmJiAkTGFzdERlZmluaXRpb24tPntEZWZpbml0aW9ufSBlcSAkUGFyYW17RGVmaW5pdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgbmV3IGRlZmluaXRpb24hIFRoZSBkZWZpbml0aW9uIHdhcyBub3QgY2hhbmdlZC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IHZlcnNpb24KICAgIG15ICRWZXJzaW9uID0gMTsKICAgIGlmICggJExhc3REZWZpbml0aW9uLT57VmVyc2lvbn0gKSB7CiAgICAgICAgJFZlcnNpb24gPSAkTGFzdERlZmluaXRpb24tPntWZXJzaW9ufTsKICAgICAgICAkVmVyc2lvbisrOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgVXNlcklEKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IGRlZmluaXRpb24KICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gY29uZmlnaXRlbV9kZWZpbml0aW9uICIKICAgICAgICAgICAgLiAiKGNsYXNzX2lkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkpIFZBTFVFUyAiCiAgICAgICAgICAgIC4gIigkUGFyYW17Q2xhc3NJRH0sID8sICRWZXJzaW9uLCBjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0pIiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtEZWZpbml0aW9ufSBdLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICMgZ2V0IGlkIG9mIG5ldyBkZWZpbml0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiBXSEVSRSAiCiAgICAgICAgICAgIC4gImNsYXNzX2lkID0gJFBhcmFte0NsYXNzSUR9IEFORCB2ZXJzaW9uID0gJFZlcnNpb24gIgogICAgICAgICAgICAuICJPUkRFUiBCWSB2ZXJzaW9uIERFU0MiLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJERlZmluaXRpb25JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERlZmluaXRpb25JRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICREZWZpbml0aW9uSUQ7Cn0KCj1pdGVtIERlZmluaXRpb25DaGVjaygpCgpjaGVjayB0aGUgc3ludGF4IG9mIGEgbmV3IGRlZmluaXRpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uQ2hlY2soCiAgICAgICAgRGVmaW5pdGlvbiA9PiAndGhlIGRlZmluaXRpb24gY29kZScsCiAgICApOwoKPWN1dAoKc3ViIERlZmluaXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RGVmaW5pdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgRGVmaW5pdGlvbiEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICREZWZpbml0aW9uID0gZXZhbCAkUGFyYW17RGVmaW5pdGlvbn07CgogICAgaWYgKCAhJERlZmluaXRpb24gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIERlZmluaXRpb24hIFlvdSBoYXZlIGFuIHN5bnRheCBlcnJvciBpbiB0aGUgZGVmaW5pdGlvbi4nCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJERlZmluaXRpb24gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgRGVmaW5pdGlvbiBpcyBub3QgYW4gYXJyYXkgcmVmZXJlbmNlLicKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlY3VzaW9uIGNoZWNrCgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9EZWZpbml0aW9uUHJlcGFyZSgpCgpQcmVwYXJlIHRoZSBzeW50YXggb2YgYSBuZXcgZGVmaW5pdGlvbgoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICBEZWZpbml0aW9uUmVmID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0RlZmluaXRpb25QcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBkZWZpbml0aW9uCiAgICBpZiAoICEkUGFyYW17RGVmaW5pdGlvblJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgRGVmaW5pdGlvblJlZiEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtEZWZpbml0aW9uUmVmfSB9ICkgewoKICAgICAgICAjIHNldCBDb3VudE1pbgogICAgICAgIGlmICggIWRlZmluZWQgJEl0ZW0tPntDb3VudE1pbn0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnRNaW59ID0gMTsKICAgICAgICB9CgogICAgICAgICMgc2V0IENvdW50TWF4CiAgICAgICAgJEl0ZW0tPntDb3VudE1heH0gfHw9IDE7CgogICAgICAgICMgc2V0IENvdW50TWluCiAgICAgICAgaWYgKCAkSXRlbS0+e0NvdW50TWlufSA+ICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50TWlufSA9ICRJdGVtLT57Q291bnRNYXh9OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQ291bnREZWZhdWx0CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkSXRlbS0+e0NvdW50RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnREZWZhdWx0fSA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICggJEl0ZW0tPntDb3VudERlZmF1bHR9IDwgJEl0ZW0tPntDb3VudE1pbn0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnREZWZhdWx0fSA9ICRJdGVtLT57Q291bnRNaW59OwogICAgICAgIH0KICAgICAgICBpZiAoICRJdGVtLT57Q291bnREZWZhdWx0fSA+ICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPSAkSXRlbS0+e0NvdW50TWF4fTsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiBpcyBkZWZpbmVkLgogICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICYmIHJlZiAkSXRlbS0+e1N1Yn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJFNlbGYtPl9EZWZpbml0aW9uUHJlcGFyZSgKICAgICAgICAgICAgICAgIERlZmluaXRpb25SZWYgPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGVsZXRlICRJdGVtLT57U3VifTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA1LzE4IDA5OjU5OjA0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIG51bWJlciBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE51bWJlci5wbSx2IDEuMiAyMDA5LzA1LzE4IDA5OjU5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckxvb2t1cCgpCgpyZXR1cm4gY29uZmlnIGl0ZW0gaWQgb3IgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICcxMjM0NTQzMjEnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCBvciBDb25maWdJdGVtTnVtYmVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e0lEfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntJRH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtDb25maWdJdGVtSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q29uZmlnSXRlbUlEfSwgJ0ludGVnZXInICk7CgogICAgICAgICMgYXNrIGRhdGFiYXNlCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgY29uZmlnaXRlbV9udW1iZXIgRlJPTSBjb25maWdpdGVtIFdIRVJFIGlkID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH0iLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRDb25maWdJdGVtTnVtYmVyOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgICAgICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntJRH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfQogICAgICAgICAgICA9ICRDb25maWdJdGVtTnVtYmVyOwoKICAgICAgICByZXR1cm4gJENvbmZpZ0l0ZW1OdW1iZXI7CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntOdW1iZXJ9LT57ICRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSB9OwoKICAgICMgcXVvdGUKICAgICRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0NvbmZpZ0l0ZW1OdW1iZXJ9ICk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNvbmZpZ2l0ZW1fbnVtYmVyID0gJyRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSciLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfQogICAgICAgID0gJENvbmZpZ0l0ZW1JRDsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckNyZWF0ZSgpCgpjcmVhdGUgYSBuZXcgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJE51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFR5cGUgQ2xhc3NJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJFBhcmFte1R5cGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGNvbmZpZyBpdGVtIG51bWJlciBnZW5lcmF0b3IgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISAkQCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIHB1c2ggQElTQSwgJFBhcmFte1R5cGV9OwoKICAgICMgY3JlYXRlIG51bWJlcgogICAgbXkgJE51bWJlciA9ICRTZWxmLT5fQ29uZmlnSXRlbU51bWJlckNyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkTnVtYmVyOwp9Cgo9aXRlbSBDdXJyZW50Q291bnRlckdldCgpCgpyZXR1cm4gdGhlIGN1cnJlbnQgY291bnRlciBvZiBhIGNsYXNzCgogICAgbXkgJENvdW50ZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VycmVudENvdW50ZXJHZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICApOwoKPWN1dAoKc3ViIEN1cnJlbnRDb3VudGVyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICAkUGFyYW17VHlwZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtUeXBlfSApOwogICAgJFBhcmFte0NsYXNzSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q2xhc3NJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgY291bnRlciBGUk9NIGNvbmZpZ2l0ZW1fY291bnRlciBXSEVSRSAiCiAgICAgICAgICAgIC4gImNsYXNzX2lkID0gJFBhcmFte0NsYXNzSUR9IEFORCBjb3VudGVyX3R5cGUgPSAnJFBhcmFte1R5cGV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTnVtYmVyOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTnVtYmVyID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE51bWJlcjsKfQoKPWl0ZW0gQ3VycmVudENvdW50ZXJTZXQoKQoKc2V0IHRoZSBjdXJyZW50IGNvdW50ZXIgb2YgYSBjbGFzcwoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1cnJlbnRDb3VudGVyU2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgIENvdW50ZXIgPT4gJzEyJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VycmVudENvdW50ZXJTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBUeXBlIENvdW50ZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZSBDb3VudGVyKSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSApOwogICAgfQogICAgJFBhcmFte0NsYXNzSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q2xhc3NJRH0sICdJbnRlZ2VyJyApOwoKICAgICMgZGVsZXRlIG9sZCBjb3VudGVyCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBjb25maWdpdGVtX2NvdW50ZXIgV0hFUkUgY2xhc3NfaWQgPSAkUGFyYW17Q2xhc3NJRH0iLAogICAgKTsKCiAgICAjIHNldCBuZXcgY291bnRlcgogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gY29uZmlnaXRlbV9jb3VudGVyIChjbGFzc19pZCwgY291bnRlcl90eXBlLCBjb3VudGVyKSAiCiAgICAgICAgICAgIC4gIlZBTFVFUyAoJFBhcmFte0NsYXNzSUR9LCAnJFBhcmFte1R5cGV9JywgJyRQYXJhbXtDb3VudGVyfScpIgogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NTk6MDQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vVmVyc2lvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCB2ZXJzaW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVmVyc2lvbi5wbSx2IDEuMiAyMDA5LzA1LzE4IDA5OjU5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHZlcnNpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFZlcnNpb25ab29tTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSB2ZXJzaW9uIGxpc3QgYXMgYXJyYXloYXNoIHJlZmVyZW5jZQoKICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uWm9vbUxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvblpvb21MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBxdW90ZQogICAgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDb25maWdJdGVtSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGdldCB2ZXJzaW9uIHpvb20gbGlzdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUsIGRlcGxfc3RhdGVfaWQsIGluY2lfc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgIgogICAgICAgICAgICAuICJGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAiCiAgICAgICAgICAgIC4gIldIRVJFIGNvbmZpZ2l0ZW1faWQgPSAkUGFyYW17Q29uZmlnSXRlbUlEfSBPUkRFUiBCWSBpZCIKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVmVyc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVWZXJzaW9uOwogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gICA9ICRSb3dbMF07CiAgICAgICAgJFZlcnNpb257TmFtZX0gICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0gPSAkUm93WzJdOwogICAgICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfSA9ICRSb3dbM107CiAgICAgICAgJFZlcnNpb257Q3JlYXRlVGltZX0gID0gJFJvd1s0XTsKICAgICAgICAkVmVyc2lvbntDcmVhdGVCeX0gICAgPSAkUm93WzVdOwoKICAgICAgICBwdXNoIEBWZXJzaW9uTGlzdCwgXCVWZXJzaW9uOwogICAgfQoKICAgIGZvciBteSAkVmVyc2lvbiAoQFZlcnNpb25MaXN0KSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICREZXBsU3RhdGUgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgICAgIG15ICRJbmNpU3RhdGUgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9uLT57SW5jaVN0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAgICAgJFZlcnNpb24tPntJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAgICAgIyBhZGQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICRWZXJzaW9uLT57Q2xhc3NJRH0gICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9OwogICAgICAgICRWZXJzaW9uLT57Q2xhc3N9ICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzfTsKICAgICAgICAkVmVyc2lvbi0+e051bWJlcn0gICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VyRGVwbFN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZVR5cGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZUlEfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckluY2lTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9OwogICAgICAgICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9OwogICAgfQoKICAgIHJldHVybiBcQFZlcnNpb25MaXN0Owp9Cgo9aXRlbSBWZXJzaW9uTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSB2ZXJzaW9uIGxpc3QgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJFZlcnNpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtDb25maWdJdGVtSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q29uZmlnSXRlbUlEfSwgJ0ludGVnZXInICk7CgogICAgIyBnZXQgdmVyc2lvbiBsaXN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAiCiAgICAgICAgICAgIC4gIldIRVJFIGNvbmZpZ2l0ZW1faWQgPSAkUGFyYW17Q29uZmlnSXRlbUlEfSBPUkRFUiBCWSBpZCIsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFZlcnNpb25MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBWZXJzaW9uTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBWZXJzaW9uTGlzdDsKfQoKPWl0ZW0gVmVyc2lvbkdldCgpCgpyZXR1cm4gYSB2ZXJzaW9uIG9mIGEgY29uZmlnIGl0ZW0gYXMgaGFzaCByZWZlcmVuY2UKClJldHVybgogICAgJFZlcnNpb257VmVyc2lvbklEfQogICAgJFZlcnNpb257Q29uZmlnSXRlbUlEfQogICAgJFZlcnNpb257TnVtYmVyfQogICAgJFZlcnNpb257Q2xhc3NJRH0KICAgICRWZXJzaW9ue0NsYXNzfQogICAgJFZlcnNpb257TGFzdFZlcnNpb25JRH0KICAgICRWZXJzaW9ue05hbWV9CiAgICAkVmVyc2lvbntEZWZpbml0aW9uSUR9CiAgICAkVmVyc2lvbntEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0luY2lTdGF0ZX0KICAgICRWZXJzaW9ue0luY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVJRH0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZX0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZVR5cGV9CiAgICAkVmVyc2lvbntYTUxEZWZpbml0aW9ufQogICAgJFZlcnNpb257WE1MRGF0YX0KICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9CiAgICAkVmVyc2lvbntDcmVhdGVCeX0KCiAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCAgPT4gMTIzLAogICAgICAgIFhNTERhdGFHZXQgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgKTsKCiAgICBvcgoKICAgIG15ICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VmVyc2lvbklEfSAmJiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFZlcnNpb25JRCBvciBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhR2V0fSApIHsKICAgICAgICAkUGFyYW17WE1MRGF0YUdldH0gPSAxOwogICAgfQoKICAgIGlmICggJFBhcmFte1ZlcnNpb25JRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfQogICAgICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25HZXR9LT57ICRQYXJhbXtWZXJzaW9uSUR9IH07CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17VmVyc2lvbklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1ZlcnNpb25JRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBjb25maWdpdGVtX2lkLCBuYW1lLCBkZWZpbml0aW9uX2lkLCAiCiAgICAgICAgICAgICAgICAuICJkZXBsX3N0YXRlX2lkLCBpbmNpX3N0YXRlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICIKICAgICAgICAgICAgICAgIC4gIkZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkID0gJFBhcmFte1ZlcnNpb25JRH0iLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtDb25maWdJdGVtSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17Q29uZmlnSXRlbUlEfSwgJ0ludGVnZXInICk7CgogICAgICAgICMgZ2V0IHZlcnNpb24KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGNvbmZpZ2l0ZW1faWQsIG5hbWUsIGRlZmluaXRpb25faWQsICIKICAgICAgICAgICAgICAgIC4gImRlcGxfc3RhdGVfaWQsIGluY2lfc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgIgogICAgICAgICAgICAgICAgLiAiRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgY29uZmlnaXRlbV9pZCA9ICRQYXJhbXtDb25maWdJdGVtSUR9IE9SREVSIEJZIGlkIERFU0MiLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVmVyc2lvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZlcnNpb257VmVyc2lvbklEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJFZlcnNpb257Q29uZmlnSXRlbUlEfSA9ICRSb3dbMV07CiAgICAgICAgJFZlcnNpb257TmFtZX0gICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJFZlcnNpb257RGVmaW5pdGlvbklEfSA9ICRSb3dbM107CiAgICAgICAgJFZlcnNpb257RGVwbFN0YXRlSUR9ICA9ICRSb3dbNF07CiAgICAgICAgJFZlcnNpb257SW5jaVN0YXRlSUR9ICA9ICRSb3dbNV07CiAgICAgICAgJFZlcnNpb257Q3JlYXRlVGltZX0gICA9ICRSb3dbNl07CiAgICAgICAgJFZlcnNpb257Q3JlYXRlQnl9ICAgICA9ICRSb3dbN107CiAgICB9CgogICAgIyBjaGVjayB2ZXJzaW9uCiAgICBpZiAoICEkVmVyc2lvbntWZXJzaW9uSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gc3VjaCBjb25maWcgaXRlbSB2ZXJzaW9uIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkRGVwbFN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9ue0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgJFZlcnNpb257RGVwbFN0YXRlfSAgICAgPSAkRGVwbFN0YXRlLT57TmFtZX07CiAgICAkVmVyc2lvbntEZXBsU3RhdGVUeXBlfSA9ICREZXBsU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkSW5jaVN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRWZXJzaW9ue0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgJFZlcnNpb257SW5jaVN0YXRlfSAgICAgPSAkSW5jaVN0YXRlLT57TmFtZX07CiAgICAkVmVyc2lvbntJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAjIGdldCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFZlcnNpb257Q29uZmlnSXRlbUlEfSwKICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBjaGVjayBjb25maWcgaXRlbSBkYXRhCiAgICBpZiAoICEkQ29uZmlnSXRlbSB8fCByZWYgJENvbmZpZ0l0ZW0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IGNvbmZpZyBpdGVtICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkVmVyc2lvbntDbGFzc0lEfSAgICAgICAgICA9ICRDb25maWdJdGVtLT57Q2xhc3NJRH07CiAgICAkVmVyc2lvbntDbGFzc30gICAgICAgICAgICA9ICRDb25maWdJdGVtLT57Q2xhc3N9OwogICAgJFZlcnNpb257TGFzdFZlcnNpb25JRH0gICAgPSAkQ29uZmlnSXRlbS0+e0xhc3RWZXJzaW9uSUR9OwogICAgJFZlcnNpb257TnVtYmVyfSAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e051bWJlcn07CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVJRH0gICA9ICRDb25maWdJdGVtLT57Q3VyRGVwbFN0YXRlSUR9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlfSAgICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX07CiAgICAkVmVyc2lvbntDdXJEZXBsU3RhdGVUeXBlfSA9ICRDb25maWdJdGVtLT57Q3VyRGVwbFN0YXRlVHlwZX07CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVJRH0gICA9ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlSUR9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlfSAgICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZX07CiAgICAkVmVyc2lvbntDdXJJbmNpU3RhdGVUeXBlfSA9ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX07CgogICAgcmV0dXJuIFwlVmVyc2lvbiBpZiAhJFBhcmFte1hNTERhdGFHZXR9OwoKICAgICMgZ2V0IHhtbCBkZWZpbml0aW9uCiAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT5EZWZpbml0aW9uR2V0KAogICAgICAgIERlZmluaXRpb25JRCA9PiAkVmVyc2lvbntEZWZpbml0aW9uSUR9LAogICAgKTsKICAgICRWZXJzaW9ue1hNTERlZmluaXRpb259ID0gJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfTsKCiAgICAjIGdldCB4bWwgZGF0YQogICAgJFZlcnNpb257WE1MRGF0YX0gPSAkU2VsZi0+X1hNTFZlcnNpb25HZXQoCiAgICAgICAgQ2xhc3NJRCAgID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9ue1ZlcnNpb25JRH0sCiAgICApOwoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uR2V0fS0+eyAkVmVyc2lvbntWZXJzaW9uSUR9IH0gPSBcJVZlcnNpb247CgogICAgcmV0dXJuIFwlVmVyc2lvbjsKfQoKPWl0ZW0gVmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgpCgpyZXR1cm4gdGhlIGNvbmZpZyBpdGVtIGlkIG9mIGEgdmVyc2lvbgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uQ29uZmlnSXRlbUlER2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFZlcnNpb25JRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uQ29uZmlnSXRlbUlER2V0fS0+eyAkUGFyYW17VmVyc2lvbklEfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uQ29uZmlnSXRlbUlER2V0fS0+eyAkUGFyYW17VmVyc2lvbklEfSB9OwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIGlkCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGNvbmZpZ2l0ZW1faWQgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgaWQgPSAkUGFyYW17VmVyc2lvbklEfSIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfSA9ICRDb25maWdJdGVtSUQ7CgogICAgcmV0dXJuICRDb25maWdJdGVtSUQ7Cn0KCj1pdGVtIFZlcnNpb25BZGQoKQoKYWRkIGEgbmV3IHZlcnNpb24KCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gMTIxMiwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gOCwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gNCwKICAgICAgICBYTUxEYXRhICAgICAgPT4gJEFycmF5SGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDb25maWdJdGVtSUQgTmFtZSBEZWZpbml0aW9uSUQgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkRGVwbFN0YXRlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGRlcGxveW1lbnQgc3RhdGUgaWQKICAgIGlmICggISREZXBsU3RhdGVMaXN0LT57ICRQYXJhbXtEZXBsU3RhdGVJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBkZXBsb3ltZW50IHN0YXRlIGlkIGdpdmVuISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbmNpU3RhdGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgaW5jaWRlbnQgc3RhdGUgaWQKICAgIGlmICggISRJbmNpU3RhdGVMaXN0LT57ICRQYXJhbXtJbmNpU3RhdGVJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBpbmNpZGVudCBzdGF0ZSBpZCBnaXZlbiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtOYW1lfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte05hbWV9ICk7CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ29uZmlnSXRlbUlEIERlZmluaXRpb25JRCBEZXBsU3RhdGVJRCBJbmNpU3RhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBdHRyaWJ1dGV9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEF0dHJpYnV0ZX0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbTsKICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW0gbmUgJ0hBU0gnOwoKICAgICMgaW5zZXJ0IG5ldyB2ZXJzaW9uCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGNvbmZpZ2l0ZW1fdmVyc2lvbiAiCiAgICAgICAgICAgIC4gIihjb25maWdpdGVtX2lkLCBuYW1lLCBkZWZpbml0aW9uX2lkLCAiCiAgICAgICAgICAgIC4gImRlcGxfc3RhdGVfaWQsIGluY2lfc3RhdGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkpIFZBTFVFUyAiCiAgICAgICAgICAgIC4gIigkUGFyYW17Q29uZmlnSXRlbUlEfSwgJyRQYXJhbXtOYW1lfScsICRQYXJhbXtEZWZpbml0aW9uSUR9LCAiCiAgICAgICAgICAgIC4gIiRQYXJhbXtEZXBsU3RhdGVJRH0sICRQYXJhbXtJbmNpU3RhdGVJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSkiCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBnZXQgaWQgb2YgbmV3IHZlcnNpb24KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBjcmVhdGVfdGltZSBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSAiCiAgICAgICAgICAgIC4gImNvbmZpZ2l0ZW1faWQgPSAkUGFyYW17Q29uZmlnSXRlbUlEfSBPUkRFUiBCWSBpZCBERVNDIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRWZXJzaW9uSUQ7CiAgICBteSAkQ3JlYXRlVGltZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZlcnNpb25JRCAgPSAkUm93WzBdOwogICAgICAgICRDcmVhdGVUaW1lID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIHZlcnNpb24gaWQKICAgIGlmICggISRWZXJzaW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBnZXQgdGhlIG5ldyB2ZXJzaW9uIGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgeG1sIGRhdGEKICAgIGlmICggJFBhcmFte1hNTERhdGF9ICYmIHJlZiAkUGFyYW17WE1MRGF0YX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+X1hNTFZlcnNpb25BZGQoCiAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFZlcnNpb25JRCAgICA9PiAkVmVyc2lvbklELAogICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgIyB1cGRhdGUgbGFzdF92ZXJzaW9uX2lkLCBjdXJfZGVwbF9zdGF0ZV9pZCwgY3VyX2luY2lfc3RhdGVfaWQsIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBjb25maWdpdGVtIFNFVCBsYXN0X3ZlcnNpb25faWQgPSAkVmVyc2lvbklELCIKICAgICAgICAgICAgLiAiY3VyX2RlcGxfc3RhdGVfaWQgPSAkUGFyYW17RGVwbFN0YXRlSUR9LCAiCiAgICAgICAgICAgIC4gImN1cl9pbmNpX3N0YXRlX2lkID0gJFBhcmFte0luY2lTdGF0ZUlEfSwgIgogICAgICAgICAgICAuICJjaGFuZ2VfdGltZSA9ICckQ3JlYXRlVGltZScsIGNoYW5nZV9ieSA9ICRQYXJhbXtVc2VySUR9ICIKICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAkUGFyYW17Q29uZmlnSXRlbUlEfSIKICAgICk7CgogICAgIyByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBhbGxlIGxpbmtlZCBjb25maWcgaXRlbXMKICAgICRTZWxmLT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICByZXR1cm4gJFZlcnNpb25JRDsKfQoKPWl0ZW0gVmVyc2lvbkRlbGV0ZSgpCgpkZWxldGUgYW4gZXhpc3RpbmcgdmVyc2lvbiBvciB2ZXJzaW9ucwoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25EZWxldGUoCiAgICAgICAgVmVyc2lvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFZlcnNpb25EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAhJFBhcmFte1ZlcnNpb25JRH0gJiYgISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBWZXJzaW9uSUQgb3IgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZlcnNpb25MaXN0ID0gW107CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewoKICAgICAgICBwdXNoIEB7JFZlcnNpb25MaXN0fSwgJFBhcmFte1ZlcnNpb25JRH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgdmVyc2lvbiBsaXN0CiAgICAgICAgJFZlcnNpb25MaXN0ID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhc2NhbGFyIEB7JFZlcnNpb25MaXN0fTsKCiAgICAjIGRlbGV0ZSB0aGUgeG1sIHZlcnNpb24gZGF0YQogICAgZm9yIG15ICRWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgJFNlbGYtPl9YTUxWZXJzaW9uRGVsZXRlKAogICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgJFZlcnNpb25JRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFZlcnNpb25JRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHZlcnNpb24gaWQgc3RyaW5nCiAgICBteSAkVmVyc2lvbklEU3RyaW5nID0gam9pbiAnLCcsIEB7JFZlcnNpb25MaXN0fTsKCiAgICAjIGRlbGV0ZSB2ZXJzaW9ucwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCBJTiAoICRWZXJzaW9uSURTdHJpbmcgKSIsCiAgICApOwp9Cgo9aXRlbSBWZXJzaW9uU2VhcmNoKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYW4gYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvblNlYXJjaCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyA5LCA4LCA3LCA2IF0sICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCgogICAgICAgIE9yZGVyQnkgPT4gJ05hbWUnLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgQ29uZmlnSXRlbUlECiAgICAgICAgIyAoQ29uZmlnSXRlbUlELCBOYW1lLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQpCgogICAgICAgIExpbWl0ICAgICAgICAgID0+IDEyMiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CiAgICAkUGFyYW17T3JkZXJCeX0gfHw9ICdpZCc7CgogICAgIyBhZGQgbmFtZSB0byBzcWwgd2hlcmUgYXJyYXkKICAgIG15IEBTUUxXaGVyZTsKICAgIGlmICggJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgbmFtZQogICAgICAgIG15ICROYW1lID0gJFBhcmFte05hbWV9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJE5hbWUgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE5hbWUpOwoKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCROYW1lICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKHZyLm5hbWUpIExJS0UgTE9XRVIoJyROYW1lJykiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJMT1dFUih2ci5uYW1lKSA9IExPV0VSKCckTmFtZScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2xhc3NJRHMgICAgID0+ICdjaS5pZCA9IHZyLmNvbmZpZ2l0ZW1faWQgQU5EIGNpLmNsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJ3ZyLmRlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEcyA9PiAndnIuaW5jaV9zdGF0ZV9pZCcsCiAgICApOwoKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkUGFyYW17JEFycmF5UGFyYW19OwoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFycmF5UGFyYW19IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJyYXlQYXJhbSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiBxeywgfSwgQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRBcnJheVBhcmFtc3sgJEFycmF5UGFyYW0gfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBhZGQgcHJldmlvdXMgdmVyc2lvbiBwYXJhbQogICAgaWYgKCAhJFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gKSB7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICdjaS5sYXN0X3ZlcnNpb25faWQgPSB2ci5pZCc7CiAgICB9CgogICAgIyBjcmVhdGUgd2hlcmUgc3RyaW5nCiAgICBteSAkV2hlcmVTdHJpbmcgPSBAU1FMV2hlcmUgPyAnIFdIRVJFICcgLiBqb2luIHF7IEFORCB9LCBAU1FMV2hlcmUgOiAnJzsKCiAgICAjIGRlZmluZSBvcmRlciB0YWJsZQogICAgbXkgJU9yZGVyQnlUYWJsZSA9ICgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJ3ZyLmNvbmZpZ2l0ZW1faWQnLAogICAgICAgIE5hbWUgICAgICAgICA9PiAndnIubmFtZScsCiAgICAgICAgQ2xhc3NJRCAgICAgID0+ICdjaS5jbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICd2ci5kZXBsX3N0YXRlX2lkJywKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJ3ZyLmluY2lfc3RhdGVfaWQnLAogICAgKTsKCiAgICAjIHNldCBvcmRlciBieQogICAgbXkgJE9yZGVyQnkgPSAkT3JkZXJCeVRhYmxleyAkUGFyYW17T3JkZXJCeX0gfSB8fCAkT3JkZXJCeVRhYmxle0NvbmZpZ0l0ZW1JRH07CgogICAgIyBzZXQgbGltaXQKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUKHZyLmNvbmZpZ2l0ZW1faWQpICIKICAgICAgICAgICAgLiAiRlJPTSBjb25maWdpdGVtIGNpLCBjb25maWdpdGVtX3ZlcnNpb24gdnIgIgogICAgICAgICAgICAuICIkV2hlcmVTdHJpbmcgT1JERVIgQlkgJE9yZGVyQnkgQVNDIiwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA5LzA1LzE4IDA5OjU5OjA0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1MLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIHhtbCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFhNTC5wbSx2IDEuNSAyMDA5LzA1LzE4IDA5OjU5OjA0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTCAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFhNTFZhbHVlTG9va3VwKCkKCmxvb2t1cCBhIHhtbCB2YWx1ZQoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoJVBhcmFtKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBYTUxTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkVmFsdWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MU3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgY3JlYXRlIHN0YXRzIGF0dHJpYnV0ZSBhcnJheQogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBYTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB4bWwgc2VhcmNoIGRhdGEgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCAoICRQYXJhbXtJdGVtfSAmJiByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgcHJlcGFyZSB2YWx1ZQogICAgbXkgJEFycmF5ID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSglUGFyYW0pOwoKICAgIHJldHVybiAkQXJyYXk7Cn0KCj1pdGVtIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBkYXRhIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MRXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIHByZXBhcmUgdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBYTUxJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB4bWwgc2VhcmNoIGRhdGEgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCAoICRQYXJhbXtJdGVtfSAmJiByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgcHJlcGFyZSB2YWx1ZQogICAgbXkgJEFycmF5ID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSglUGFyYW0pOwoKICAgIHJldHVybiAkQXJyYXk7Cn0KCj1pdGVtIFhNTEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBkYXRhIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MSW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIHByZXBhcmUgdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBfWE1MVmVyc2lvblNlYXJjaCgpCgpzZWFyY2ggeG1sIGRhdGEgb2YgYSB2ZXJzaW9uIGFuZCByZXR1cm4gYSBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRWZXJzaW9uSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxWZXJzaW9uU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFsxLCAyLCAzXSwgICMgKG9wdGlvbmFsKQoKICAgICAgICBXaGF0ID0+IFsKICAgICAgICAgICAgIyBlYWNoIGFycmF5IGVsZW1lbnQgaXMgYSBhbmQgY29uZGl0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgb3IgY29uZGl0aW9uIGluIGhhc2gKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgYXJyYXkgcmVmZXJlbmNlIGlmIGRpZmZlcmVudCBjb250ZW50IHdpdGggc2FtZSBrZXkgd2FzIHNlYXJjaGVkCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+IFsKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRDJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RCUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEUlJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+IFsKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRDJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RCUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEUlJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXaGF0fSB8fCByZWYgJFBhcmFte1doYXR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFdoYXQgYXMgYXJyYXkgcmVmZXJlbmNlISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte1doYXR9IH0gKSB7CgogICAgICAgIFZBTFVFUzoKICAgICAgICBmb3IgbXkgJFZhbHVlcyAoIHZhbHVlcyAleyRSb3d9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRVMgaWYgISRWYWx1ZXM7CgogICAgICAgICAgICAjIHZhbHVlcyBpcyBhbiBhcnJheQogICAgICAgICAgICBpZiAoIHJlZiAkVmFsdWVzIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFZhbHVlICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X1ByZXBhcmVMaWtlU3RyaW5nKCBcJFZhbHVlICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0IFZBTFVFUzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCRWYWx1ZXMgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0NsYXNzSURzfSB8fCByZWYgJFBhcmFte0NsYXNzSURzfSBuZSAnQVJSQVknIHx8ICFAeyAkUGFyYW17Q2xhc3NJRHN9IH0gKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgIEB7ICRQYXJhbXtDbGFzc0lEc30gfSA9IGtleXMgJXskQ2xhc3NMaXN0fTsKICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJENsYXNzSUQgKCBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkQ2xhc3NJRCwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBzZWFyY2ggaW4gYWN0aXZlIHZlcnNpb25zCiAgICBteSAlVmVyc2lvbklEczsKICAgIGZvciBteSAkQ2xhc3NJRCAoIEB7ICRQYXJhbXtDbGFzc0lEc30gfSApIHsKCiAgICAgICAgIyBzdGFydCB4bWwgc2VhcmNoCiAgICAgICAgbXkgQEtleXMgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hTZWFyY2goCiAgICAgICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRDbGFzc0lEIiwKICAgICAgICAgICAgV2hhdCA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgYWxsIGlkcyB0byB2ZXJzaW9uIGlkIGhhc2gKICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoQEtleXMpIHsKICAgICAgICAgICAgJFZlcnNpb25JRHN7JFZlcnNpb25JRH0gPSAxCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJVZlcnNpb25JRHMgaWYgISRQYXJhbXtQcmV2aW91c1ZlcnNpb25TZWFyY2h9OwoKICAgICMgc2VhcmNoIGFsc28gaW4gb2xkIHZlcnNpb25zIChhcmNoaXYpCiAgICBmb3IgbXkgJENsYXNzSUQgKCBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gKSB7CgogICAgICAgICMgc3RhcnQgeG1sIHNlYXJjaAogICAgICAgIG15IEBLZXlzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKAogICAgICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjpBcmNoaXY6OiRDbGFzc0lEIiwKICAgICAgICAgICAgV2hhdCA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgYWxsIGlkcyB0byB2ZXJzaW9uIGlkIGhhc2gKICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoQEtleXMpIHsKICAgICAgICAgICAgJFZlcnNpb25JRHN7JFZlcnNpb25JRH0gPSAxCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJVZlcnNpb25JRHM7Cn0KCj1pdGVtIF9YTUxWZXJzaW9uR2V0KCkKCmdldCB0aGUgeG1sIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJEFycmF5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxWZXJzaW9uR2V0KAogICAgICAgIENsYXNzSUQgICA9PiAxLAogICAgICAgIFZlcnNpb25JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgVmVyc2lvbklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZlcnNpb24KICAgIG15IEBYTUwgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hHZXQoCiAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICByZXR1cm4gXEBYTUwgaWYgQFhNTDsKCiAgICAjIGdldCB2ZXJzaW9uIGZyb20gYXJjaGl2CiAgICBAWE1MID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICByZXR1cm4gXEBYTUw7Cn0KCj1pdGVtIF9YTUxWZXJzaW9uQWRkKCkKCmFkZCB0aGUgeG1sIGRhdGEgb2YgYSBuZXcgdmVyc2lvbiBhbmQgbW92ZSBvbGQgeG1sIHZlcnNpb25zIGluIGFyY2hpdiBjbGFzcwoKICAgIG15ICRYTUxJRCA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkFkZCgKICAgICAgICBDbGFzc0lEICAgICAgPT4gMSwKICAgICAgICBDb25maWdJdGVtSUQgPT4gMjIyLAogICAgICAgIFZlcnNpb25JRCAgICA9PiAxMjMsCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX1hNTFZlcnNpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBDb25maWdJdGVtSUQgVmVyc2lvbklEIFhNTERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgeG1sIHZlcnNpb24KICAgIG15ICRYTUxJRCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKICAgICAgICBUeXBlICAgID0+ICJJVFNNOjpDb25maWdJdGVtOjokUGFyYW17Q2xhc3NJRH0iLAogICAgICAgIEtleSAgICAgPT4gJFBhcmFte1ZlcnNpb25JRH0sCiAgICAgICAgWE1MSGFzaCA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICApOwoKICAgICMgZ2V0IGxhc3QgdmVyc2lvbnMKICAgIG15ICRPbGRWZXJzaW9uSURzID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBGaW5kIFZlcnNpb24gdG8gbW92ZQogICAgbXkgJE1vdmVWZXJzaW9uOwogICAgT0xEVkVSU0lPTklEOgogICAgZm9yIG15ICRPbGRWZXJzaW9uSUQgKCBAeyRPbGRWZXJzaW9uSURzfSApIHsKICAgICAgICBsYXN0IE9MRFZFUlNJT05JRCBpZiAkT2xkVmVyc2lvbklEIGVxICRQYXJhbXtWZXJzaW9uSUR9OwoKICAgICAgICAkTW92ZVZlcnNpb24gPSAkT2xkVmVyc2lvbklEOwogICAgfQoKICAgIHJldHVybiAkWE1MSUQgaWYgISRNb3ZlVmVyc2lvbjsKCiAgICAjIG1vdmUgb2xkIHZlcnNpb24gaW4gYXJjaGl2CiAgICAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hNb3ZlKAogICAgICAgIE9sZFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRQYXJhbXtDbGFzc0lEfSIsCiAgICAgICAgT2xkS2V5ICA9PiAkTW92ZVZlcnNpb24sCiAgICAgICAgTmV3VHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6QXJjaGl2OjokUGFyYW17Q2xhc3NJRH0iLAogICAgICAgIE5ld0tleSAgPT4gJE1vdmVWZXJzaW9uLAogICAgKTsKCiAgICByZXR1cm4gJFhNTElEOwp9Cgo9aXRlbSBfWE1MVmVyc2lvbkRlbGV0ZSgpCgpkZWxldGUgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRUcnVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxWZXJzaW9uRGVsZXRlKAogICAgICAgIFZlcnNpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZlcnNpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbiBkYXRhCiAgICBteSAkVmVyc2lvbiA9ICRTZWxmLT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVmVyc2lvbjsKCiAgICAjIGRlbGV0ZSB4bWwgZGF0YSBmcm9tIGEgdmVyc2lvbgogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoRGVsZXRlKAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRWZXJzaW9uLT57Q2xhc3NJRH0iLAogICAgICAgIEtleSAgPT4gJFBhcmFte1ZlcnNpb25JRH0sCiAgICApOwoKICAgICMgZGVsZXRlIHhtbCBkYXRhIGZyb20gYXJjaGl2CiAgICAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6QXJjaGl2OjokVmVyc2lvbi0+e0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0xvYWRYTUxUeXBlQmFja2VuZCgpCgpsb2FkIGEgeG1sIGl0ZW0gbW9kdWxlCgogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkWE1MVHlwZUJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57TG9hZFhNTFR5cGVCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57TG9hZFhNTFR5cGVCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfTsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6JFBhcmFte1R5cGV9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntMb2FkWE1MVHlwZUJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAwOS8wNS8xOCAwOTo1OTowNCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyL0F1dG9JbmNyZW1lbnQucG0gLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEF1dG9JbmNyZW1lbnQucG0sdiAxLjIgMjAwOS8wNS8xOCAwOTo1OTowNCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6QXV0b0luY3JlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQgLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGF1dG8gaW5jcmVtZW50IGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIF9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKCkKCmNyZWF0ZSBhIG5ldyBjb25maWcgaXRlbSBudW1iZXIKCiAgICBteSAkTnVtYmVyID0gJEJhY2tlbmRPYmplY3QtPl9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfQ29uZmlnSXRlbU51bWJlckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ2xhc3NJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHN5c3RlbSBpZAogICAgbXkgJFN5c3RlbUlEID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N5c3RlbUlEJyk7CgogICAgIyBnZXQgY3VycmVudCBjb3VudGVyCiAgICBteSAkQ3VycmVudENvdW50ZXIgPSAkU2VsZi0+Q3VycmVudENvdW50ZXJHZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICApIHx8IDA7CgogICAgQ0lQSEVSOgogICAgZm9yIG15ICRDaXBoZXIgKCAxIC4uIDFfMDAwXzAwMF8wMDAgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyBudW1iZXIKICAgICAgICBteSAkTnVtYmVyID0gJFN5c3RlbUlEIC4gJFBhcmFte0NsYXNzSUR9IC4gc3ByaW50ZiggIiUwNmQiLCAoICRDdXJyZW50Q291bnRlciArICRDaXBoZXIgKSApOwoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgbnVtYmVyCiAgICAgICAgbXkgJER1YmxpY2F0ZSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICROdW1iZXIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDSVBIRVIgaWYgJER1YmxpY2F0ZTsKCiAgICAgICAgIyBzZXQgY291bnRlcgogICAgICAgICRTZWxmLT5DdXJyZW50Q291bnRlclNldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgICAgICBDb3VudGVyID0+ICggJEN1cnJlbnRDb3VudGVyICsgJENpcGhlciApLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTnVtYmVyOwogICAgfQoKICAgIHJldHVybjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA5LzA1LzE4IDA5OjU5OjA0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ3VzdG9tZXIucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEN1c3RvbWVyLnBtLHYgMS40IDIwMDkvMDcvMjEgMDA6NDM6NDkgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkN1c3RvbWVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBjdXN0b21lciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlQ3VzdG9tZXJTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgcmV0dXJuICRDdXN0b21lclNlYXJjaExpc3R7ICRQYXJhbXtWYWx1ZX0gfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDo0Mzo0OSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZS5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGF0ZS5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjI2OjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBkYXRlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZGF0ZSBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIwIDIzOjI2OjAzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZVRpbWUucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGVUaW1lLnBtLHYgMS4zIDIwMDkvMDcvMjAgMjM6MjY6MDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkRhdGVUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZVRpbWUgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSBkYXRlIHRpbWUgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYgMjI6MDEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX0gfHwgJyc7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybjsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMCAyMzoyNjowMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRHVtbXkucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IER1bW15LnBtLHYgMS4zIDIwMDkvMDcvMjAgMjM6MjY6MDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkR1bW15OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RHVtbXkgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZHVtbXkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZHVtbXkgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIwIDIzOjI2OjAzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvR2VuZXJhbENhdGFsb2cucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4zIDIwMDkvMDcvMjAgMjM6MjY6MDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkdlbmVyYWxDYXRhbG9nIC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIGdlbmVyYWwgY2F0YWxvZyBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgeG1sIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkSXRlbUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRJdGVtTGlzdCBuZSAnSEFTSCc7CgogICAgbXkgJFZhbHVlID0gJEl0ZW1MaXN0LT57ICRQYXJhbXtWYWx1ZX0gfTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRJdGVtTGlzdCB8fCB7fSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICBAVmFsdWVzID0gZ3JlcCB7JF99IEBWYWx1ZXM7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgcmV0dXJuICRJdGVtTGlzdC0+eyAkUGFyYW17VmFsdWV9IH0gfHwgJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICBAVmFsdWVzID0gZ3JlcCB7JF99IEBWYWx1ZXM7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgZ2V0IGl0ZW0gbGlzdAogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyByZXZlcnNlIHRoZSBsaXN0CiAgICBteSAlSXRlbUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJdGVtTGlzdH07CgogICAgcmV0dXJuICRJdGVtTGlzdFJldmVyc2V7ICRQYXJhbXtWYWx1ZX0gfSB8fCB1bmRlZjsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIwIDIzOjI2OjAzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvSW50ZWdlci5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW50ZWdlci5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjI2OjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpJbnRlZ2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6SW50ZWdlciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBpbnRlZ2VyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgaW50ZWdlciBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm47Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMDcvMjAgMjM6MjY6MDMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dC5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGV4dC5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjI2OjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMCAyMzoyNjowMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dEFyZWEucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRleHRBcmVhLnBtLHYgMS4zIDIwMDkvMDcvMjAgMjM6MjY6MDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlRleHRBcmVhOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dEFyZWEgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgdGV4dGFyZWEgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMCAyMzoyNjowMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNQ29uZmlnSXRlbS5wbSAtIHRvIGxpbmsgY29uZmlnIGl0ZW0gb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjggMjAwOS8wNy8yMCAyMzoyNjozNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgTGlua09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+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+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUG9zdCgpCgpsaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ29uZmlnSXRlbS5wbSAtIGFsbCBkeW5hbWljIGl0c20gY29uZmlnIGl0ZW0gc3RhdHMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjI2OjM3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJ0lUU01Db25maWdJdGVtJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyBjcmVhdGUgb2JqZWN0IGF0dHJpYnV0ZSBhcnJheQogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ0NsYXNzSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDaGFuZ2UgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NoYW5nZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIHRoZSB4bWwgZGF0YQogICAgQ0xBU1NJRDoKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIGdldCB4bWwgZGVmaW5pdGlvbiBoYXNoCiAgICAgICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NJRCBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9OwoKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgT2JqZWN0QXR0cmlidXRlcyA9PiBcQE9iamVjdEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gICAgPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAnWE1MOjonIC4gJENsYXNzSUQsCiAgICAgICAgICAgIFByZWZpeE5hbWUgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIF9YTUxBdHRyaWJ1dGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICRQYXJhbXtQcmVmaXh9IC49ICc6Oic7CiAgICB9CiAgICBpZiAoICRQYXJhbXtQcmVmaXhOYW1lfSApIHsKICAgICAgICAkUGFyYW17UHJlZml4TmFtZX0gLj0gJzo6JzsKICAgIH0KCiAgICAkUGFyYW17TGV2ZWx9ICAgICAgfHw9IDA7CiAgICAkUGFyYW17UHJlZml4fSAgICAgfHw9ICcnOwogICAgJFBhcmFte1ByZWZpeE5hbWV9IHx8PSAnJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTZWFyY2hhYmxlfSAmJiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIGNyZWF0ZSBrZXkgYW5kIG5hbWUKICAgICAgICBteSAkS2V5ICA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9OwogICAgICAgIG15ICROYW1lID0gJFBhcmFte1ByZWZpeE5hbWV9IC4gJEl0ZW0tPntOYW1lfTsKCiAgICAgICAgIyBhZGQgYXR0cmlidXRlCiAgICAgICAgbXkgJEF0dHJpYnV0ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkQXR0cmlidXRlOwogICAgICAgIG5leHQgSVRFTSBpZiByZWYgJEF0dHJpYnV0ZSBuZSAnQVJSQVknOwogICAgICAgIG5leHQgSVRFTSBpZiAhc2NhbGFyIEB7JEF0dHJpYnV0ZX07CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZXMgdG8gb2JqZWN0IGFycmF5CiAgICAgICAgcHVzaCBAeyAkUGFyYW17T2JqZWN0QXR0cmlidXRlc30gfSwgQHskQXR0cmlidXRlfTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBsaW1pdAogICAgJFBhcmFte0xpbWl0fSA9IDFfMDAwXzAwMDsKCiAgICAjIGV4dHJhY3QgYWxsIHhtbCBwYXJhbSBrZXlzIGZyb20gdGhlIHBhcmFtIGhhc2gKICAgIG15IEBYTUxQYXJhbXMgPSBncmVwIHsgJF8gPX4gbXtcQSBYTUw6On14bXMgfSBrZXlzICVQYXJhbTsKCiAgICBpZiAoQFhNTFBhcmFtcykgewogICAgICAgIHJldHVybiAnWW91IG11c3QgZGVmaW5lZCBhIGNsYXNzIGluIG9uZSBheGlzLicgaWYgISRQYXJhbXtDbGFzc0lEc307CiAgICAgICAgcmV0dXJuICdZb3UgbXVzdCBkZWZpbmVkIGEgY2xhc3MgaW4gb25lIGF4aXMuJyBpZiByZWYgJFBhcmFte0NsYXNzSURzfSBuZSAnQVJSQVknOwogICAgfQoKICAgIG15ICVYTUxDbGFzc0lEczsKICAgIGZvciBteSAkUGFyYW1LZXkgKEBYTUxQYXJhbXMpIHsKCiAgICAgICAgIyBleHRyYWN0IHNlYXJjaCB2YWx1ZXMKICAgICAgICBteSAkU2VhcmNoVmFsdWVzID0gJFBhcmFteyRQYXJhbUtleX07CgogICAgICAgICMgcHJlcGFyZSBwYXJhbSB2YWx1ZQogICAgICAgIGlmICggIXJlZiAkU2VhcmNoVmFsdWVzICkgewogICAgICAgICAgICAkU2VhcmNoVmFsdWVzID0gWyRTZWFyY2hWYWx1ZXNdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBpZiAhQHskU2VhcmNoVmFsdWVzfTsKCiAgICAgICAgIyBzcGxpdCBwYXJhbSBrZXkKICAgICAgICBteSAoICRDbGFzc0lELCAkU2VhcmNoS2V5ICkgPSAkUGFyYW1LZXkgPX4gbXsgXEEgWE1MOjogKCBcZCsgKSA6OiAoLispIFx6IH14bXM7CgogICAgICAgICMgcHJlcGFyZSBzZWFyY2gga2V5CiAgICAgICAgJFNlYXJjaEtleSA9fiBzWyA6OiBdWyd9WyVdeyddeG1zZzsKCiAgICAgICAgIyBBZGQgY2xhc3MgaWQgdG8geG1sIGNsYXNzIGlkIGhhc2gKICAgICAgICAkWE1MQ2xhc3NJRHN7JENsYXNzSUR9ID0gMTsKCiAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiAkU2VhcmNoVmFsdWVzLAogICAgICAgIH07CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgfQoKICAgIGlmICglWE1MQ2xhc3NJRHMpIHsKICAgICAgICBteSBARXhpc3RzID0gZ3JlcCB7ICRYTUxDbGFzc0lEc3skX30gfSBAeyAkUGFyYW17Q2xhc3NJRHN9IH07CgogICAgICAgIHJldHVybiAwIGlmICFARXhpc3RzOwogICAgfQoKICAgICMgc3RhcnQgY29uZmlnIGl0ZW0gZXh0ZW5kZWQgc2VhcmNoCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCglUGFyYW0pOwoKICAgIHJldHVybiBzY2FsYXIgQHskQ29uZmlnSXRlbUlEc307Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEltcG9ydEV4cG9ydE9iamVjdElUU01Db25maWdJdGVtLnQgLSBhbGwgaW1wb3J0IGV4cG9ydCB0ZXN0cyBmb3IgdGhlIElUU01Db25maWdJdGVtIG9iamVjdCBiYWNrZW5kCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRPYmplY3RJVFNNQ29uZmlnSXRlbS50LHYgMS4yIDIwMDkvMDUvMTggMDk6NTc6MjEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgokU2VsZi0+e0VuY29kZU9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0KICAgID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1hNTE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgYWRkIHNvbWUgdGVzdCB0ZW1wbGF0ZXMgZm9yIGxhdGVyIGNoZWNrcwpteSBAVGVtcGxhdGVJRHM7CmZvciAoIDEgLi4gMzAgKSB7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgRm9ybWF0ICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgojIGNoZWNrIG9iamVjdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9iamVjdExpc3QxICYmIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnICYmICRPYmplY3RMaXN0MS0+e0lUU01Db25maWdJdGVtfSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIElUU01Db25maWdJdGVtIGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBvYmplY3QgYXR0cmlidXRlcwpteSAkT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgb2JqZWN0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldDEgJiYgcmVmICRPYmplY3RBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZ2V0IGNsYXNzIGxpc3QKbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJE9iamVjdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICBOYW1lICA9PiAnQ2xhc3MnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ291bnRNYXgnLAogICAgICAgIE5hbWUgID0+ICdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJzEwJywKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFJlZ2V4ICAgICAgICA9PiBxcnsgXEEgXGQrIFx6IH14bXMsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDUsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQpteSAkT2JqZWN0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE9iamVjdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRPYmplY3RBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkT2JqZWN0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwoKJFNlbGYtPlRydWUoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldER1bXAxIGVxICRPYmplY3RBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBvYmplY3QgYXR0cmlidXRlcwpteSAkT2JqZWN0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJE9iamVjdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyB0byB0ZXN0IEV4cG9ydERhdGFHZXQoKSBhbmQgSW1wb3J0RGF0YVNhdmUoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkR2VuZXJhbENhdGFsb2dDbGFzcyA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGFkZCBhIGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKZm9yIG15ICROYW1lIChxdyhUZXN0MSBUZXN0MiBUZXN0MyBUZXN0NCkpIHsKCiAgICAjIGFkZCBhIG5ldyBpdGVtCiAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkR2VuZXJhbENhdGFsb2dDbGFzcywKICAgICAgICBOYW1lICAgID0+ICROYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaXRlbSBpZAogICAgaWYgKCAhJEl0ZW1JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtLiIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBkZWZpbmUgdGhlIGZpcnN0IHRlc3QgZGVmaW5pdGlvbiAoYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMpCm15IEBDb25maWdJdGVtRGVmaW5pdGlvbnM7CiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMF0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZVRpbWUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIFRpbWUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlVGltZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0R1bW15MScsCiAgICAgICAgTmFtZSAgPT4gJ0R1bW15IDEnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRHVtbXknLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0dlbmVyYWxDYXRhbG9nMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBDbGFzcyA9PiAnJEdlbmVyYWxDYXRhbG9nQ2xhc3MnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0ludGVnZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdJbnRlZ2VyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnVGV4dDEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHQgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0QXJlYTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHRBcmVhIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICB9LApdICI7CgojIGRlZmluZSB0aGUgc2Vjb25kIHRlc3QgZGVmaW5pdGlvbiAoc3ViIGRhdGEgdHlwZXMpCiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMV0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMScsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMicsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMicsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDEnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMlN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKXSAiOwoKIyBhZGQgdGhlIHRlc3QgY2xhc3NlcwpteSBAQ29uZmlnSXRlbUNsYXNzSURzOwpteSBAQ29uZmlnSXRlbURlZmluaXRpb25JRHM7CmZvciBteSAkRGVmaW5pdGlvbiAoQENvbmZpZ0l0ZW1EZWZpbml0aW9ucykgewoKICAgICMgZ2VuZXJhdGUgYSByYW5kb20gbmFtZQogICAgbXkgJENsYXNzTmFtZSA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgIyBhZGQgYW4gdW5pdHRlc3QgY29uZmlnIGl0ZW0gY2xhc3MKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGNsYXNzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDbGFzc0lEOwoKICAgICMgYWRkIGEgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uQWRkKAogICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgZGVmaW5pdGlvbiBpZAogICAgaWYgKCAhJERlZmluaXRpb25JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGRlZmluaXRpb24uIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzLCAkRGVmaW5pdGlvbklEOwp9CgojIGNyZWF0ZSBzb21lIHJhbmRvbSBudW1iZXJzCm15IEBDb25maWdJdGVtTnVtYmVyczsKZm9yICggMSAuLiAxMCApIHsKICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdApteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlRGVwbFN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9OwoKIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdApteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKKTsKbXkgJUluY2lTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKCiMgZ2V0IGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKbXkgJEdlbmVyYWxDYXRhbG9nTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAopOwpteSAlR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskR2VuZXJhbENhdGFsb2dMaXN0fTsKCiMgZGVmaW5lIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbXMgPSAoCgogICAgIyBjb25maWcgaXRlbSBmb3IgYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGEgc2Vjb25kIGNvbmZpZyBpdGVtIGZvciBhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcwogICAgIyAoZHVwbGljYXRlIG5hbWUgb2YgZmlyc3QgdmVyc2lvbiBmb3Igc2VhcmNoIGNoZWNrcykKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMV0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsICAgICMgZHVwbGljYXRlIG5hbWUgZm9yIHRlc3RzCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdVbml0VGVzdDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMiAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0Mn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3QgVGV4dCBUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdDJcblRleHQgQXJyYXlcblRlc3QgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIHNwZWNpYWwgY2hhcmFjdGVyIHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnIiI7Ozo6Li4tLV9fIyMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdCBUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0XG5UZXN0XHRUZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIFVURi04IHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn4oaCIOKFuyDihZsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ+KYhCDihq4g4oa5IOKGkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAn4oKkIOKCoSDigqkg4oKvIOKCtScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KZiiDimYgg4pmJIOKZiiDimYsg4pmNIOKZkScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KciCDinaQg4piuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn1Yog1YQg1YAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ8KuIMKpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICfjgYsg44GSIOOCkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKKTsKCiMgYWRkIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbUlEczsKZm9yIG15ICRDb25maWdJdGVtIChAQ29uZmlnSXRlbXMpIHsKCiAgICAjIGFkZCBhIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAleyAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW19IH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0gaWQKICAgIGlmICggISRDb25maWdJdGVtSUQgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBjb25maWcgaXRlbS4iLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKCiAgICAjIGFkZCB0aGUgdmVyc2lvbnMKICAgIGZvciBteSAkVmVyc2lvbiAoIEB7ICRDb25maWdJdGVtLT57VmVyc2lvbnN9IH0gKSB7CgogICAgICAgICMgYWRkIGEgdmVyc2lvbgogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB2ZXJzaW9uIGlkCiAgICAgICAgaWYgKCAhJFZlcnNpb25JRCApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHZlcnNpb24uIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRFeHBvcnREYXRhVGVzdHMgPSBbCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1stMV0gKyAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbWFwcGluZyBsaXN0IGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG51bWJlciBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmFtZSBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2FzZSBpbnNlbnNpdGl2ZSBuYW1lIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ3VuaXR0ZXN0IC0gY29uZmlnaXRlbSAxIHZlcnNpb24gMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuYW1lIGFuZCBudW1iZXIgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGRlcGxveW1lbnQgc3RhdGUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1sxXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGluY2lkZW50IHN0YXRlIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzFdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY29tYmluZWQgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFhNTCBkYXRhIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIERhdGUxICAgICAgICAgICA9PiAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICBUZXh0QXJlYTEgICAgICAgPT4gIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICAgICAgQ3VzdG9tZXIxICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICBUZXh0MSAgICAgICAgICAgPT4gJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgIERhdGVUaW1lMSAgICAgICA9PiAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICBJbnRlZ2VyMSAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNvbWJpbmVkIGFsbCBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgRGF0ZTEgICAgICAgICAgID0+ICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgIFRleHRBcmVhMSAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICBDdXN0b21lcjEgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgIFRleHQxICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgRGF0ZVRpbWUxICAgICAgID0+ICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIEludGVnZXIxICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHJldHVybmVkIGFycmF5KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEdW1teTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGRvdWJsZSBlbGVtZW50IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEdW1teTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzdWIgZWxlbWVudCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcyB3aXRoIHVuZGVmIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjo0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMSAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzdWIgZWxlbWVudCBjaGVja3Mgd2l0aCB1bmRlZiB2YWx1ZXMgYW5kIGVtcHR5IHN0cmluZ3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6NCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbM10sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDUgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnLAogICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywKICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXN0JywKICAgICAgICAgICAgICAgICJUZXN0XG5UZXN0XHRUZXN0IiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1XSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICfihoIg4oW7IOKFmycsCiAgICAgICAgICAgICAgICAn4piEIOKGriDihrkg4oaSJywKICAgICAgICAgICAgICAgICfigqQg4oKhIOKCqSDigq8g4oK1JywKICAgICAgICAgICAgICAgICfimYog4pmIIOKZiSDimYog4pmLIOKZjSDimZEnLAogICAgICAgICAgICAgICAgJ+KciCDinaQg4piuJywKICAgICAgICAgICAgICAgICfViiDVhCDVgCcsCiAgICAgICAgICAgICAgICAnwq4gwqknLAogICAgICAgICAgICAgICAgJ+OBiyDjgZIg44KSJywKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEV4cG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VFeHBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VFeHBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCB0aGUgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBPYmplY3REYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntPYmplY3REYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gZXEgJ0FSUkFZJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKICAgICAgICBNQVBQSU5HT0JKRUNUREFUQToKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhICggQHsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgbXkgJE1hcHBpbmdJRCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkTWFwcGluZ09iamVjdERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB0aGUgc2VhcmNoIGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57U2VhcmNoRGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e1NlYXJjaERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgc2VhcmNoIGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTZWFyY2hEYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntTZWFyY2hEYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJFNlbGYtPntPYmplY3RCYWNrZW5kT2JqZWN0fS0+RXhwb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkRXhwb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkRXhwb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRFeHBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgZXhwb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkRXhwb3J0Um93ICggQHskRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlRXhwb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRFeHBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gZXhwb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRFeHBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEV4cG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBJbXBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gW10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2xhc3MgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWy0xXSArIDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbWFwcGluZyBsaXN0IGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG1vcmUgdGhhbiBvbmUgaWRlbnRpZmllciB3aXRoIHRoZSBzYW1lIG5hbWUgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJzEyMycsICczMjEnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpZGVudGlmaWVyIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpZGVudGlmaWVyIGlzIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFt1bmRlZl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBib3RoIGlkZW50aWZpZXJzIGFyZSBlbXB0eSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBib3RoIGlkZW50aWZpZXJzIGFyZSB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgdW5kZWYsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgaWRlbnRpZmllcnMgaXMgZW1wdHksIG9uZSBpcyB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnMTIzJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgdW5kZWYgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcxMjMnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBpcyBlbXB0eSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICcxMjMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJzEyMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRPRE8gQWRkIHNvbWUgaWRlbnRpZmllciB0ZXN0cwoKICAgICMgZW1wdHkgbmFtZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcnLCAnUHJvZHVjdGlvbicsICdPcGVyYXRpb25hbCcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMScsICdEdW1teScsICdPcGVyYXRpb25hbCcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgaW5jaWRlbnQgc3RhdGUgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDInLCAnUHJvZHVjdGlvbicsICdEdW1teScgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIE5FVyBjb25maWcgaXRlbSBtdXN0IGJlIGNyZWF0ZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wNi0wNScsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDgtMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MycsCiAgICAgICAgICAgICAgICAgICAgJzMnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MyBUZXh0MyBUZXN0MycsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QzXG5UZXh0QXJyYXkzXG5UZXN0MyIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTA2LTA1JywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTA4LTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QzfSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0MyBUZXh0MyBUZXN0MycsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdDNcblRleHRBcnJheTNcblRlc3QzIiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIHNlY29uZCBORVcgY29uZmlnIGl0ZW0gbXVzdCBiZSBjcmVhdGVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDQnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDktMDUnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTEyLTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDQnLAogICAgICAgICAgICAgICAgICAgICc0JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDQgVGV4dDQgVGVzdDQnLAogICAgICAgICAgICAgICAgICAgICJUZXN0NFxuVGV4dEFycmF5NFxuVGVzdDQiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMSwKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDQnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wOS0wNScsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0xMi0wNSAwNDo1MCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0NH0sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnNCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdDQgVGV4dDQgVGVzdDQnLAogICAgICAgICAgICAgICAgJ1RleHRBcmVhMTo6MScgICAgICAgPT4gIlRlc3Q0XG5UZXh0QXJyYXk0XG5UZXN0NCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIGZpcnN0IHRlc3QgY29uZmlnIGl0ZW0pCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgJ1BpbG90JywKICAgICAgICAgICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDInLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAyIDAzOjU5JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDInLAogICAgICAgICAgICAgICAgICAgICcyJywKICAgICAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFVQREFURTEgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMVxuVGVzdCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAyLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1BpbG90JywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAnQ3VzdG9tZXIxOjoxJyAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ0RhdGUxOjoxJyAgICAgICAgICAgPT4gJzIwMDgtMDItMDInLAogICAgICAgICAgICAgICAgJ0RhdGVUaW1lMTo6MScgICAgICAgPT4gJzIwMDgtMDItMDIgMDM6NTknLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDJ9LAogICAgICAgICAgICAgICAgJ0ludGVnZXIxOjoxJyAgICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ1Rlc3QgVGV4dCBVUERBVEUxIFRlc3QnLAogICAgICAgICAgICAgICAgJ1RleHRBcmVhMTo6MScgICAgICAgPT4gIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMVxuVGVzdCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIGZpcnN0IHRlc3QgY29uZmlnIGl0ZW0gYWdhaW4pCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1JlcGFpcicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAzJywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMyAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzJywKICAgICAgICAgICAgICAgICAgICAnMycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGV4dCBVUERBVEUyIFRlc3QnLAogICAgICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5IFVQREFURTJcblRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAzJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdSZXBhaXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wMi0wMycsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0wMi0wMyAwMzo1OScsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0M30sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFVQREFURTIgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUyXG5UZXN0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gdGhpcmQgdGVzdCBjb25maWcgaXRlbSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKSBNYWluMlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIE1haW4yU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMiAoMSkgTWFpbjJTdWIyICgyKScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAyLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMTo6MScgICAgICAgICAgICAgICA9PiAnTWFpbjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnID0+ICdNYWluMSAoMSkgTWFpbjFTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicgPT4gJ01haW4xICgxKSBNYWluMVN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MScgICAgICAgICAgICAgICA9PiAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJyA9PiAnTWFpbjIgKDEpIE1haW4yU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnID0+ICdNYWluMiAoMSkgTWFpbjJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjEnICAgICAgICAgICAgICAgPT4gJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiA0JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnzqsgzrQgzrsnLAogICAgICAgICAgICAgICAgICAgICfPgCDPhyDPmCcsCiAgICAgICAgICAgICAgICAgICAgJ8+6IM+xIM+uJywKICAgICAgICAgICAgICAgICAgICAnya8gypMgyqAnLAogICAgICAgICAgICAgICAgICAgICfKrCDKrycsCiAgICAgICAgICAgICAgICAgICAgJ9C5INGEINGJJywKICAgICAgICAgICAgICAgICAgICAn0Zog0ZEnLAogICAgICAgICAgICAgICAgICAgICfRrCDRpicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiA0JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMTo6MScgICAgICAgICAgICAgICA9PiAnzqsgzrQgzrsnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnID0+ICfPgCDPhyDPmCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJ8+6IM+xIM+uJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PiAnya8gypMgyqAnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfKrCDKrycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjEnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9C5INGEINGJJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJyAgICAgICAgICAgICAgICAgICAgICA9PiAn0Zog0ZEnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfRrCDRpicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUT0RPIGFkZCBzb21lIHVuZGVmIGZpZWxkIHRlc3RzCiAgICAjIFRPRE8gYWRkIHNvbWUgcmVxdWlyZWQgZmllbGQgdGVzdHMKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEltcG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VJbXBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VJbXBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCB0aGUgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57T2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e09iamVjdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e09iamVjdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSBlcSAnQVJSQVknCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCByb3dzCiAgICAgICAgTUFQUElOR09CSkVDVERBVEE6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoIEB7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgYWRkIGEgbmV3IG1hcHBpbmcgcm93CiAgICAgICAgICAgIG15ICRNYXBwaW5nSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRNYXBwaW5nT2JqZWN0RGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaW1wb3J0IGRhdGEgc2F2ZQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0tPkltcG9ydERhdGFTYXZlKAogICAgICAgICV7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGdldCB0aGUgdmVyc2lvbiBsaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBjaGVjayBudW1iZXIgb2YgdmVyc2lvbnMKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskVmVyc2lvbkxpc3R9LAogICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntWZXJzaW9uTnVtYmVyfSB8fCAwLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSBjb3JyZWN0IG51bWJlciBvZiB2ZXJzaW9ucyIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXN0IHZlcnNpb24KICAgIG15ICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICApOwoKICAgICMgdHJhbnNsYXRlIHhtbGRhdGEgaW4gYSAyZCBoYXNoCiAgICBteSAlWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJEKAogICAgICAgIFhNTEhhc2ggPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0sCiAgICApOwoKICAgICMgY2xlYW4gdGhlIHhtbCBoYXNoCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVhNTEhhc2ggKSB7CgogICAgICAgIG5leHQgS0VZIGlmICRLZXkgPX4gbXsgXHsnQ29udGVudCdcfSBceiB9eG1zOwoKICAgICAgICBkZWxldGUgJFhNTEhhc2h7JEtleX07CiAgICB9CgogICAgIyBjaGVjayBnZW5lcmFsIGVsZW1lbnRzCiAgICBFTEVNRU5UOgogICAgZm9yIG15ICRFbGVtZW50IChxdyhOdW1iZXIgTmFtZSBEZXBsU3RhdGUgSW5jaVN0YXRlKSkgewoKICAgICAgICBuZXh0IEVMRU1FTlQgaWYgIWV4aXN0cyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9OwoKICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlbGVtZW50CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkVmVyc2lvbkRhdGEtPnskRWxlbWVudH0sCiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgJEVsZW1lbnQgaXMgaWRlbnRpY2FsIiwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fTsKICAgIH0KCiAgICAjIGNoZWNrIG51bWJlciBvZiBYTUwgZWxlbWVudHMKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIga2V5cyAlWE1MSGFzaCwKICAgICAgICBzY2FsYXIga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259IH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIFhNTCBlbGVtZW50cyIsCiAgICApOwoKICAgICMgY2hlY2sgWE1MIGVsZW1lbnRzCiAgICBFTEVNRU5UOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0gfSApIHsKCiAgICAgICAgIyBkdXBsaWNhdGUga2V5CiAgICAgICAgbXkgJFhNTEtleSA9ICRLZXk7CgogICAgICAgICMgcHJlcGFyZSBrZXkKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgd2hpbGUgKCAkWE1MS2V5ID1+IG17IDo6IH14bXMgKSB7CgogICAgICAgICAgICBpZiAoICRDb3VudGVyICUgMiApIHsKICAgICAgICAgICAgICAgICRYTUxLZXkgPX4gc3sgOjogfXtdXHsnfXhtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRYTUxLZXkgPX4gc3sgOjogfXsnXH1bfXhtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIG5leHQgRUxFTUVOVCBpZiAhZXhpc3RzICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9OwoKICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9ICkgewogICAgICAgICAgICAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRLZXl9ICkgewogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEtleX0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBYTUwgZWxlbWVudAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFhNTEhhc2h7ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRYTUxLZXkgLiAnXXtcJ0NvbnRlbnRcJ30nIH0sCiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskS2V5fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAkS2V5IGlzIGlkZW50aWNhbCIsCiAgICAgICAgKTsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVsZXRlIHRoZSB0ZXN0IHRlbXBsYXRlcwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiBcQFRlbXBsYXRlSURzLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBnZXQgYWN0dWFsIGNsYXNzIGxpc3QKJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7CgojIHNldCB1bml0dGVzdCBjbGFzc2VzIGludmFsaWQKSVRFTUlEOgpmb3IgbXkgJEl0ZW1JRCAoIGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICBuZXh0IElURU1JRCBpZiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0gIX4gbXsgXEEgVW5pdFRlc3QgfXhtczsKCiAgICAjIHVwZGF0ZSBpdGVtCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cn0KCiMgZGVsZXRlIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIElUU01Db25maWdJdGVtLnQgLSBjb25maWcgaXRlbSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0udCx2IDEuMiAyMDA5LzA1LzE4IDA5OjU3OjIxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcGVyZm9ybSBDb25maWdJdGVtQ291bnQgdG8gZmlsbCB0aGUgZW1wdHkgZmllbGRzCiRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1Db3VudCgpOwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSVRTTUNvbmZpZ0l0ZW0nIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtSVRTTUNvbmZpZ0l0ZW0tJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1JVFNNQ29uZmlnSXRlbS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgpteSAkR2VuZXJhbENhdGFsb2dDbGFzcyA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGFkZCBhIGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKZm9yIG15ICROYW1lIChxdyhUZXN0MSBUZXN0MiBUZXN0MyBUZXN0NCkpIHsKCiAgICAjIGFkZCBhIG5ldyBpdGVtCiAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkR2VuZXJhbENhdGFsb2dDbGFzcywKICAgICAgICBOYW1lICAgID0+ICROYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaXRlbSBpZAogICAgaWYgKCAhJEl0ZW1JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtLiIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBkZWZpbmUgdGhlIGZpcnN0IHRlc3QgZGVmaW5pdGlvbiAoYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMpCm15IEBDb25maWdJdGVtRGVmaW5pdGlvbnM7CiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMF0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZVRpbWUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIFRpbWUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlVGltZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0R1bW15MScsCiAgICAgICAgTmFtZSAgPT4gJ0R1bW15IDEnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRHVtbXknLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0dlbmVyYWxDYXRhbG9nMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBDbGFzcyA9PiAnJEdlbmVyYWxDYXRhbG9nQ2xhc3MnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0ludGVnZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdJbnRlZ2VyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnVGV4dDEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHQgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0QXJlYTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHRBcmVhIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICB9LApdICI7CgojIGRlZmluZSB0aGUgc2Vjb25kIHRlc3QgZGVmaW5pdGlvbiAoc3ViIGRhdGEgdHlwZXMpCiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMV0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMScsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMicsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMicsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDEnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMlN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKXSAiOwoKIyBkZWZpbmUgdGhlIHRoaXJkIHRlc3QgZGVmaW5pdGlvbiAob25seSBmb3Igc2VhcmNoIHRlc3RzKQokQ29uZmlnSXRlbURlZmluaXRpb25zWzJdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKIyBkZWZpbmUgdGhlIGZvdXRoIHRlc3QgZGVmaW5pdGlvbiAob25seSBmb3Igc2VhcmNoIHRlc3RzKQokQ29uZmlnSXRlbURlZmluaXRpb25zWzNdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKIyBhZGQgdGhlIHRlc3QgY2xhc3NlcwpteSBAQ29uZmlnSXRlbUNsYXNzSURzOwpteSBAQ29uZmlnSXRlbUNsYXNzZXM7Cm15IEBDb25maWdJdGVtRGVmaW5pdGlvbklEczsKZm9yIG15ICREZWZpbml0aW9uIChAQ29uZmlnSXRlbURlZmluaXRpb25zKSB7CgogICAgIyBnZW5lcmF0ZSBhIHJhbmRvbSBuYW1lCiAgICBteSAkQ2xhc3NOYW1lID0gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKCiAgICAjIGFkZCBhbiB1bml0dGVzdCBjb25maWcgaXRlbSBjbGFzcwogICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2xhc3MgaWQKICAgIGlmICggISRDbGFzc0lEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gY2xhc3MuIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1DbGFzc0lEcywgJENsYXNzSUQ7CiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NlcywgICRDbGFzc05hbWU7CgogICAgIyBhZGQgYSBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcwogICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICA9PiAkQ2xhc3NJRCwKICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBkZWZpbml0aW9uIGlkCiAgICBpZiAoICEkRGVmaW5pdGlvbklEICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbi4iLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ29uZmlnSXRlbURlZmluaXRpb25JRHMsICREZWZpbml0aW9uSUQ7Cn0KCiMgY3JlYXRlIHNvbWUgcmFuZG9tIG51bWJlcnMKbXkgQENvbmZpZ0l0ZW1OdW1iZXJzOwpmb3IgKCAxIC4uIDEwMCApIHsKICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgZ2V0IGNsYXNzIGxpc3QKbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+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+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGNvbmZpZyBpdGVtIG9ubHkgZm9yIGxhdGVyIHNlYXJjaCB0ZXN0cwogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyA0IENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzNdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbM10gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uR2V0ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzNdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyA0IENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgY29uZmlnIGl0ZW0gdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBDb25maWdJdGVtSURzOwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskQ29uZmlnSXRlbVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGV4dHJhY3Qgc291cmNlIGRhdGEKICAgIG15ICRTb3VyY2VEYXRhID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKCiAgICAjIGFkZCBhIG5ldyBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIGlmICggJFNvdXJjZURhdGEtPntDb25maWdJdGVtQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NvbmZpZ0l0ZW1BZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDb25maWdJdGVtSUQpIHsKICAgICAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0KICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtQWRkKCkgLSBBZGQgbmV3IGNvbmZpZyBpdGVtLiBJbnNlcnQgc3VjY2Vzcy4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1JRDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1BZGQoKSAtIEFkZCBuZXcgY29uZmlnIGl0ZW0uIFJldHVybiBmYWxzZS4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgYWxsIGRlZmluZWQgdmVyc2lvbnMKICAgIG15IEBWZXJzaW9uSURzOwogICAgaWYgKCAkU291cmNlRGF0YS0+e1ZlcnNpb25BZGR9ICkgewoKICAgICAgICBmb3IgbXkgJFZlcnNpb24gKCBAeyAkU291cmNlRGF0YS0+e1ZlcnNpb25BZGR9IH0gKSB7CgogICAgICAgICAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewogICAgICAgICAgICAgICAgJFZlcnNpb24tPntDb25maWdJdGVtSUR9ID0gJENvbmZpZ0l0ZW1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgdmVyc2lvbgogICAgICAgICAgICBteSAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgICAgICV7JFZlcnNpb259LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRWZXJzaW9uSUQpIHsKICAgICAgICAgICAgICAgIHB1c2ggQFZlcnNpb25JRHMsICRWZXJzaW9uSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtRGF0YTsKICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBjb25maSBpdGVtIGRhdGEKICAgICAgICAkQ29uZmlnSXRlbURhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQ29uZmlnSXRlbURhdGEgKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtR2V0KCkgLSBnZXQgY29uZmlnIGl0ZW0gZGF0YS4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFsbCBjb25maWcgaXRlbSBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRDb25maWdJdGVtRGF0YS0+eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1EYXRhLT57JEF0dHJpYnV0ZX0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9LT57JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0tPnskQXR0cmlidXRlfSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYXR0cmlidXRlcwogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbURhdGEtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ29uZmlnSXRlbUdldCgpIC0gJEF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSB2ZXJzaW9ucwogICAgaWYgKAogICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGF0YX0KICAgICAgICAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0KICAgICAgICAmJiBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0gfQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQFZlcnNpb25JRHMsCiAgICAgICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0gfSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkFkZCgpIC0gY29ycmVjdCBudW1iZXIgb2YgdmVyc2lvbnMiLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1JRDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIHNjYWxhciBAVmVyc2lvbklEcywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkFkZCgpIC0gbm8gdmVyc2lvbnMgZXhpdHMiLAogICAgICAgICk7CiAgICB9CgogICAgbmV4dCBURVNUIGlmICEkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwogICAgbmV4dCBURVNUIGlmICEkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH07CgogICAgbXkgJENvdW50ZXIgICAgICAgICAgID0gMDsKICAgIG15ICRMYXN0VmVyc2lvbklETXVzdCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICBWRVJTSU9OSUQ6CiAgICBmb3IgbXkgJFZlcnNpb25JRCAoQFZlcnNpb25JRHMpIHsKCiAgICAgICAgIyBnZXQgdGhpcyB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgVmVyc2lvbklEICA9PiAkVmVyc2lvbklELAogICAgICAgICAgICBYTUxEYXRhR2V0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFZlcnNpb25EYXRhICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkdldCgpIC0gZ2V0IHZlcnNpb24gZGF0YS4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFZFUlNJT05JRDsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBsYXN0IHZlcnNpb24gaWQKICAgICAgICAkTGFzdFZlcnNpb25JRE11c3QgPSAkVmVyc2lvbkRhdGEtPntWZXJzaW9uSUR9OwoKICAgICAgICAjIGNoZWNrIGFsbCB2ZXJzaW9uIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJXsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9LT5bJENvdW50ZXJdIH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIG5lZWRlZCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIG15ICRWZXJzaW9uQXR0cmlidXRlICAgPSAkVmVyc2lvbkRhdGEtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fS0+WyRDb3VudGVyXS0+eyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFZlcnNpb25BdHRyaWJ1dGUgKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbkF0dHJpYnV0ZSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUmVmZXJlbmNlQXR0cmlidXRlICkgewogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnWE1MRGVmaW5pdGlvbicgfHwgJEF0dHJpYnV0ZSBlcSAnWE1MRGF0YScgKSB7CgogICAgICAgICAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgICAgICAgICAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICAgICAgICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gVmVyc2lvbkdldCgpCiAgICAgICAgICAgICAgICAkVmVyc2lvbkF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRWZXJzaW9uQXR0cmlidXRlKTsKCiAgICAgICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkUmVmZXJlbmNlQXR0cmlidXRlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBhdHRyaWJ1dGVzCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRWZXJzaW9uQXR0cmlidXRlLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25HZXQoKSAtICRBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICAjIHByZXBhcmUgbGFzdCB2ZXJzaW9uIGlkCiAgICBteSAkTGFzdFZlcnNpb25JREFjdHVhbCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICBpZiAoICRDb25maWdJdGVtRGF0YS0+e0xhc3RWZXJzaW9uSUR9ICkgewogICAgICAgICRMYXN0VmVyc2lvbklEQWN0dWFsID0gJENvbmZpZ0l0ZW1EYXRhLT57TGFzdFZlcnNpb25JRH07CiAgICB9CgogICAgIyBjaGVjayBsYXN0IHZlcnNpb24gaWQKICAgICRTZWxmLT5JcygKICAgICAgICAkQ29uZmlnSXRlbURhdGEtPntMYXN0VmVyc2lvbklEfSwKICAgICAgICAkTGFzdFZlcnNpb25JRE11c3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogbGFzdCB2ZXJzaW9uIGlkIGlkZW50aWNhbCIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIGNvbmZpZyBpdGVtIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ29uZmlnSXRlbVNlYXJjaFRlc3RzID0gWwoKICAgICMgc2VhcmNoIEFMTCBjb25maWcgaXRlbXMgaW4gdGhlIHR3byB0ZXN0IGNsYXNzZXMKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG51bWJlciBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbnVtYmVyIHBhcmFtIHdpdGggd2lsZGNhcmRzCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE51bWJlciA9PiAnKicgLiAkQ29uZmlnSXRlbU51bWJlcnNbNTBdIC4gJyonLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBudW1iZXIgcGFyYW0gd2l0aCB3aWxkY2FyZHMgYnV0IHdpdGggZGVhY3RpdmF0ZWQgd2lsZGNhcmQgZmVhdHVyZQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOdW1iZXIgICAgICAgICA9PiAnKicgLiAkQ29uZmlnSXRlbU51bWJlcnNbNTBdIC4gJyonLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgb3JkZXIgYnkgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ0NyZWF0ZUJ5JywKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAyLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNyZWF0ZSBieSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDcmVhdGVCeSA9PiBbICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNyZWF0ZSBieSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFsgJFVzZXJJRHNbMV0sICAgICAgICAgICAgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY2hhbmdlIGJ5IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY2hhbmdlIGJ5IHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWzFdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjaGFuZ2UgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbICRVc2VySURzWzFdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgJFVzZXJJRHNbMl0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgc2VhcmNoIEFMTCBjb25maWcgaXRlbXMgaW4gdGhlIHR3byB0ZXN0IGNsYXNzZXMgdXNpbmcgdGhlIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggYW4gd2lsZGNhcmQKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtICogMScsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtIHdpdGggYW4gd2lsZGNhcmQgYW5kIGEgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gKiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbSB3aXRoIHdpbGRjYXJkcwogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyonLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbSB3aXRoIHdpbGRjYXJkcyBidXQgd2l0aCBkZWFjdGl2YXRlZCB3aWxkY2FyZCBmZWF0dXJlCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyonLAogICAgICAgICAgICBDbGFzc0lEcyAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGFzdCB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIFByZXZpb3VzVmVyc2lvblNlYXJjaCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgICAgICAgICAgPT4gWyAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgICAgICAgID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzICAgICAgICAgID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzICAgICAgICAgID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIGNvbmZpZyBpdGVtIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRDb25maWdJdGVtU2VhcmNoVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU2VhcmNoRGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U2VhcmNoRGF0YX0gfHwgcmVmICRUZXN0LT57U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU2VhcmNoRGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggISRUZXN0LT57RnVuY3Rpb259IHx8IHJlZiAkVGVzdC0+e0Z1bmN0aW9ufSBuZSAnQVJSQVknIHx8ICFAeyAkVGVzdC0+e0Z1bmN0aW9ufSB9ICkgewogICAgICAgICRUZXN0LT57RnVuY3Rpb259ID0gWydDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnXTsKICAgIH0KCiAgICBmb3IgbXkgJEZ1bmN0aW9uICggQHsgJFRlc3QtPntGdW5jdGlvbn0gfSApIHsKCiAgICAgICAgIyBzdGFydCBzZWFyY2gKICAgICAgICBteSAkQ29uZmlnSXRlbUxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT4kRnVuY3Rpb24oCiAgICAgICAgICAgICV7ICRUZXN0LT57U2VhcmNoRGF0YX0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRoZSBjb25maWcgaXRlbSBsaXN0CiAgICAgICAgaWYgKCAkVGVzdC0+e1JlZmVyZW5jZURhdGF9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUxpc3QgJiYgcmVmICRDb25maWdJdGVtTGlzdCBlcSAnQVJSQVknLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJEZ1bmN0aW9uKCkgLSBMaXN0IGlzIGFuIGFycmF5IHJlZmVyZW5jZS4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUIGlmICEkQ29uZmlnSXRlbUxpc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1MaXN0LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJEZ1bmN0aW9uKCkgLSBSZXR1cm4gZmFsc2UuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1MaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgZm91bmRlZCBjb25maWcgaXRlbXMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRDb25maWdJdGVtTGlzdH0sCiAgICAgICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9IH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gY29ycmVjdCBudW1iZXIgb2YgZm91bmRlZCBjb25maWcgaXRlbXMiLAogICAgICAgICk7CgogICAgICAgIG15IEBSZWZlcmVuY2VMaXN0OwogICAgICAgIGZvciBteSAkTnVtYmVyICggQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBmaW5kIGlkIG9mIHRoZSBpdGVtCiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFICIKICAgICAgICAgICAgICAgICAgICAuICJjb25maWdpdGVtX251bWJlciA9ICckTnVtYmVyJyAiCiAgICAgICAgICAgICAgICAgICAgLiAiT1JERVIgQlkgaWQgREVTQyIsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAUmVmZXJlbmNlTGlzdCwgJENvbmZpZ0l0ZW1JRDsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgogICAgICAgICMgZHVtcCB0aGUgbGlzdCBmcm9tIENvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgpCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1TdHJpbmcgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkQ29uZmlnSXRlbUxpc3QpOwoKICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBzdHJpbmcKICAgICAgICBteSAkUmVmZXJlbmNlU3RyaW5nID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAUmVmZXJlbmNlTGlzdCApOwoKICAgICAgICAjIGNoZWNrIGFycmF5cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENvbmZpZ0l0ZW1TdHJpbmcsCiAgICAgICAgICAgICRSZWZlcmVuY2VTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gTGlzdCIsCiAgICAgICAgKTsKICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNsZWFuIHRoZSBzeXN0ZW0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgY3VycmVudCBjbGFzcyBsaXN0CiRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwoKIyBzZXQgdW5pdHRlc3QgY2xhc3NlcyBpbnZhbGlkCklURU1JRDoKZm9yIG15ICRJdGVtSUQgKCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CgogICAgbmV4dCBJVEVNSUQgaWYgJENsYXNzTGlzdC0+eyRJdGVtSUR9ICF+IG17IFxBIFVuaXRUZXN0IH14bXM7CgogICAgIyB1cGRhdGUgaXRlbQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTGlzdC0+eyRJdGVtSUR9LAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwp9CgojIGRlbGV0ZSB0aGUgdGVzdCBjb25maWcgaXRlbXMKZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtSURzKSB7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKfQoKMTsK
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==
IyAtLQojIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0sdiAxLjEzIDIwMDkvMDcvMjAgMjM6MjU6MDMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEzICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBzeXNjb25maWcgb2JqZWN0CiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyByZWJ1aWxkIFpaWiogZmlsZXMKICAgICRTZWxmLT57U3lzQ29uZmlnT2JqZWN0fS0+V3JpdGVEZWZhdWx0KCk7CgogICAgIyBkZWZpbmUgdGhlIFpaWiBmaWxlcwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKCiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIG5leHQgUFJFRklYIGlmICEtZiAkRmlsZTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDb25maWdPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICAkU2VsZi0+e0NTVk9iamVjdH0gICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDU1YtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTdGF0c09iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdHMtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBkZWZpbmUgZmlsZSBwcmVmaXggZm9yIHN0YXRzCiAgICAkU2VsZi0+e0ZpbGVQcmVmaXh9ID0gJ0lUU01TdGF0cyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ29uZmlnSXRlbSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPntTdGF0c09iamVjdH0tPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jb25maWdpdGVtCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLWNvbmZpZ2l0ZW0nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDb25maWdJdGVtIG1hc2sgYWNjZXNzIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJywKICAgICk7CgogICAgIyBpbnN0YWxsIGNvbmZpZyBpdGVtIGRlZmluaXRpb25zCiAgICAkU2VsZi0+X0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucygpOwoKICAgICMgZmlsbHVwIGVtcHR5IGxhc3RfdmVyc2lvbl9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW1fdmVyc2lvbiB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBjdXJfZGVwbF9zdGF0ZV9pZCBvciBjdXJfaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGluc3RhbGwgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbnMKICAgICRTZWxmLT5fQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgbGFzdF92ZXJzaW9uX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBpbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbV92ZXJzaW9uIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUluY2lkZW50QW5kRGVwbG95bWVudFN0YXRlSUQoKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgYWxsIGxpbmtzIHdpdGggY29uZmlnIGl0ZW1zCiAgICAkU2VsZi0+X0xpbmtEZWxldGUoKTsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+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+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwogICAgbXkgJVJldmVyc2VDbGFzc0xpc3QgPSByZXZlcnNlICV7JENsYXNzTGlzdH07CgogICAgQ0xBU1NOQU1FOgogICAgZm9yIG15ICRDbGFzc05hbWUgKCBzb3J0IHsgbGMoJGEpIGNtcCBsYygkYikgfSBrZXlzICVEZWZpbml0aW9uICkgewoKICAgICAgICAjIGNoZWNrIGlmIGNsYXNzIGV4aXN0cwogICAgICAgIG15ICRDbGFzc0lEID0gJFJldmVyc2VDbGFzc0xpc3R7JENsYXNzTmFtZX07CgogICAgICAgIG5leHQgQ0xBU1NOQU1FIGlmICEkQ2xhc3NJRDsKCiAgICAgICAgIyBjaGVjayBpZiBkZWZpbml0aW9uIGFscmVhZHkgZXhpc3RzCiAgICAgICAgbXkgJERlZmluaXRpb25MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkxpc3QoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDTEFTU05BTUUgaWYgIWRlZmluZWQgJERlZmluaXRpb25MaXN0OwogICAgICAgIG5leHQgQ0xBU1NOQU1FIGlmICREZWZpbml0aW9uTGlzdCAmJiByZWYgJERlZmluaXRpb25MaXN0IGVxICdBUlJBWScgJiYgQHskRGVmaW5pdGlvbkxpc3R9OwoKICAgICAgICAjIGFkZCB0aGUgbmV3IGRlZmluaXRpb24KICAgICAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uQWRkKAogICAgICAgICAgICBDbGFzc0lEICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9ueyRDbGFzc05hbWV9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0xpbmtEZWxldGUoKQoKZGVsZXRlIGFsbCBleGlzdGluZyBsaW5rcyB0byBjb25maWcgaXRlbXMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9MaW5rRGVsZXRlKCk7Cgo9Y3V0CgpzdWIgX0xpbmtEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhbGwgY29uZmlnIGl0ZW1zCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2goKTsKCiAgICByZXR1cm4gaWYgISRDb25maWdJdGVtSURzOwogICAgcmV0dXJuIGlmIHJlZiAkQ29uZmlnSXRlbUlEcyBuZSAnQVJSQVknOwoKICAgICMgZGVsZXRlIHRoZSBjb25maWcgaXRlbSBsaW5rcwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRDb25maWdJdGVtSURzfSApIHsKICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlQWxsKAogICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgS2V5ICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGxhc3RfdmVyc2lvbl9pZCBjb2x1bW4gb2YgdGhlIGNvbmZpZ2l0ZW0gdGFibGUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIHdpdGggZW1wdHkgbGFzdF92ZXJzaW9uX2lkCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgIgogICAgICAgICAgICAuICJsYXN0X3ZlcnNpb25faWQgPSAwIE9SIGxhc3RfdmVyc2lvbl9pZCBJUyBOVUxMIiwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBnZXQgdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbV92ZXJzaW9uICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIGNvbmZpZ2l0ZW1faWQgPSAkQ29uZmlnSXRlbUlEIE9SREVSIEJZIGlkIERFU0MiLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRWZXJzaW9uSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFZlcnNpb25JRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJFZlcnNpb25JRDsKCiAgICAgICAgIyB1cGRhdGUgaW5jaV9zdGF0ZV9pZAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgY29uZmlnaXRlbSAiCiAgICAgICAgICAgICAgICAuICJTRVQgbGFzdF92ZXJzaW9uX2lkID0gJFZlcnNpb25JRCAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGluY2lfc3RhdGVfaWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgb3BlcmF0aW9uYWwgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdCB8fCByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRJbmNpU3RhdGVMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgYW55IGl0ZW0gaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIElUU006OkNvcmU6OkluY2lkZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNvcnQgaWRzCiAgICBteSBASW5jaVN0YXRlS2V5TGlzdCA9IHNvcnQga2V5cyAleyRJbmNpU3RhdGVMaXN0fTsKCiAgICAjIHVwZGF0ZSBpbmNpX3N0YXRlX2lkCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIGNvbmZpZ2l0ZW1fdmVyc2lvbiAiCiAgICAgICAgICAgIC4gIlNFVCBpbmNpX3N0YXRlX2lkID0gJEluY2lTdGF0ZUtleUxpc3RbMF0gIgogICAgICAgICAgICAuICJXSEVSRSBpbmNpX3N0YXRlX2lkID0gMCBPUiBpbmNpX3N0YXRlX2lkIElTIE5VTEwiLAogICAgKTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyB3aXRoIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCA9IDAgT1IgY3VyX2RlcGxfc3RhdGVfaWQgSVMgTlVMTCBPUiAiCiAgICAgICAgICAgIC4gImN1cl9pbmNpX3N0YXRlX2lkID0gMCBPUiBjdXJfaW5jaV9zdGF0ZV9pZCBJUyBOVUxMIiwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRMYXN0VmVyc2lvbjsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJExhc3RWZXJzaW9uIG5lICdIQVNIJzsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJExhc3RWZXJzaW9uLT57RGVwbFN0YXRlSUR9OwogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVJRH07CgogICAgICAgICMgY29tcGxldGUgY29uZmlnIGl0ZW0KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUICIKICAgICAgICAgICAgICAgIC4gImN1cl9kZXBsX3N0YXRlX2lkID0gJExhc3RWZXJzaW9uLT57RGVwbFN0YXRlSUR9LCAiCiAgICAgICAgICAgICAgICAuICJjdXJfaW5jaV9zdGF0ZV9pZCA9ICRMYXN0VmVyc2lvbi0+e0luY2lTdGF0ZUlEfSAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTMgJCAkRGF0ZTogMjAwOS8wNy8yMCAyMzoyNTowMyAkCgo9Y3V0Cg==
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
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Inactive
postproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Maintenance
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Pilot
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Planned
preproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Production
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Repair
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Retired
postproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Review
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Test/QA
preproductive
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
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1