ITSMCore
1.1.92
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.2.0 beta2.
Build for OTRS::ITSM 1.2.0 beta1.
The OTRS::ITSM core package.
Das OTRS::ITSM Core Paket.
2.3.x
GeneralCatalog
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . 'ITSMCore';
# 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::' . 'ITSMCore';
# 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::' . 'ITSMCore';
# 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 = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . 'ITSMCore';
# 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."
);
}
}
2008-07-16 11:03:13
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBGcmFtZXdvcmtJVFNNQ29yZS54bWwsdiAxLjI0IDIwMDgvMDcvMTUgMTU6MTc6NTMgdWIgRXhwICQ8L0NWUz4KICAgIDxDVlM+JE9sZElkOiBGcmFtZXdvcmsueG1sLHYgMS4xNzUgMjAwOC8wNi8yOCAxMjo1NDoyMSBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHJvZHVjdE5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBpcyBzaG93biBpbiB0aGUgZnJvbnRlbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkltIFdlYkZyb250ZW5kIGFuZ2V6ZWlndGVyIE5hbWUgZGVyIFNvZnR3YXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk9UUlM6OklUU00gMS4yLjAgQmV0YSAyPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6Vmlld01vZGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZXRlcm1pbmVzIHRoZSB3YXkgdGhlIGxpbmtlZCBvYmplY3RzIGFyZSBkaXNwbGF5ZWQgaW4gZWFjaCB6b29tIG1hc2suPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxlZ3QgZGllIEFuc2ljaHQgZGVyIHZlcmxpbmt0ZW4gT2JqZWt0ZSBpbiBkZW4gamV3ZWlsaWdlbiBab29tLU1hc2tlbiBmZXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IkNvbXBsZXgiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaW1wbGUiPlNpbXBsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29tcGxleCI+Q29tcGxleDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUGFja2FnZTo6UmVwb3NpdG9yeUxpc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5MaXN0IG9mIG9ubGluZSByZXBvc2l0b3JpZXMgKGZvciBleGFtcGxlIHlvdSBhbHNvIGNhbiB1c2Ugb3RoZXIgaW5zdGFsbGF0aW9ucyBhcyByZXBvc2l0b3JpeSBieSB1c2luZyBLZXk9Imh0dHA6Ly9leGFtcGxlLmNvbS9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UHVibGljUmVwb3NpdG9yeSZhbXA7RmlsZT0iIGFuZCBDb250ZW50PSJTb21lIE5hbWUiKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGlzdGUgZGVyIHp1ciBWZXJm/Gd1bmcgc3RlaGVuZGVuIE9ubGluZS1RdWVsbGVuIChlcyBrb2VubmVuIHouIEIuIGF1Y2ggYW5kZXJlIEluc3RhbGxhdGlvbmVuIGFscyBPbmxpbmUtUXVlbGxlbiB2ZXJ3ZW5kZXQgd2VyZGVuIG1pdCBkZXIgVmVyd2VuZHVuZyB2b24gS2V5PSJodHRwOi8vZXhhbXBsZS5jb20vb3Rycy9wdWJsaWMucGw/QWN0aW9uPVB1YmxpY1JlcG9zaXRvcnkmYW1wO0ZpbGU9IiBhbmQgQ29udGVudD0iRWluIE5hbWUiKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpQYWNrYWdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imh0dHA6Ly9mdHAub3Rycy5vcmcvcHViL290cnMvaXRzbS9wYWNrYWdlczEyLyI+Wy0tT1RSUzo6SVRTTSAxLjIgTWFzdGVyLS1dIGh0dHA6Ly9mdHAub3Rycy5vcmcvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29yZS54bWwsdiAxLjE3IDIwMDgvMDcvMDMgMTU6NDc6NDAgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbklUU01DSVBBbGxvY2F0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01DSVBBbGxvY2F0ZSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5JVFNNQ0lQQWxsb2NhdGUgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q3JpdGljYWxpdHkgJmx0Oy0mZ3Q7IEltcGFjdCAmbHQ7LSZndDsgUHJpb3JpdHk8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+Q3JpdGljYWxpdHkgJmx0Oy0mZ3Q7IEltcGFjdCAmbHQ7LSZndDsgUHJpb3JpdHk8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrMzwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDMwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCB0aGUgdHlwZSBvZiBsaW5rIHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpbmNpZGVudCBzdGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBkZW4gTGlua3R5cCBmZXN0LCBkZXIgenVyIEJlcmVjaG51bmcgZGVzIFZvcmZhbGxzdGF0dXMgdmVyd2VuZGV0IHdpcmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkRlcGVuZHNPbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNBbHRlcm5hdGl2ZVRvIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnQWx0ZXJuYXRpdmVUbycuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRlbiBMaW5rdHlwICdBbHRlcm5hdGl2ZVRvJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gZ2VyaWNodGV0ZXIgTGlua3R5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiPkFsdGVybmF0aXZlIHRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXROYW1lIj5BbHRlcm5hdGl2ZSB0bzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNDb25uZWN0ZWRUbyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgJ0Nvbm5lY3RlZFRvJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGVuIExpbmt0eXAgJ0Nvbm5lY3RlZFRvJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gZ2VyaWNodGV0ZXIgTGlua3R5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiPkNvbm5lY3RlZCB0bzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSI+Q29ubmVjdGVkIHRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6VHlwZSMjI0RlcGVuZHNPbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgJ0RlcGVuZHNPbicuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRlbiBMaW5rdHlwICdEZXBlbmRzT24nLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIGRlciBnbGVpY2hlIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiB1bmdlcmljaHRldGVyIExpbmt0eXAuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgdmVyc2NoaWVkZW5lIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSI+RGVwZW5kcyBvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSI+UmVxdWlyZWQgZm9yPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6VHlwZSMjI0luY2x1ZGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnSW5jbHVkZXMnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkZW4gTGlua3R5cCAnSW5jbHVkZXMnLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIGRlciBnbGVpY2hlIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiB1bmdlcmljaHRldGVyIExpbmt0eXAuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgdmVyc2NoaWVkZW5lIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSI+SW5jbHVkZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldE5hbWUiPlBhcnQgb2Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpUeXBlIyMjUmVsZXZhbnRUbyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgJ1JlbGV2YW50VG8nLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkZW4gTGlua3R5cCAnUmVsZXZhbnRUbycuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgZGVyIGdsZWljaGUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIHVuZ2VyaWNodGV0ZXIgTGlua3R5cC4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSB2ZXJzY2hpZWRlbmUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIGdlcmljaHRldGVyIExpbmt0eXAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIj5SZWxldmFudCB0bzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSI+UmVsZXZhbnQgdG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjAwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdBbHRlcm5hdGl2ZVRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnQWx0ZXJuYXRpdmVUbycgbWl0IGFuZGVyZW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+QWx0ZXJuYXRpdmVUbzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ0Nvbm5lY3RlZFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnQ29ubmVjdGVkVG8nIG1pdCBhbmRlcmVuICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkNvbm5lY3RlZFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIwMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgJ0lUU01Db25maWdJdGVtJyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnRGVwZW5kc09uJyBtaXQgYW5kZXJlbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjAzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdJbmNsdWRlcycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZSBtaXQgZGVtIExpbmt0eXAgJ0luY2x1ZGVzJyBtaXQgYW5kZXJlbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5JbmNsdWRlczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGUgbWl0IGRlbSBMaW5rdHlwICdSZWxldmFudFRvJyBtaXQgYW5kZXJlbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIyMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ0FsdGVybmF0aXZlVG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGUgbWl0IGRlbSBMaW5rdHlwICdBbHRlcm5hdGl2ZVRvJyBtaXQgJ1RpY2tldCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIyMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ0RlcGVuZHNPbicgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdJVFNNQ29uZmlnSXRlbSctT2JqZWt0ZSBtaXQgZGVtIExpbmt0eXAgJ0RlcGVuZHNPbicgbWl0ICdUaWNrZXQnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIyMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGUgbWl0IGRlbSBMaW5rdHlwICdSZWxldmFudFRvJyBtaXQgJ1RpY2tldCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI0MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdBbHRlcm5hdGl2ZVRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnQWx0ZXJuYXRpdmVUbycgbWl0ICdTZXJ2aWNlJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI0MSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdEZXBlbmRzT24nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnSVRTTUNvbmZpZ0l0ZW0nLU9iamVrdGUgbWl0IGRlbSBMaW5rdHlwICdEZXBlbmRzT24nIG1pdCAnU2VydmljZSctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI0MiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdSZWxldmFudFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0lUU01Db25maWdJdGVtJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnUmVsZXZhbnRUbycgbWl0ICdTZXJ2aWNlJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNU2VydmljZS54bWwsdiAxLjIgMjAwOC8wNy8wMyAxNToxMDo1NyBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNlcnZpY2UtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLXNlcnZpY2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBTZXJ2aWNlIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNlcnZpY2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+U2VydmljZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZXJ2aWNlLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlcnZpY2U8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5pdHNtX3NlcnZpY2UucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU2VydmljZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlNlcnZpY2U8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMxMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU2VydmljZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5TZXJ2aWNlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU2VydmljZVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TZXJ2aWNlWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZXJ2aWNlIFpvb208L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+U2VydmljZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU2VydmljZVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNlcnZpY2VQcmludCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNlcnZpY2VQcmludC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZXJ2aWNlIFByaW50PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QcmludDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5TZXJ2aWNlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01TTEFab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNMQVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TTEFab29tLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1zZXJ2aWNlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNMQSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNMQTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU0xBUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU0xBUHJpbnQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TTEFQcmludC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tc2VydmljZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TTEEgUHJpbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNMQTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBzZXJ2aWNlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1cvxjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29yZTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNlcnZpY2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj4kRW52eyJJVFNNU2VydmljZUxhc3RTY3JlZW5PdmVydmlldyJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTAwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgcHJpbnQgbGluayBpbiBzZXJ2aWNlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIERydWNrZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU2VydmljZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TZXJ2aWNlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNU2VydmljZVByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNU2VydmljZVByaW50JmFtcDtTZXJ2aWNlSUQ9JFFEYXRheyJTZXJ2aWNlSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj50YXJnZXQ9InByaW50IjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBzZXJ2aWNlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFZlcmtu/HBmZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU2VydmljZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TZXJ2aWNlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50TGlua09iamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdCZhbXA7U291cmNlT2JqZWN0PVNlcnZpY2UmYW1wO1NvdXJjZUtleT0kUURhdGF7IlNlcnZpY2VJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBzbGEgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgWnVy/GNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFNMQS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvcmU8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TTEE6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNMQU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPiRFbnZ7IklUU01TZXJ2aWNlTGFzdFNjcmVlblZpZXcifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TTEE6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTAwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgcHJpbnQgbGluayBpbiBzbGEgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgRHJ1Y2tlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTTEEtQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb3JlPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNU0xBOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TTEFNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01TTEFQcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVNMQVByaW50JmFtcDtTTEFJRD0kUURhdGF7IlNMQUlEIn08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+dGFyZ2V0PSJwcmludCI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBUaWNrZXRJVFNNU2VydmljZS54bWwsdiAxLjEgMjAwOC8wNy8wMiAxMjozOTo1MyBtaCBFeHAgJDwvQ1ZTPgogICAgPENWUz4kT2xkSWQ6IFRpY2tldC54bWwsdiAxLjE4NyAyMDA4LzA2LzI4IDEyOjQ5OjI0IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OlNlcnZpY2UiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aWNrZXQgc2VydmljZS9TTEEgZmVhdHVyZSBpcyBlbmFibGVkLCB5b3UgY2FuIGRlZmluZSB0aWNrZXQgc2VydmljZXMgYW5kIFNMQXMgZm9yIHRpY2tldHMgKGUuIGcuIGVtYWlsLCBkZXNrdG9wLCBuZXR3b3JrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRhcyBUaWNrZXQtU2VydmljZS9TTEEgRmVhdHVlcyBha3RpdmllcnQgaXN0LCBr9m5uZW4gVGlja2V0IFNlcnZpY2VzIHVuZCBTTEFzIHBybyBUaWNrZXQgZ2VzZXR6dCB3ZXJkZW4gKHouIEIuIEVtYWlsLCBBcmJlaXRzcGxhdHosIE5ldHp3ZXJrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNQ29yZS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0lUU01Db3JlLnBtLHYgMS44IDIwMDgvMDcvMDIgMTI6Mjc6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ3JpdGljYWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK8Ojy6Pft7vHyJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwuvo/+3o5Sc7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ8rw6PLo9+3u8fI8LT7C6+j/7ejlPC0+z/Do7vLo8uXyJzsKICAgICRMYW5nLT57J2FsbG9jYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn7u/w5eTl6+XtJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAn0fru8uLl8uXtIPEnOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfC6uv+9+Xt6Cc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9fg8fIg7vInOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfH4OLo8egg7vInOwogICAgJExhbmctPnsnUmVxdWlyZWQgZm9yJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfN5e7h9e7k6Owg5+AnOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR4vrw5+DtIPEnOwogICAgJExhbmctPnsnQWx0ZXJuYXRpdmUgdG8nfSAgICAgICAgICAgICAgICAgICAgICA9ICfA6/Ll8O3g8uji5e0g7eAnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNU2VydmljZS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVNlcnZpY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0lUU01TZXJ2aWNlLnBtLHYgMS4yIDIwMDgvMDcvMDIgMTQ6MTE6MzMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JVFNNU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDdXJyZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ID0gJ8zo7ejs4Ovt7iDi8OXs5SDs5ebk8yDo7fbo5OXt8ujy5Sc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICA9ICfR4vrw5+Dt6CBTTEEg5O7j7uLu8OgnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnzvHt7uLt4CDx6PHy5ezgL0JhY2tFbmQnOwogICAgJExhbmctPnsnRGVtb25zdHJhdGlvbid9ICAgICAgICAgICAgICAgICAgPSAnxOXs7u3x8vDg9uj/JzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgID0gJ9Px6/Pj6CDn4CDq8ODp7egg7+7y8OXh6PLl6+gnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgPSAnyuvo5e3y8ergIPHo8fLl7OAvRnJvbnRFbmQnOwogICAgJExhbmctPnsnSVQgTWFuYWdlbWVudCd9ICAgICAgICAgICAgICAgICAgPSAn0+/w4OLr5e3o5SDt4CDI0ic7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICA9ICfI0iDO7+Xw4Pbo6Cc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gICAgICAgICAgICAgICAgICAgICAgICA9ICfP8O7l6vInOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgPSAnzvL35fLt7vHyJzsKICAgICRMYW5nLT57J1RyYWluaW5nJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ87h8/fl7ejlJzsKICAgICRMYW5nLT57J1VuZGVycGlubmluZyBDb250cmFjdCd9ICAgICAgICAgID0gJ87x7e7i5e0g5O7j7uLu8Cc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICA9ICfE7vHy+u/t7vHyJzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Pw5fjq6Cc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBUaW1lJ30gICAgICAgICAgICAgICAgICA9ICfC8OXs5SDn4CDi+ufx8uDt7uL/4uDt5Sc7CiAgICAkTGFuZy0+eydSZXNvbHV0aW9uIFJhdGUnfSAgICAgICAgICAgICAgICA9ICfC8OXs5SDn4CDw4Ofw5fjg4uDt5Sc7CiAgICAkTGFuZy0+eydSZXNwb25zZSBUaW1lJ30gICAgICAgICAgICAgICAgICA9ICfC8OXs5SDn4CDu8uPu4u7wJzsKICAgICRMYW5nLT57J1RyYW5zYWN0aW9ucyd9ICAgICAgICAgICAgICAgICAgID0gJ9Hk5evq6C/y8ODt5+Dq9ujoJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29yZS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29yZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogY3pfSVRTTUNvcmUucG0sdiAxLjcgMjAwOC8wNy8wMiAxMjoyNzo1NCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01Db3JlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0tyaXRpxI1ub3N0JzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmxpdic7CiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ID0gJ0tyaXRpxI1ub3N0PC0+VmxpdjwtPlByaW9yaXRhJzsKICAgICRMYW5nLT57J2FsbG9jYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVXLEjWVuJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVsZXZhbnRuw60nOwogICAgJExhbmctPnsnSW5jbHVkZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICd6YWhybnV0w6knOwogICAgJExhbmctPnsnUGFydCBvZid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfEjcOhc3QnOwogICAgJExhbmctPnsnRGVwZW5kcyBvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdaYWxlxb7DrSc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBmb3InfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBQb8W+YWRvdmFuw70nOwogICAgJExhbmctPnsnQ29ubmVjdGVkIHRvJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTcG9qZW4gcyc7CiAgICAkTGFuZy0+eydBbHRlcm5hdGl2ZSB0byd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdGVybmF0aXZuw60nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNU2VydmljZS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNU2VydmljZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogY3pfSVRTTVNlcnZpY2UucG0sdiAxLjIgMjAwOC8wNy8wMiAxNDoxMTozMyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01TZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0N1cnJlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTZXJ2aWNlLUFyZWEnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gPSAnTWluaW3DoWxuw60gxI1hcyBtZXppIGluY2lkZW50eSc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICA9ICdQxZlpZHJ1xb5lbsOpIFNMQSBzbWxpdXZ5JzsKICAgICRMYW5nLT57J0JhY2sgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1rDoWtsYWRuw60gc2Now6ltYS9CYWNrRW5kJzsKICAgICRMYW5nLT57J0RlbW9uc3RyYXRpb24nfSAgICAgICAgICAgICAgICAgID0gJ0RlbW9uc3RyYWNlJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgID0gJ1NsdcW+Ynkga29uY292w71jaCB1xb5pdmF0ZWzFryc7CiAgICAkTGFuZy0+eydGcm9udCBFbmQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdaw6FrYXpuaWNrw70gc3lzdMOpbS9Gcm9udEVuZCc7CiAgICAkTGFuZy0+eydJVCBNYW5hZ2VtZW50J30gICAgICAgICAgICAgICAgICA9ICfFmMOtemVuw60gSVQnOwogICAgJExhbmctPnsnSVQgT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgPSAnSVQgT3BlcmFjZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEYWzFocOtJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2pla3QnOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gICAgICAgICAgICAgICAgICAgICAgPSAnWnByYXZvZGFqc3R2w60nOwogICAgJExhbmctPnsnVHJhaW5pbmcnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnxaBrb2xlbsOtJzsKICAgICRMYW5nLT57J1VuZGVycGlubmluZyBDb250cmFjdCd9ICAgICAgICAgID0gJ1rDoWtsYWRuw60gc21sb3V2YSc7CiAgICAkTGFuZy0+eydBdmFpbGFiaWxpdHknfSAgICAgICAgICAgICAgICAgICA9ICdEb3N0dXBub3N0JzsKICAgICRMYW5nLT57J0Vycm9ycyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NoeWJ5JzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhbMWhw60nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgVGltZSd9ICAgICAgICAgICAgICAgICAgPSAnRG9iYSBvYm5vdmVuw60nOwogICAgJExhbmctPnsnUmVzb2x1dGlvbiBSYXRlJ30gICAgICAgICAgICAgICAgPSAnRG9iYSDFmWXFoWVuw60nOwogICAgJExhbmctPnsnUmVzcG9uc2UgVGltZSd9ICAgICAgICAgICAgICAgICAgPSAnRG9iYSBvZHBvdsSbZGknOwogICAgJExhbmctPnsnVHJhbnNhY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgPSAnT2JjaG9keS90cmFuc2FrY2UnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29yZS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvcmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db3JlLnBtLHYgMS4xMiAyMDA4LzA3LzAyIDEyOjI3OjU0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDcml0aWNhbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0tyaXRpa2FsaXTkdCc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1c3dpcmt1bmcnOwogICAgJExhbmctPnsnQ3JpdGljYWxpdHkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHknfSA9ICdLcml0aWthbGl05HQgPC0+IEF1c3dpcmt1bmcgPC0+IFByaW9yaXTkdCc7CiAgICAkTGFuZy0+eydhbGxvY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3p1b3JkbmVuJzsKICAgICRMYW5nLT57J1JlbGV2YW50IHRvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVsZXZhbnQgZvxyJzsKICAgICRMYW5nLT57J0luY2x1ZGVzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVpbmhhbHRldCc7CiAgICAkTGFuZy0+eydQYXJ0IG9mJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlaWwgdm9uJzsKICAgICRMYW5nLT57J0RlcGVuZHMgb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSORuZ3QgYWIgdm9uJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIGZvcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVu9nRpZ3QgZvxyJzsKICAgICRMYW5nLT57J0Nvbm5lY3RlZCB0byd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmVyYnVuZGVuIG1pdCc7CiAgICAkTGFuZy0+eydBbHRlcm5hdGl2ZSB0byd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdGVybmF0aXYgenUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNU2VydmljZS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTVNlcnZpY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01TZXJ2aWNlLnBtLHYgMS4yIDIwMDgvMDcvMDIgMTQ6MTE6MzMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9JVFNNU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgPSAnVm9yZmFsbHNzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgPSAnQWt0dWVsbGVyIFZvcmZhbGxzc3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0FrdHVlbGxlciBTdGF0dXMnOwogICAgJExhbmctPnsnU2VydmljZS1BcmVhJ30gICAgICAgICAgICAgICAgICAgPSAnU2VydmljZS1CZXJlaWNoJzsKICAgICRMYW5nLT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ID0gJ01pbmRlc3R6ZWl0IHp3aXNjaGVuIEluY2lkZW50cyc7CiAgICAkTGFuZy0+eydBc3NvY2lhdGVkIFNMQXMnfSAgICAgICAgICAgICAgICA9ICdadWdlaPZyaWdlIFNMQXMnOwogICAgJExhbmctPnsnQmFjayBFbmQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQmFja2VuZCc7CiAgICAkTGFuZy0+eydEZW1vbnN0cmF0aW9uJ30gICAgICAgICAgICAgICAgICA9ICdEZW1vbnN0cmF0aW9uJzsKICAgICRMYW5nLT57J0VuZCBVc2VyIFNlcnZpY2UnfSAgICAgICAgICAgICAgID0gJ0Fud2VuZGVyLVNlcnZpY2UnOwogICAgJExhbmctPnsnRnJvbnQgRW5kJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRnJvbnRlbmQnOwogICAgJExhbmctPnsnSVQgTWFuYWdlbWVudCd9ICAgICAgICAgICAgICAgICAgPSAnSVQgTWFuYWdlbWVudCc7CiAgICAkTGFuZy0+eydJVCBPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICA9ICdJVCBCZXRyaWViJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydQcm9qZWN0J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9qZWt0JzsKICAgICRMYW5nLT57J1JlcG9ydGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1JlcG9ydGluZyc7CiAgICAkTGFuZy0+eydUcmFpbmluZyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUcmFpbmluZyc7CiAgICAkTGFuZy0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSAgICAgICAgICA9ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnOwogICAgJExhbmctPnsnQXZhaWxhYmlsaXR5J30gICAgICAgICAgICAgICAgICAgPSAnVmVyZvxnYmFya2VpdCc7CiAgICAkTGFuZy0+eydFcnJvcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGZWhsZXInOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFRpbWUnfSAgICAgICAgICAgICAgICAgID0gJ1dpZWRlcmhlcnN0ZWxsdW5nc3plaXQnOwogICAgJExhbmctPnsnUmVzb2x1dGlvbiBSYXRlJ30gICAgICAgICAgICAgICAgPSAnTPZzdW5nc3plaXQnOwogICAgJExhbmctPnsnUmVzcG9uc2UgVGltZSd9ICAgICAgICAgICAgICAgICAgPSAnUmVha3Rpb25zemVpdCc7CiAgICAkTGFuZy0+eydUcmFuc2FjdGlvbnMnfSAgICAgICAgICAgICAgICAgICA9ICdUcmFuc2FrdGlvbmVuJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNJUEFsbG9jYXRlLnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLnBtLHYgMS4xMCAyMDA4LzAzLzA2IDE3OjAyOjI0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01DSVBBbGxvY2F0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQcmlvcml0eU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHktPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NJUEFsbG9jYXRlJyApIHsKCiAgICAgICAgIyBnZXQgb3B0aW9uIGxpc3RzCiAgICAgICAgbXkgJU9iamVjdE9wdGlvbjsKICAgICAgICAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgIG15ICVPcHRpb25Qcmlvcml0eUxpc3QgPSAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9IFwlT3B0aW9uUHJpb3JpdHlMaXN0OwoKICAgICAgICAjIGdldCBhbGwgUHJpb3JpdHlJRHMgb2YgdGhlIG1hdHJpeAogICAgICAgIG15ICRBbGxvY2F0ZURhdGE7CiAgICAgICAgZm9yIG15ICRJbXBhY3RJRCAoIGtleXMgJXsgJE9iamVjdE9wdGlvbntJbXBhY3RMaXN0fSB9ICkgewoKICAgICAgICAgICAgQ1JJVElDQUxJVFlJRDoKICAgICAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eUlEICgga2V5cyAleyAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtIHBhcmFtCiAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAiUHJpb3JpdHlJRCIgLiAkSW1wYWN0SUQgLiAnLScgLiAkQ3JpdGljYWxpdHlJRAogICAgICAgICAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgICAgICAgICBuZXh0IENSSVRJQ0FMSVRZSUQgaWYgISRQcmlvcml0eUlEOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZURhdGEtPnskSW1wYWN0SUR9LT57JENyaXRpY2FsaXR5SUR9ID0gJFByaW9yaXR5SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGFsbG9jYXRpb25zCiAgICAgICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJEFsbG9jYXRlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBvcHRpb24gbGlzdHMKICAgICAgICBteSAlT2JqZWN0T3B0aW9uOwogICAgICAgICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgbXkgJU9wdGlvblByaW9yaXR5TGlzdCA9ICRTZWxmLT57UHJpb3JpdHlPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJE9iamVjdE9wdGlvbntQcmlvcml0eUxpc3R9ID0gXCVPcHRpb25Qcmlvcml0eUxpc3Q7CgogICAgICAgICMgZ2V0IGFsbG9jYXRpb24gZGF0YQogICAgICAgIG15ICRBbGxvY2F0ZURhdGEgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkQWxsb2NhdGVNYXRyaXg7CiAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlswXS0+e0NsYXNzfSA9ICdEZXNjcmlwdGlvbic7CgogICAgICAgICMgZ2VuZXJhdGUgdGFibGUgZGVzY3JpcHRpb24gKEltcGFjdCkKICAgICAgICBteSAkQ291bnRlcjEgPSAxOwogICAgICAgIGZvciBteSAkSW1wYWN0ICgKICAgICAgICAgICAgc29ydCB7ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0tPnskYX0gY21wICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0tPnskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskQ291bnRlcjFdLT5bMF0tPntPYmplY3RUeXBlfSAgID0gJ0ltcGFjdCc7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRDb3VudGVyMV0tPlswXS0+e0ltcGFjdEtleX0gICAgPSAkSW1wYWN0OwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskQ291bnRlcjFdLT5bMF0tPntPYmplY3RPcHRpb259ID0gJE9iamVjdE9wdGlvbntJbXBhY3RMaXN0fXskSW1wYWN0fTsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57Q2xhc3N9ICAgICAgICA9ICdEZXNjcmlwdGlvbic7CiAgICAgICAgICAgICRDb3VudGVyMSsrOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSB0YWJsZSBkZXNjcmlwdGlvbiAoQ3JpdGljYWxpdHkpCiAgICAgICAgbXkgJENvdW50ZXIyID0gMTsKICAgICAgICBmb3IgbXkgJENyaXRpY2FsaXR5ICgKICAgICAgICAgICAgc29ydCB7ICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fS0+eyRhfSBjbXAgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntPYmplY3RUeXBlfSAgICAgPSAnQ3JpdGljYWxpdHknOwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntDcml0aWNhbGl0eUtleX0gPSAkQ3JpdGljYWxpdHk7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e09iamVjdE9wdGlvbn0KICAgICAgICAgICAgICAgID0gJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9eyRDcml0aWNhbGl0eX07CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e0NsYXNzfSA9ICdEZXNjcmlwdGlvbic7CiAgICAgICAgICAgICRDb3VudGVyMisrOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBjb250ZW50CiAgICAgICAgZm9yIG15ICRSb3cgKCAxIC4uICggJENvdW50ZXIxIC0gMSApICkgewogICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoIDEgLi4gKCAkQ291bnRlcjIgLSAxICkgKSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGtleXMKICAgICAgICAgICAgICAgIG15ICRJbXBhY3RLZXkgICAgICA9ICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bMF0tPntJbXBhY3RLZXl9OwogICAgICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5S2V5ID0gJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ29sdW1uXS0+e0NyaXRpY2FsaXR5S2V5fTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBvcHRpb24gc3RyaW5nCiAgICAgICAgICAgICAgICBteSAkT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcgLiAkSW1wYWN0S2V5IC4gJy0nIC4gJENyaXRpY2FsaXR5S2V5LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJE9iamVjdE9wdGlvbntQcmlvcml0eUxpc3R9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RLZXl9eyRDcml0aWNhbGl0eUtleX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0tPntPcHRpb25TdHJnfSA9ICRPcHRpb25TdHJnOwogICAgICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlskQ29sdW1uXS0+e0NsYXNzfSAgICAgID0gJ0NvbnRlbnQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbGxvY2F0aW9uIG1hdHJpeAogICAgICAgIGZvciBteSAkUm93UmVmICggQHskQWxsb2NhdGVNYXRyaXh9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0lQQWxsb2NhdGVSb3cnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRDZWxsICggQHskUm93UmVmfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0lQQWxsb2NhdGVSb3dDb2x1bW4nIC4gJENlbGwtPntDbGFzc30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQ2VsbCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNJUEFsbG9jYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU2VydmljZS5wbSAtIGFkbWluIGZyb250ZW5kIHRvIG1hbmFnZSBzZXJ2aWNlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TZXJ2aWNlLnBtLHYgMS4xIDIwMDgvMDYvMTkgMTQ6NDY6MzAgdWIgRXhwICQKIyAkT2xkSWQ6IEFkbWluU2VydmljZS5wbSx2IDEuMTIgMjAwOC8wNS8wOCAwOTozNjozNiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlcnZpY2UgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlcnZpY2VFZGl0JyApIHsKICAgICAgICBteSAlU2VydmljZURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwogICAgICAgIGlmICggJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gbmUgJ05FVycgKSB7CiAgICAgICAgICAgICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBQYXJlbnRPcHRpb25TdHJnCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1BhcmVudE9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1BhcmVudElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFNlcnZpY2VEYXRhe1BhcmVudElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lICAgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBEaXNhYmxlZEJyYW5jaCA9PiAkU2VydmljZURhdGF7TmFtZX0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGdlbmVyYXRlIFR5cGVPcHRpb25TdHJnCiAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGF7VHlwZU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkVHlwZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlcnZpY2VEYXRhe1R5cGVJRH0sCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIENyaXRpY2FsaXR5T3B0aW9uU3RyZwogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJENyaXRpY2FsaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5SUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICAkU2VydmljZURhdGF7VmFsaWRPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHNlcnZpY2UgZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2VFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVNlcnZpY2VEYXRhLCB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2UnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXJ2aWNlIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXJ2aWNlU2F2ZScgKSB7CiAgICAgICAgbXkgJVNlcnZpY2VEYXRhOwoKICAgICAgICAjIGdldCBwYXJhbXMKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIGZvciAocXcoU2VydmljZUlEIFBhcmVudElEIE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgIGZvciAocXcoU2VydmljZUlEIFBhcmVudElEIE5hbWUgVmFsaWRJRCBDb21tZW50IFR5cGVJRCBDcml0aWNhbGl0eUlEKSkgewojIC0tLQogICAgICAgICAgICAkU2VydmljZURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiJF8iICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9IGVxICdORVcnICkgewogICAgICAgICAgICBteSAkU3VjY2VzcwogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKCAlU2VydmljZURhdGEsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MKICAgICAgICAgICAgICAgID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVVwZGF0ZSggJVNlcnZpY2VEYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LCApOwogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXJ2aWNlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIGVuYWJsZWQgdG8gdXNlIGl0IGhlcmUKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRUZXh0eyJZb3UgbmVlZCB0byBhY3RpdmF0ZSAlcyBmaXJzdCB0byB1c2UgaXQhIiwgIlNlcnZpY2UifScsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5TeXNDb25maWcmU3ViYWN0aW9uPUVkaXQmU3lzQ29uZmlnR3JvdXA9VGlja2V0JlN5c0NvbmZpZ1N1Ykdyb3VwPUNvcmU6OlRpY2tldCNUaWNrZXQ6OlNlcnZpY2UiJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGFkZCBzdWZmaXggZm9yIGNvcnJlY3Qgc29ydGluZwogICAgICAgIGZvciAoIGtleXMgJVNlcnZpY2VMaXN0ICkgewogICAgICAgICAgICAkU2VydmljZUxpc3R7JF99IC49ICc6Oic7CiAgICAgICAgfQogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQgeyAkU2VydmljZUxpc3R7JGF9IGNtcCAkU2VydmljZUxpc3R7JGJ9IH0ga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCAkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnICkgewogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlU2VydmljZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQoICc6OicsICRTZXJ2aWNlRGF0YXtOYW1lfSApOwogICAgICAgICAgICAgICAgcG9wKEBGcmFnbWVudCk7CiAgICAgICAgICAgICAgICBmb3IgKEBGcmFnbWVudCkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvd1NwYWNlJywgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVNlcnZpY2VEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU0xBLnBtIC0gYWRtaW4gZnJvbnRlbmQgdG8gbWFuYWdlIHNsYXMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluU0xBLnBtLHYgMS4zIDIwMDgvMDcvMDIgMTI6MjI6NDQgbWggRXhwICQKIyAkT2xkSWQ6IEFkbWluU0xBLnBtLHYgMS4xNiAyMDA4LzA1LzEwIDEwOjI4OjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblNMQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTTEE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2xhIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTTEFFZGl0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJVNMQURhdGE7CiAgICAgICAgJFNMQURhdGF7U0xBSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU0xBSUQnICk7CgogICAgICAgIGlmICggJFNMQURhdGF7U0xBSUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgc2xhIGRhdGEKICAgICAgICAgICAgJVNMQURhdGEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBRGF0YXtTTEFJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNMQURhdGF7U2VydmljZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFNlcnZpY2VPcHRpb25TdHJnCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTZXJ2aWNlSURzJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNMQURhdGF7U2VydmljZUlEc30gfHwgW10sCiAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZ2VuZXJhdGUgVHlwZU9wdGlvblN0cmcKICAgICAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFR5cGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTTEFEYXRhe1R5cGVJRH0sCiAgICAgICAgKTsKIyAtLS0KCiAgICAgICAgIyBnZW5lcmF0ZSBDYWxlbmRhck9wdGlvblN0cmcKICAgICAgICBteSAlQ2FsZW5kYXJMaXN0OwogICAgICAgIGZvciAoIDEgLi4gMjAgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpbWVWYWNhdGlvbkRheXM6OkNhbGVuZGFyJF8iKSApIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhckxpc3R7JF99ID0gIkNhbGVuZGFyICRfIC0gIgogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICJUaW1lWm9uZTo6Q2FsZW5kYXIiIC4gJF8gLiAiTmFtZSIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU0xBRGF0YXtDYWxlbmRhck9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhbGVuZGFyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTTEFEYXRhe0NhbGVuZGFyfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZ5TGV2ZWxMaXN0ID0gKAogICAgICAgICAgICAxMCA9PiAnMTAlJywKICAgICAgICAgICAgMjAgPT4gJzIwJScsCiAgICAgICAgICAgIDMwID0+ICczMCUnLAogICAgICAgICAgICA0MCA9PiAnNDAlJywKICAgICAgICAgICAgNTAgPT4gJzUwJScsCiAgICAgICAgICAgIDYwID0+ICc2MCUnLAogICAgICAgICAgICA3MCA9PiAnNzAlJywKICAgICAgICAgICAgODAgPT4gJzgwJScsCiAgICAgICAgICAgIDkwID0+ICc5MCUnLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTm90aWZ5TGV2ZWxMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VOb3RpZnknLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7VXBkYXRlTm90aWZ5T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVOb3RpZnlMZXZlbExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVXBkYXRlTm90aWZ5JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTTEFEYXRhe1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNMQURhdGF7U29sdXRpb25Ob3RpZnlPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJU5vdGlmeUxldmVsTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTb2x1dGlvbk5vdGlmeScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU0xBRGF0YXtTb2x1dGlvbk5vdGlmeX0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICAkU0xBRGF0YXtWYWxpZE9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNMQURhdGF7VmFsaWRJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzbGEgZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEFFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNMQScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNsYSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU0xBU2F2ZScgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVTTEFEYXRhOwogICAgICAgIGZvciBteSAkUGFyYW0gKAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIHF3KFNMQUlEIE5hbWUgQ2FsZW5kYXIgRmlyc3RSZXNwb25zZVRpbWUgRmlyc3RSZXNwb25zZU5vdGlmeSBTb2x1dGlvblRpbWUgU29sdXRpb25Ob3RpZnkgVXBkYXRlVGltZSBVcGRhdGVOb3RpZnkgVmFsaWRJRCBDb21tZW50KQogICAgICAgICAgICBxdyhTTEFJRCBOYW1lIENhbGVuZGFyIEZpcnN0UmVzcG9uc2VUaW1lIEZpcnN0UmVzcG9uc2VOb3RpZnkgU29sdXRpb25UaW1lIFNvbHV0aW9uTm90aWZ5IFVwZGF0ZVRpbWUgVXBkYXRlTm90aWZ5IFZhbGlkSUQgQ29tbWVudCBUeXBlSUQgTWluVGltZUJldHdlZW5JbmNpZGVudHMpCiMgLS0tCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTTEFEYXRheyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VydmljZSBpZHMKICAgICAgICBteSBAU2VydmljZUlEcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRHMnICk7CiAgICAgICAgJFNMQURhdGF7U2VydmljZUlEc30gPSBcQFNlcnZpY2VJRHM7CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGlmICggISRTTEFEYXRhe1NMQUlEfSApIHsKCiAgICAgICAgICAgICMgYWRkIGEgbmV3IHNsYQogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBQWRkKAogICAgICAgICAgICAgICAgJVNMQURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBzbGEKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQVVwZGF0ZSgKICAgICAgICAgICAgICAgICVTTEFEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISRTdWNjZXNzOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNsYSBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBlbmFibGVkIHRvIHVzZSBpdCBoZXJlCiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICckVGV4dHsiWW91IG5lZWQgdG8gYWN0aXZhdGUgJXMgZmlyc3QgdG8gdXNlIGl0ISIsICJTZXJ2aWNlIn0nLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ0dyb3VwPVRpY2tldCZTeXNDb25maWdTdWJHcm91cD1Db3JlOjpUaWNrZXQjVGlja2V0OjpTZXJ2aWNlIicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEFMaXN0ID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBTTEFJRDoKICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCB7IGxjICRTTEFMaXN0eyRhfSBjbXAgbGMgJFNMQUxpc3R7JGJ9IH0ga2V5cyAlU0xBTGlzdCApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCB0aGUgc2xhIGRhdGEKICAgICAgICAgICAgbXkgJVNMQURhdGEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCB0aGUgc2VydmljZSBsaXN0CiAgICAgICAgICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKAogICAgICAgICAgICAgICAgc29ydCB7IGxjICRTZXJ2aWNlTGlzdHskYX0gY21wIGxjICRTZXJ2aWNlTGlzdHskYn0gfQogICAgICAgICAgICAgICAgQHsgJFNMQURhdGF7U2VydmljZUlEc30gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9IHx8ICctJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgbGlzdCByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRTZXJ2aWNlTGlzdFswXSB8fCAnLScsCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRTTEFEYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBTTEFJRCBpZiBzY2FsYXIgQFNlcnZpY2VMaXN0IDw9IDE7CgogICAgICAgICAgICAjIHJlbW92ZSB0aGUgZmlyc3Qgc2VydmljZSBpZAogICAgICAgICAgICBzaGlmdCBAU2VydmljZUxpc3Q7CgogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBsaXN0IHJvdwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2UucG0gLSB0aGUgT1RSUzo6SVRTTSBTZXJ2aWNlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZS5wbSx2IDEuMSAyMDA4LzA3LzAyIDE1OjI2OjU2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01TZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIGdldCB0eXBlIGxpc3QKICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCggQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnICk7CgogICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgKTsKCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3IgbXkgJFNlcnZpY2UgKCB2YWx1ZXMgJVNlcnZpY2VMaXN0ICkgewogICAgICAgICRTZXJ2aWNlIC49ICc6Oic7CiAgICB9CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQgeyAkU2VydmljZUxpc3R7JGF9IGNtcCAkU2VydmljZUxpc3R7JGJ9IH0ga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnID8gJ3NlYXJjaGFjdGl2ZScgOiAnc2VhcmNocGFzc2l2ZSc7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICRUeXBlTGlzdC0+eyAkU2VydmljZXtUeXBlSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgICA9PiAkQ3JpdGljYWxpdHlMaXN0LT57ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICAgICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQgJzo6JywgJFNlcnZpY2V7TmFtZX07CiAgICAgICAgICAgIHBvcCBARnJhZ21lbnQ7CgogICAgICAgICAgICBmb3IgKEBGcmFnbWVudCkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJvdyBzcGFjZQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jvd1NwYWNlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICRUeXBlTGlzdC0+eyAkU2VydmljZXtUeXBlSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgICA9PiAkQ3JpdGljYWxpdHlMaXN0LT57ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICAgICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBsYXN0IHNjcmVlbiB2aWV3CiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0lUU01TZXJ2aWNlTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iLAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2VQcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBzZXJ2aWNlIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVByaW50LnBtLHYgMS4xIDIwMDgvMDcvMDIgMTU6NTQ6MDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNlcnZpY2VQcmludDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UERGOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VydmljZUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBTZXJ2aWNlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU2VydmljZXtTZXJ2aWNlSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJTZXJ2aWNlSUQgJFNlcnZpY2VJRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzbGEgbGlzdAogICAgbXkgJVNMQUxpc3QgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxpc3QoCiAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNle1NlcnZpY2VJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgc2VydmljZSB0eXBlIGxpc3QKICAgIG15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgKTsKICAgICRTZXJ2aWNle1R5cGV9ID0gJFNlcnZpY2VUeXBlTGlzdC0+eyAkU2VydmljZXtUeXBlSUR9IH07CgogICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgKTsKICAgICRTZXJ2aWNle0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eUxpc3QtPnsgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNyZWF0ZSBieSkKICAgIG15ICVDcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkU2VydmljZXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZGF0YSAoY2hhbmdlIGJ5KQogICAgbXkgJUNoYW5nZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTZXJ2aWNle0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAlUGFnZTsKICAgICAgICBteSAkVXJsID0gJyAnOwogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwKICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU2VydmljZScpOwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gPSAkU2VydmljZXtOYW1lU2hvcnR9OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3ByaW50ZWQgYnknKSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAnJEVudnsiVGltZSJ9JyApOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJFVybDsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgb3V0cHV0IGdlbmVyYWwgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEdlbmVyYWxJbmZvcygKICAgICAgICAgICAgUGFnZSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBTZXJ2aWNlICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFwlQ3JlYXRlQnksCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFwlQ2hhbmdlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgYXNzb2NpYXRlZCBzbGFzCiAgICAgICAgaWYgKCVTTEFMaXN0KSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXNzb2NpYXRlZFNMQXMoCiAgICAgICAgICAgICAgICBQYWdlICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgICAgIFNMQUxpc3QgPT4gXCVTTEFMaXN0LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgZGV0YWlsZWQgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dERldGFpbGVkSW5mb3MoCiAgICAgICAgICAgIFBhZ2UgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBTZXJ2aWNlID0+IFwlU2VydmljZSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaWxlIG5hbWUKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRTZXJ2aWNle05hbWVTaG9ydH0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICApOwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NlcnZpY2VfJyAuICRGaWxlbmFtZSAuICJfJFktJE0tJERcXyRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9wZGYnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCksCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgaHRtbCBvdXRwdXQKICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSApOwoKICAgICAgICAjIG91dHB1dCBhc3NvY2lhdGVkIHNsYXMKICAgICAgICBpZiAoIGtleXMgJVNMQUxpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gIkFzc29jaWF0ZWRTTEFzIiApOwogICAgICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCBrZXlzICVTTEFMaXN0ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJBc3NvY2lhdGVkU0xBc1JvdyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNMQUxpc3R7JFNMQUlEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2VQcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJENyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENyZWF0ZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTGFzdG5hbWUgID0+ICRDcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTG9naW4gICAgID0+ICRDaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDaGFuZ2VCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5VXNlckxhc3RuYW1lICA9PiAkQ2hhbmdlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICVTZXJ2aWNlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRHZW5lcmFsSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTZXJ2aWNlIENyZWF0ZUJ5IENoYW5nZUJ5KSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbGVmdCB0YWJsZQogICAgbXkgJFRhYmxlTGVmdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZXJ2aWNlfS0+e05hbWVTaG9ydH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXJyZW50IEluY2lkZW50IFN0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZXJ2aWNlfS0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTZXJ2aWNlfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGFzdCBjaGFuZ2VkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17U2VydmljZX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXREZXRhaWxlZEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgU2VydmljZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU2VydmljZScpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyBjcmVhdGUgdGFibGUKICAgIG15ICRUYWJsZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZXJ2aWNlfS0+e05hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVHlwZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NlcnZpY2V9LT57VHlwZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyaXRpY2FsaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U2VydmljZX0tPntDcml0aWNhbGl0eX0gKSwKICAgICAgICB9LAogICAgXTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvd3MgPSBAeyRUYWJsZX07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRUYWJsZS0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntWYWx1ZX07CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEFzc29jaWF0ZWRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgU0xBTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZSBkYXRhCiAgICBmb3IgbXkgJFNMQUlEICggc29ydCBrZXlzICV7ICRQYXJhbXtTTEFMaXN0fSB9ICkgewogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTTEEnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFBhcmFte1NMQUxpc3R9LT57JFNMQUlEfTsKICAgICAgICAkUm93Kys7CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0Fzc29jaWF0ZWQgU0xBcycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2Vab29tLnBtIC0gdGhlIE9UUlM6OklUU00gU2VydmljZSB6b29tIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVpvb20ucG0sdiAxLjIgMjAwOC8wNy8wMiAxNDoxMDowOCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU2VydmljZVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTTEE7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VydmljZUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBTZXJ2aWNlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU2VydmljZXtTZXJ2aWNlSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJTZXJ2aWNlSUQgJFNlcnZpY2VJRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIHR5cGUgbGlzdAogICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICApOwogICAgJFNlcnZpY2V7VHlwZX0gPSAkU2VydmljZVR5cGVMaXN0LT57ICRTZXJ2aWNle1R5cGVJRH0gfTsKCiAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICApOwogICAgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyAkU2VydmljZXtDcml0aWNhbGl0eUlEfSB9OwoKICAgICMgcnVuIGNvbmZpZyBpdGVtIG1lbnUgbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlbGYtPntTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+IFwlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJE91dHB1dEhvcml6b250YWxSdWxlciA9IDA7CgogICAgIyBnZXQgc2xhIGxpc3QKICAgIG15ICVTTEFMaXN0ID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCVTTEFMaXN0KSB7CiAgICAgICAgJE91dHB1dEhvcml6b250YWxSdWxlciA9IDE7CgogICAgICAgICMgZ2V0IHNsYSB0eXBlIGxpc3QKICAgICAgICBteSAkU0xBVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1NMQScgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRTTEFJRCAoIHNvcnQgeyAkU0xBTGlzdHskYX0gY21wICRTTEFMaXN0eyRifSB9IGtleXMgJVNMQUxpc3QgKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgb2JqZWN0CiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICBteSAlU0xBID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFHZXQoCiAgICAgICAgICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVTTEEsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFNMQVR5cGVMaXN0LT57ICRTTEF7VHlwZUlEfSB9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBLZXkgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHRhYmxlIHZpZXcgbW9kZQogICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZScgLiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMTsKICAgIH0KCiAgICAjIG91dHB1dCBob3Jpem9udGFsIHJ1bGVyCiAgICBpZiAoJE91dHB1dEhvcml6b250YWxSdWxlcikgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hvcml6b250YWxSdWxlcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgKTsKCiAgICAjIGdldCBjcmVhdGUgdXNlciBkYXRhCiAgICBteSAlQ3JlYXRlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkU2VydmljZXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFNlcnZpY2V7ICdDcmVhdGUnIC4gJFBvc3RmaXggfSA9ICRDcmVhdGVVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgdXNlciBkYXRhCiAgICBteSAlQ2hhbmdlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkU2VydmljZXtDaGFuZ2VCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFNlcnZpY2V7ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2Vab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZXJ2aWNlLAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVByaW50LnBtIC0gcHJpbnQgbGF5b3V0IGZvciBpdHNtIHNsYSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVByaW50LnBtLHYgMS4xIDIwMDgvMDcvMDIgMTY6MDU6MTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNMQVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NMQU9iamVjdH0gICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNMQUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU0xBSUQiICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTTEFJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gU0xBSUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJFNMQXtTTEFJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNMQUlEICRTTEFJRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBuYW1lCiAgICBpZiAoICRTTEF7Q2FsZW5kYXJ9ICkgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9ICJDYWxlbmRhciAkU0xBe0NhbGVuZGFyfSAtICIKICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkU0xBe0NhbGVuZGFyfSAuICJOYW1lIiApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNMQXtDYWxlbmRhck5hbWV9ID0gJ0NhbGVuZGFyIERlZmF1bHQnOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSAoY3JlYXRlIGJ5KQogICAgbXkgJUNyZWF0ZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNoYW5nZSBieSkKICAgIG15ICVDaGFuZ2VCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkU0xBe0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAlUGFnZTsKICAgICAgICBteSAkVXJsID0gJyAnOwogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwKICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJyk7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSA9ICRTTEF7TmFtZX07CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgncHJpbnRlZCBieScpIC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAkVXJsOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50TmV3KAogICAgICAgICAgICBUaXRsZSAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkU0xBe05hbWV9LAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgZ2VuZXJhbCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0R2VuZXJhbEluZm9zKAogICAgICAgICAgICBQYWdlICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFNMQSAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBDcmVhdGVCeSA9PiBcJUNyZWF0ZUJ5LAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBcJUNoYW5nZUJ5LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGRldGFpbGVkIGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXREZXRhaWxlZEluZm9zKAogICAgICAgICAgICBQYWdlID0+IFwlUGFnZSwKICAgICAgICAgICAgU0xBICA9PiBcJVNMQSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaWxlIG5hbWUKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRTTEF7TmFtZX0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICApOwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NsYV8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkU0xBe05hbWV9ICk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TTEFQcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJENyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENyZWF0ZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTGFzdG5hbWUgID0+ICRDcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTG9naW4gICAgID0+ICRDaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDaGFuZ2VCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5VXNlckxhc3RuYW1lICA9PiAkQ2hhbmdlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dEdlbmVyYWxJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhQYWdlIFNMQSBDcmVhdGVCeSBDaGFuZ2VCeSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57TmFtZX0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTTEF9IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTTEF9IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gNTA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAyMDAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjQUFBQUFBJzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvck9kZH0gICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXREZXRhaWxlZEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgU0xBKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTTEEnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkVGFibGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U0xBfS0+e1R5cGV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDYWxlbmRhcicpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NMQX0tPntDYWxlbmRhck5hbWV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRmlyc3QgUmVzcG9uc2UgVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtTTEF9LT57Rmlyc3RSZXNwb25zZVRpbWV9ICkKICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdVcGRhdGUgVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NMQX0tPntVcGRhdGVUaW1lfSApIC4gJyAnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTb2x1dGlvbiBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U0xBfS0+e1NvbHV0aW9uVGltZX0gKQogICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ21pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMnKQogICAgICAgICAgICAgICAgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJFBhcmFte1NMQX0tPntNaW5UaW1lQmV0d2VlbkluY2lkZW50c30sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnbWludXRlcycpLAogICAgICAgIH0sCiAgICBdOwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93cyA9IEB7JFRhYmxlfTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDEyMDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDM5MTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVpvb20ucG0gLSB0aGUgT1RSUzo6SVRTTSBTTEEgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVpvb20ucG0sdiAxLjIgMjAwOC8wNy8wMiAxNjowNDozNyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU0xBWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU0xBSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTTEFJRCIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNMQUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTTEFJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU0xBe1NMQUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiU0xBSUQgJFNMQUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIG5hbWUKICAgIGlmICggJFNMQXtDYWxlbmRhcn0gKSB7CiAgICAgICAgJFNMQXtDYWxlbmRhck5hbWV9ID0gIkNhbGVuZGFyICRTTEF7Q2FsZW5kYXJ9IC0gIgogICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAiVGltZVpvbmU6OkNhbGVuZGFyIiAuICRTTEF7Q2FsZW5kYXJ9IC4gIk5hbWUiICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU0xBe0NhbGVuZGFyTmFtZX0gPSAnQ2FsZW5kYXIgRGVmYXVsdCc7CiAgICB9CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBTTEFJRCA9PiAkU2VsZi0+e1NMQUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU0xBICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNMQXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFNMQXsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRTTEF7ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNMQVpvb20nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVTTEEgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNU2VydmljZU1lbnVHZW5lcmljLnBtLHYgMS4xIDIwMDgvMDcvMDIgMTM6MTM6MDkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBTZXJ2aWNlT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFNlcnZpY2UhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBncm91cHMKICAgIG15ICRHcm91cHNSbwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwUm99CiAgICAgICAgfHwgW107CiAgICBteSAkR3JvdXBzUncKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cH0KICAgICAgICB8fCBbXTsKCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICRBY2Nlc3MgPSAwOwoKICAgICAgICAjIGZpbmQgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9OwogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IKICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17U2VydmljZX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU0xBTWVudUdlbmVyaWMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01TTEFNZW51R2VuZXJpYy5wbSx2IDEuMSAyMDA4LzA3LzAyIDEzOjEzOjA5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TTEFNZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBTTEFPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U0xBfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTTEEhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBncm91cHMKICAgIG15ICRHcm91cHNSbwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwUm99CiAgICAgICAgfHwgW107CiAgICBteSAkR3JvdXBzUncKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cH0KICAgICAgICB8fCBbXTsKCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICRBY2Nlc3MgPSAwOwoKICAgICAgICAjIGZpbmQgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9OwogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IKICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17U0xBfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0U2VydmljZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdFNlcnZpY2UucG0sdiAxLjQgMjAwOC8wNy8wNyAxMToyNjo1MCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdFNlcnZpY2UgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgbGluayBvYmplY3QgKHNlcnZpY2UpCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RTZXJ2aWNlLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEVuY29kZU9iamVjdCBRdWV1ZU9iamVjdCBHcm91cE9iamVjdCBQYXJhbU9iamVjdCBUaW1lT2JqZWN0IFVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgPT4gJ1NlcnZpY2UnLAogICAgICAgIFJlYWxuYW1lID0+ICdTZXJ2aWNlJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZUNvbXBsZXgoKQoKcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGJsb2NrIGRhdGEKClJldHVybgoKICAgIEBCbG9ja0RhdGEgPSAoCiAgICAgICAgT2JqZWN0ICAgID0+ICdTZXJ2aWNlJywKICAgICAgICBCbG9ja25hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ3JpdGljYWxpdHknLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZWQnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnU2VydmljZSBCbGEnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICA9PiAnQWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tJlNlcnZpY2VJRD0xMjMnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnT3RoZXInLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdIaWdoJywKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGUgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0luY2lTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gMzIxLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdTZXJ2aWNlIEJsYScsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgID0+ICdBY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb20mU2VydmljZUlEPTMyMScsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdPdGhlcicsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0xvdycsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA3LTAyLTAyIDIyOjEyOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgICk7CgogICAgQEJsb2NrRGF0YSA9ICRMaW5rT2JqZWN0LT5UYWJsZUNyZWF0ZUNvbXBsZXgoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlQ29tcGxleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIGxpc3QKICAgIG15ICVMaW5rTGlzdDsKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRTZXJ2aWNlSUR9LT57RGF0YX0gPSAkRGlyZWN0aW9uTGlzdC0+eyRTZXJ2aWNlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QKICAgIG15IEBJdGVtTGlzdDsKICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICBzb3J0IHsgbGMgJExpbmtMaXN0eyRhfXtEYXRhfS0+e05hbWV9IGNtcCBsYyAkTGlua0xpc3R7JGJ9e0RhdGF9LT57TmFtZX0gfQogICAgICAgIGtleXMgJUxpbmtMaXN0CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGV4dHJhY3Qgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJFNlcnZpY2UgPSAkTGlua0xpc3R7JFNlcnZpY2VJRH17RGF0YX07CgogICAgICAgIG15IEBJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnQ3VySW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICRTZXJ2aWNlLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJFNlcnZpY2UtPntDdXJJbmNpU3RhdGVUeXBlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkU2VydmljZS0+e05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICBMaW5rICAgICAgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb20mU2VydmljZUlEPScgLiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICRTZXJ2aWNlLT57VHlwZX0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkU2VydmljZS0+e0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZXJ2aWNlLT57Q2hhbmdlVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBASXRlbUxpc3QsIFxASXRlbUNvbHVtbnM7CiAgICB9CgogICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgIyBkZWZpbmUgdGhlIGJsb2NrIGRhdGEKICAgIG15ICVCbG9jayA9ICgKICAgICAgICBPYmplY3QgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgQmxvY2tuYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgSGVhZGxpbmUgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUeXBlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDcml0aWNhbGl0eScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDE1MCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIEl0ZW1MaXN0ID0+IFxASXRlbUxpc3QsCiAgICApOwoKICAgIHJldHVybiAoIFwlQmxvY2sgKTsKfQoKPWl0ZW0gVGFibGVDcmVhdGVTaW1wbGUoKQoKcmV0dXJuIGEgaGFzaCB3aXRoIHRoZSBsaW5rIG91dHB1dCBkYXRhCgpSZXR1cm4KCiAgICAlTGlua091dHB1dERhdGEgPSAoCiAgICAgICAgTm9ybWFsOjpTb3VyY2UgPT4gewogICAgICAgICAgICBTZXJ2aWNlID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdTOlRoZSBzZXJ2aWNbLi5dJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdTZXJ2aWNlOiBUaGUgc2VydmljZSBuYW1lJywKICAgICAgICAgICAgICAgICAgICBDc3MgICAgID0+ICdzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2giJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnUzpOYW1lIG9mIHNlcnZpY1suLl0nLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NlcnZpY2U6IE5hbWUgb2Ygc2VydmljZSAyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBQYXJlbnRDaGlsZDo6VGFyZ2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnUzpTZXJ2aWNlIG5hbVsuLl0nLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NlcnZpY2U6IFNlcnZpY2UgbmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICRMaW5rT2JqZWN0LT5UYWJsZUNyZWF0ZVNpbXBsZSgKICAgICAgICBPYmplY3RMaW5rTGlzdFdpdGhEYXRhID0+ICRPYmplY3RMaW5rTGlzdFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgVGFibGVDcmVhdGVTaW1wbGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTGlua091dHB1dERhdGE7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsKICAgICAgICAgICAgICAgICAgICBsYyAkRGlyZWN0aW9uTGlzdC0+eyRhfS0+e05hbWVTaG9ydH0gY21wIGxjICREaXJlY3Rpb25MaXN0LT57JGJ9LT57TmFtZVNob3J0fQogICAgICAgICAgICAgICAgfSBrZXlzICV7JERpcmVjdGlvbkxpc3R9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkU2VydmljZSA9ICREaXJlY3Rpb25MaXN0LT57JFNlcnZpY2VJRH07CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAlSXRlbSA9ICgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJTOiRTZXJ2aWNlLT57TmFtZVNob3J0fSIsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAiU2VydmljZTogJFNlcnZpY2UtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgTGluayA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbSZTZXJ2aWNlSUQ9JyAuICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDIwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXCVJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBpdGVtIGxpc3QgdG8gbGluayBvdXRwdXQgZGF0YQogICAgICAgICAgICAkTGlua091dHB1dERhdGF7ICRMaW5rVHlwZSAuICc6OicgLiAkRGlyZWN0aW9uIH0tPntTZXJ2aWNlfSA9IFxASXRlbUxpc3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlTGlua091dHB1dERhdGE7Cn0KCj1pdGVtIENvbnRlbnRTdHJpbmdDcmVhdGUoKQoKcmV0dXJuIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbnRlbnREYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDb250ZW50U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb250ZW50RGF0YX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgQ29udGVudERhdGEhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4dHJhY3QgY29udGVudAogICAgbXkgJENvbnRlbnQgPSAkUGFyYW17Q29udGVudERhdGF9OwoKICAgIHJldHVybiBpZiAkQ29udGVudC0+e1R5cGV9IG5lICdDdXJJbmNpU2lnbmFsJzsKCiAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgIHVua25vd24gICAgID0+ICdncmF5bGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICk7CgogICAgIyBpbnZlc3RpZ2F0ZSBjdXJyZW50IGluY2lkZW50IHNpZ25hbAogICAgJENvbnRlbnQtPntDdXJJbmNpU3RhdGVUeXBlfSB8fD0gJ3Vua25vd24nOwogICAgbXkgJEN1ckluY2lTaWduYWwgPSAkSW5jaVNpZ25hbHN7ICRDb250ZW50LT57Q3VySW5jaVN0YXRlVHlwZX0gfTsKICAgICRDdXJJbmNpU2lnbmFsIHx8PSAkSW5jaVNpZ25hbHN7dW5rbm93bn07CgogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlID0+ICc8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgJwogICAgICAgICAgICAuICd0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRDdXJJbmNpU2lnbmFsLAogICAgICAgICAgICBDdXJJbmNpU3RhdGUgPT4gJENvbnRlbnQtPntDb250ZW50fSB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VsZWN0YWJsZU9iamVjdExpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWxlY3RhYmxlIG9iamVjdHMKClJldHVybgoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgVmFsdWUgPT4gJ1NlcnZpY2UnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICRMaW5rT2JqZWN0LT5TZWxlY3RhYmxlT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZCA9PiAkSWRlbnRpZmllciwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWxlY3RhYmxlT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxlY3RlZDsKICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSAmJiAkUGFyYW17U2VsZWN0ZWR9IGVxICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9ICkgewogICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICB9CgogICAgIyBvYmplY3Qgc2VsZWN0IGxpc3QKICAgIG15IEBPYmplY3RTZWxlY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICRTZWxlY3RlZCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQE9iamVjdFNlbGVjdExpc3Q7Cn0KCj1pdGVtIFNlYXJjaE9wdGlvbkxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWFyY2ggb3B0aW9ucwoKUmV0dXJuCgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KCk7Cgo9Y3V0CgpzdWIgU2VhcmNoT3B0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2VhcmNoIG9wdGlvbiBsaXN0CiAgICBteSBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9ybWtleQogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CiAgICAgICAgJFJvdy0+e0Zvcm1LZXl9ID0gJ1NFQVJDSDo6JyAuICRSb3ctPntLZXl9OwogICAgfQoKICAgICMgYWRkIGZvcm0gZGF0YSBhbmQgaW5wdXQgc3RyaW5nCiAgICBST1c6CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKCiAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgJFJvdy0+e0Zvcm1EYXRhfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CgogICAgICAgICMgcGFyc2UgdGhlIGlucHV0IHRleHQgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbnB1dFRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUm93LT57Rm9ybURhdGF9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBpbnB1dCBzdHJpbmcKICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xpbmtPYmplY3QnLAogICAgICAgICk7CgogICAgICAgIG5leHQgUk9XOwogICAgfQoKICAgIHJldHVybiBAU2VhcmNoT3B0aW9uTGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDgvMDcvMDcgMTE6MjY6NTAgJAoKPWN1dAo=
IyAtLQojIEFkbWluSVRTTUNJUEFsbG9jYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JVFNNQ0lQQWxsb2NhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLmR0bCx2IDEuMyAyMDA4LzAxLzI4IDE1OjA0OjMwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ3JpdGljYWxpdHkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHkifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNJUEFsbG9jYXRlIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgJFRleHR7IlByaW9yaXR5In0gJFRleHR7ImFsbG9jYXRlIn06CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOkNJUEFsbG9jYXRlUm93Q29sdW1uRGVzY3JpcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4kVGV4dHsiJFFEYXRheyJPYmplY3RUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyIkUURhdGF7Ik9iamVjdE9wdGlvbiJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpDSVBBbGxvY2F0ZVJvd0NvbHVtbkRlc2NyaXB0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpDSVBBbGxvY2F0ZVJvd0NvbHVtbkNvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0iY2VudGVyIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5Db250ZW50IC0tPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFkbWluU2VydmljZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU2VydmljZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TZXJ2aWNlLmR0bCx2IDEuMSAyMDA4LzA2LzE5IDE0OjQ2OjMwIHViIEV4cCAkCiMgJE9sZElkOiBBZG1pblNlcnZpY2UuZHRsLHYgMS41IDIwMDgvMDQvMDIgMDg6NTk6MjIgb3QgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VydmljZSBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VydmljZUVkaXQiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXJ2aWNlSUQiIHZhbHVlPSJORVciLz4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kVGV4dHsiQWRkIGEgbmV3IFNlcnZpY2UuIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvd1NwYWNlIC0tPgogICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlcnZpY2VFZGl0JlNlcnZpY2VJRD0kUURhdGF7IlNlcnZpY2VJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlRWRpdCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VydmljZVNhdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXJ2aWNlSUQiIHZhbHVlPSIkUURhdGF7IlNlcnZpY2VJRCJ9Ii8+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZVNob3J0In0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViLVNlcnZpY2Ugb2YifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQYXJlbnRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3JpdGljYWxpdHlPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIxNTAiLz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIvPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2VFZGl0IC0tPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEFkbWluU0xBLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5TTEEKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluU0xBLmR0bCx2IDEuMiAyMDA4LzA3LzAyIDEyOjIyOjA3IG1oIEV4cCAkCiMgJE9sZElkOiBBZG1pblNMQS5kdGwsdiAxLjEwIDIwMDgvMDQvMDIgMDg6NTk6MjIgb3QgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU0xBIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTTEFFZGl0Ii8+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWRkIFNMQSJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kVGV4dHsiQWRkIGEgbmV3IFNMQS4ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNDAlIj4kVGV4dHsiU0xBIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDaGFuZ2VkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNMQUVkaXQmU0xBSUQ9JFFEYXRheyJTTEFJRCJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiU2VydmljZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJWYWxpZCJ9In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgo8IS0tIGR0bDpibG9jazpTTEFFZGl0IC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTTEFTYXZlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU0xBSUQiIHZhbHVlPSIkUURhdGF7IlNMQUlEIn0iLz4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJFZGl0In06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDYWxlbmRhck9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJFc2NhbGF0aW9uIC0gRmlyc3QgUmVzcG9uc2UgVGltZSJ9OgogICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IjAgPSBubyBlc2NhbGF0aW9uIn0gLSAyNCAkVGV4dHsiaG91cnMifSA9IDE0NDAgJFRleHR7Im1pbnV0ZXMifSAtICRUZXh0eyJPbmx5IGJ1c2luZXNzIGhvdXJzIGFyZSBjb3VudGVkLiJ9KTwvaT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGaXJzdFJlc3BvbnNlVGltZSIgdmFsdWU9IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWUifSIgc2l6ZT0iOCIgbWF4bGVuZ3RoPSIxMCIvPiAkVGV4dHsibWludXRlcyJ9ICggJFRleHR7Ik5vdGlmeSBieSJ9ICAkRGF0YXsiRmlyc3RSZXNwb25zZU5vdGlmeU9wdGlvblN0cmcifSApCiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJFc2NhbGF0aW9uIC0gVXBkYXRlIFRpbWUifQogICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IjAgPSBubyBlc2NhbGF0aW9uIn0gLSAyNCAkVGV4dHsiaG91cnMifSA9IDE0NDAgJFRleHR7Im1pbnV0ZXMifSAtICRUZXh0eyJPbmx5IGJ1c2luZXNzIGhvdXJzIGFyZSBjb3VudGVkLiJ9KTwvaT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJVcGRhdGVUaW1lIiB2YWx1ZT0iJFFEYXRheyJVcGRhdGVUaW1lIn0iIHNpemU9IjgiIG1heGxlbmd0aD0iMTAiLz4gJFRleHR7Im1pbnV0ZXMifSAoICRUZXh0eyJOb3RpZnkgYnkifSAgJERhdGF7IlVwZGF0ZU5vdGlmeU9wdGlvblN0cmcifSApCiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJFc2NhbGF0aW9uIC0gU29sdXRpb24gVGltZSJ9CiAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiMCA9IG5vIGVzY2FsYXRpb24ifSAtIDI0ICRUZXh0eyJob3VycyJ9ID0gMTQ0MCAkVGV4dHsibWludXRlcyJ9IC0gJFRleHR7Ik9ubHkgYnVzaW5lc3MgaG91cnMgYXJlIGNvdW50ZWQuIn0pPC9pPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlNvbHV0aW9uVGltZSIgdmFsdWU9IiRRRGF0YXsiU29sdXRpb25UaW1lIn0iIHNpemU9IjgiIG1heGxlbmd0aD0iMTAiLz4gJFRleHR7Im1pbnV0ZXMifSAoICRUZXh0eyJOb3RpZnkgYnkifSAgJERhdGF7IlNvbHV0aW9uTm90aWZ5T3B0aW9uU3RyZyJ9ICkKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMifSAoJFRleHR7Im1pbnV0ZXMifSk6IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTWluVGltZUJldHdlZW5JbmNpZGVudHMiIHZhbHVlPSIkUURhdGF7Ik1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzIn0iIHNpemU9IjEwIiBtYXhsZW5ndGg9IjE1Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNjAiIG1heGxlbmd0aD0iMTUwIi8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpTTEFFZGl0IC0tPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEFnZW50SVRTTVNlcnZpY2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TZXJ2aWNlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TZXJ2aWNlLmR0bCx2IDEuMiAyMDA4LzA3LzAzIDE0OjMyOjU2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJTZXJ2aWNlIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiQ3VySW5jaVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJJbmNpU3RhdGUifSJ9In0iIGFsdD0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0ifSI+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1Jvd1NwYWNlIC0tPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3dTcGFjZSAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbSZTZXJ2aWNlSUQ9JFFEYXRheyJTZXJ2aWNlSUQifSI+CiAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEFnZW50SVRTTVNlcnZpY2VQcmludC5kdGwgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2VQcmludC5kdGwsdiAxLjEgMjAwOC8wNy8wMiAxNTo1NDowNiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kVGV4dHsiU2VydmljZSJ9PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgJFRleHR7IlNlcnZpY2UtSW5mbyJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCUiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iNDAlIj4kUURhdGF7Ik5hbWVTaG9ydCJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzMCUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDcmVhdGVCeVVzZXJMb2dpbiJ9ICgkUURhdGF7IkNyZWF0ZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ3JlYXRlQnlVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNoYW5nZUJ5VXNlckxvZ2luIn0gKCRRRGF0YXsiQ2hhbmdlQnlVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDaGFuZ2VCeVVzZXJMYXN0bmFtZSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpBc3NvY2lhdGVkU0xBcyAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAkVGV4dHsiQXNzb2NpYXRlZCBTTEFzIn06CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpBc3NvY2lhdGVkU0xBc1JvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBc3NvY2lhdGVkU0xBc1JvdyAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6QXNzb2NpYXRlZFNMQXMgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+
IyAtLQojIEFnZW50SVRTTVNlcnZpY2Vab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNU2VydmljZVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2Vab29tLmR0bCx2IDEuMyAyMDA4LzA3LzAyIDE1OjUxOjMwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiWm9vbSJ9OiAkVGV4dHsiU2VydmljZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpIb3Jpem9udGFsUnVsZXIgLS0+CiAgICAgIDxociBzaXplPSIyIj4KPCEtLSBkdGw6YmxvY2s6SG9yaXpvbnRhbFJ1bGVyIC0tPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9Ijk4JSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4KICAgICAgICAgICAgICAgICAgPGI+PGk+JFRleHR7IkFzc29jaWF0ZWQgU0xBcyJ9PC9pPjwvYj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNoYW5nZWQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBUm93IC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNU0xBWm9vbSZTTEFJRD0kUURhdGF7IlNMQUlEIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiB3aWR0aD0iMTUwIj4kVGltZUxvbmd7IiRRRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQVJvdyAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iOTglIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUifTogPC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0iLCIyNSJ9Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn0kUURhdGF7IkN1ckluY2lTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICAgICREYXRheyJMaW5rVGFibGVTdHJnIn0KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVNMQVByaW50LmR0bCAtIHByb3ZpZGVzIEhUTUwgcHJpbnQgdmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU0xBUHJpbnQuZHRsLHYgMS4xIDIwMDgvMDcvMDIgMTY6MDU6MTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFRleHR7IlNMQSJ9PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgJFRleHR7IlNMQS1JbmZvIn06CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjMwJSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjMwJSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNyZWF0ZUJ5VXNlckxvZ2luIn0gKCRRRGF0YXsiQ3JlYXRlQnlVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDcmVhdGVCeVVzZXJMYXN0bmFtZSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2hhbmdlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDaGFuZ2VCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNoYW5nZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudHZhbHVlIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IkNhbGVuZGFyTmFtZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZSJ9ICRUZXh0eyJtaW51dGVzIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVXBkYXRlIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVXBkYXRlVGltZSJ9ICRUZXh0eyJtaW51dGVzIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJTb2x1dGlvblRpbWUifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik1pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJNaW5UaW1lQmV0d2VlbkluY2lkZW50cyJ9ICRUZXh0eyJtaW51dGVzIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+
IyAtLQojIEFnZW50SVRTTVNMQVpvb20uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TTEFab29tCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TTEFab29tLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE1OjUwOjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiWm9vbSJ9OiAkVGV4dHsiU0xBIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYWxlbmRhciJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IkNhbGVuZGFyTmFtZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWUifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlVwZGF0ZSBUaW1lIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJVcGRhdGVUaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJTb2x1dGlvblRpbWUifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik1pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTWluVGltZUJldHdlZW5JbmNpZGVudHMifSAkVGV4dHsibWludXRlcyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9TZXJ2aWNlLnBtIC0gdG8gbGluayBzZXJ2aWNlIG9iamVjdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNlcnZpY2UucG0sdiAxLjMgMjAwOC8wNy8wNyAxMToyNjo1MCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpTZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBMaW5rT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBMaW5rTGlzdFdpdGhEYXRhKCkKCmZpbGwgdXAgdGhlIGxpbmsgbGlzdCB3aXRoIGRhdGEKCiAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0QmFja2VuZC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBMaW5rTGlzdCA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfSApIHsKCiAgICAgICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgc2VydmljZSBjYW4gbm90IGdldAogICAgICAgICAgICAgICAgaWYgKCAhJVNlcnZpY2VEYXRhICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBTRVJWSUNFSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JFNlcnZpY2VJRH0gPSBcJVNlcnZpY2VEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiU2VydmljZTogU2VydmljZU5hbWUiLAogICAgICAgIExvbmcgICA9PiAiU2VydmljZTogUGFyZW50U2VydmljZTo6U2VydmljZU5hbWUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ1NlcnZpY2UnLAogICAgICAgIExvbmcgICA9PiAnU2VydmljZScsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISVTZXJ2aWNlOwoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICJTZXJ2aWNlICckU2VydmljZXtOYW1lU2hvcnR9JyIsCiAgICAgICAgTG9uZyAgID0+ICJTZXJ2aWNlICckU2VydmljZXtOYW1lfSciLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgYWRkIHdpbGRjYXJkcwogICAgbXkgJVNlYXJjaDsKICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntOYW1lfSApIHsKICAgICAgICAkU2VhcmNoe05hbWV9ID0gJyonIC4gJFBhcmFte1NlYXJjaFBhcmFtc30tPntOYW1lfSAuICcqJzsKICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgc2VydmljZXMKICAgIG15IEBTZXJ2aWNlSURzID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVNlYXJjaCgKICAgICAgICAleyAkUGFyYW17U2VhcmNoUGFyYW1zfSB9LAogICAgICAgICVTZWFyY2gsCiAgICAgICAgTGltaXQgID0+IDEwMCwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVTZWFyY2hMaXN0OwogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlSURzKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgISVTZXJ2aWNlRGF0YTsKCiAgICAgICAgIyBhZGQgc2VydmljZSBkYXRhCiAgICAgICAgJFNlYXJjaExpc3R7Tk9UTElOS0VEfS0+e1NvdXJjZX0tPnskU2VydmljZUlEfSA9IFwlU2VydmljZURhdGE7CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoTGlzdDsKfQoKPWl0ZW0gTGlua0FkZFByZSgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZFBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUHJlKCkKCmxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVByZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQb3N0KCkKCmxpbmsgZGVsZXRlIHBvc3QgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNJUEFsbG9jYXRlLnBtIC0gYWxsIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24gZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ0lQQWxsb2NhdGUucG0sdiAxLjExIDIwMDgvMDYvMjQgMTA6NTY6MTkgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNJUEFsbG9jYXRlIC0gY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENJUEFsbG9jYXRlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNJUEFsbG9jYXRlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWxsb2NhdGVMaXN0KCkKCnJldHVybiBhIDJkIGhhc2ggcmVmZXJlbmNlIG9mIGFsbG9jYXRpb25zCgogICAgbXkgJExpc3RSZWYgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWxsb2NhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjcml0aWNhbGl0eV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCBGUk9NIGNpcF9hbGxvY2F0ZScsCiAgICApOwoKICAgICMgcmVzdWx0IGxpc3QKICAgIG15ICVBbGxvY2F0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbGxvY2F0ZURhdGF7ICRSb3dbMV0gfXsgJFJvd1swXSB9ID0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gXCVBbGxvY2F0ZURhdGE7Cn0KCj1pdGVtIEFsbG9jYXRlVXBkYXRlKCkKCnVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBvZiBjcml0aWNhbGl0eSwgaW1wYWN0IGFuZCBwcmlvcml0eQoKICAgIG15ICRUcnVlID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJERhdGFSZWYsICAjIDJEIGhhc2ggcmVmZXJlbmNlCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFsbG9jYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEFsbG9jYXRlRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBhbGxvY2F0ZSBkYXRhIGlzIGEgaGFzaCByZWZlcmVuY2UKICAgIGlmICggcmVmICRQYXJhbXtBbGxvY2F0ZURhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FsbG9jYXRlRGF0YSBtdXN0IGJlIGEgMkQgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFsbG9jYXRlIGRhdGEgaXMgYSAyRCBoYXNoIHJlZmVyZW5jZQogICAgSU1QQUNUSUQ6CiAgICBmb3IgbXkgJEltcGFjdElEICgga2V5cyAleyAkUGFyYW17QWxsb2NhdGVEYXRhfSB9ICkgewoKICAgICAgICBuZXh0IElNUEFDVElEIGlmIHJlZiAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0gZXEgJ0hBU0gnOwoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FsbG9jYXRlRGF0YSBtdXN0IGJlIGEgMkQgaGFzaCByZWZlcmVuY2UhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIG9sZCBhbGxvY2F0aW9ucwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJ0RFTEVURSBGUk9NIGNpcF9hbGxvY2F0ZScgKTsKCiAgICAjIGluc2VydCBuZXcgYWxsb2NhdGlvbnMKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9IH0gKSB7CgogICAgICAgIGZvciBteSAkQ3JpdGljYWxpdHlJRCAoIGtleXMgJXsgJFBhcmFte0FsbG9jYXRlRGF0YX0tPnskSW1wYWN0SUR9IH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgcHJpb3JpdHkKICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH07CgogICAgICAgICAgICAjIGluc2VydCBuZXcgYWxsb2NhdGlvbgogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNpcF9hbGxvY2F0ZSAnCiAgICAgICAgICAgICAgICAgICAgLiAnKGNyaXRpY2FsaXR5X2lkLCBpbXBhY3RfaWQsIHByaW9yaXR5X2lkLCAnCiAgICAgICAgICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgICAgICAgICAuICcoPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgICAgICBcJENyaXRpY2FsaXR5SUQsIFwkSW1wYWN0SUQsIFwkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQcmlvcml0eUFsbG9jYXRpb25HZXQoKQoKcmV0dXJuIHRoZSBwcmlvcml0eSBpZCBvZiBhIGNyaXRpY2FsaXR5IGFuZCBhbiBpbXBhY3QKCiAgICBteSAkUHJpb3JpdHlJRCA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMzIxLAogICAgICAgIEltcGFjdElEICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBQcmlvcml0eUFsbG9jYXRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3JpdGljYWxpdHlJRCBJbXBhY3RJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eSBpZCBmcm9tIGRiCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBwcmlvcml0eV9pZCBGUk9NIGNpcF9hbGxvY2F0ZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNyaXRpY2FsaXR5X2lkID0gPyBBTkQgaW1wYWN0X2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3JpdGljYWxpdHlJRH0sIFwkUGFyYW17SW1wYWN0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCByZXN1bHQKICAgIG15ICRQcmlvcml0eUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUHJpb3JpdHlJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRQcmlvcml0eUlEOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDgvMDYvMjQgMTA6NTY6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZS5wbSAtIGFsbCBzZXJ2aWNlIGZ1bmN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTZXJ2aWNlLnBtLHYgMS40IDIwMDgvMDcvMDUgMTg6MDE6MzUgbWggRXhwICQKIyAkT2xkSWQ6IFNlcnZpY2UucG0sdiAxLjI4IDIwMDgvMDYvMTggMTA6MTU6MjAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiMgLS0tCgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UgLSBzZXJ2aWNlIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc2VydmljZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU2VydmljZUxpc3QoKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHNlcnZpY2VzCgogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLCAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVXNlcklEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQgRlJPTSBzZXJ2aWNlJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VydmljZUxpc3Q7CiAgICBteSAlU2VydmljZVZhbGlkTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VMaXN0eyAkUm93WzBdIH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VWYWxpZExpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgcmV0dXJuICVTZXJ2aWNlTGlzdCBpZiAhJFBhcmFte1ZhbGlkfTsKCiAgICAjIGdldCB2YWxpZCBpZHMKICAgIG15IEBWYWxpZElEcyA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpOwoKICAgICMgZHVwbGljYXRlIHNlcnZpY2UgbGlzdAogICAgbXkgJVNlcnZpY2VMaXN0VG1wID0gJVNlcnZpY2VMaXN0OwoKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VMaXN0VG1wICkgewogICAgICAgICRTZXJ2aWNlTGlzdFRtcHskU2VydmljZUlEfSAuPSAnOjonOwogICAgfQoKICAgIG15ICVTZXJ2aWNlSW52YWxpZExpc3Q7CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQgeyAkU2VydmljZUxpc3RUbXB7JGF9IGNtcCAkU2VydmljZUxpc3RUbXB7JGJ9IH0ga2V5cyAlU2VydmljZUxpc3RUbXAgKQogICAgewoKICAgICAgICBteSAkSW52YWxpZCA9IDE7CiAgICAgICAgZm9yIG15ICRWYWxpZElEIChAVmFsaWRJRHMpIHsKICAgICAgICAgICAgaWYgKCAkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSBlcSAkVmFsaWRJRCApIHsKICAgICAgICAgICAgICAgICRJbnZhbGlkID0gMDsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICAgICAkU2VydmljZUludmFsaWRMaXN0eyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSA9IDE7CiAgICAgICAgICAgIGRlbGV0ZSggJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGludmFsaWQgc2VydmljZXMgYW4gY2hpbGRzCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VMaXN0ICkgewogICAgICAgIGZvciBteSAkSW52YWxpZE5hbWUgKCBrZXlzICVTZXJ2aWNlSW52YWxpZExpc3QgKSB7CgogICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSAkSW52YWxpZE5hbWUgOjogfXhtcyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlU2VydmljZUxpc3Q7Cn0KCj1pdGVtIFNlcnZpY2VHZXQoKQoKcmV0dXJuIGEgc2VydmljZSBhcyBoYXNoCgpSZXR1cm4KICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9CiAgICAkU2VydmljZURhdGF7UGFyZW50SUR9CiAgICAkU2VydmljZURhdGF7TmFtZX0KICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9CiAgICAkU2VydmljZURhdGF7VmFsaWRJRH0KICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fQogICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9CiAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VydmljZURhdGF7VHlwZUlEfQogICAgJFNlcnZpY2VEYXRhe1R5cGV9CiAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0KICAgICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eX0KICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0KICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGV9CiAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0KIyAtLS0KCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBmcm9tIGRiCiAgICBteSAlU2VydmljZURhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgLiAiLCB0eXBlX2lkLCBjcml0aWNhbGl0eV9pZCAiCiMgLS0tCiAgICAgICAgICAgIC4gJ0ZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICRTZXJ2aWNlRGF0YXtUeXBlSUR9ICAgICAgICA9ICRSb3dbOF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5SUR9ID0gJFJvd1s5XTsKIyAtLS0KICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UKICAgIGlmICggISRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBTZXJ2aWNlSUQgKCRQYXJhbXtTZXJ2aWNlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNob3J0IG5hbWUgYW5kIHBhcmVudGlkCiAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgIGlmICggJFNlcnZpY2VEYXRhe05hbWV9ID1+IC9eKC4qKTo6KC4rPykkLyApIHsKICAgICAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICQyOwoKICAgICAgICAjIGxvb2t1cCBwYXJlbnQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoIE5hbWUgPT4gJDEsICk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1BhcmVudElEfSA9ICRTZXJ2aWNlSUQ7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBXT1JLQVJPVU5EOiBzZXQgZW1wdHkgdHlwZV9pZCBpbiB0aGUgc2VydmljZSB0YWJsZQogICAgaWYgKCAhJFNlcnZpY2VEYXRhe1R5cGVJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgdHlwZSBsaXN0CiAgICAgICAgbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgaGFuZGxpbmcKICAgICAgICBpZiAoICEleyRTZXJ2aWNlVHlwZUxpc3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZmluZCBhbnkgaXRlbSBpbiBnZW5lcmFsIGNhdGFsb2cgY2xhc3MgSVRTTTo6U2VydmljZTo6VHlwZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSBAU2VydmljZVR5cGVLZXlMaXN0ID0gc29ydCBrZXlzICV7JFNlcnZpY2VUeXBlTGlzdH07CgogICAgICAgICMgdXBkYXRlIHR5cGVfaWQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHNlcnZpY2UgIgogICAgICAgICAgICAgICAgLiAiU0VUIHR5cGVfaWQgPSAkU2VydmljZVR5cGVLZXlMaXN0WzBdICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIHR5cGVfaWQgPSAwIE9SIHR5cGVfaWQgSVMgTlVMTCIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlcnZpY2VEYXRhe1R5cGVJRH0gPSAkU2VydmljZVR5cGVLZXlMaXN0WzBdOwogICAgfQoKICAgICMgV09SS0FST1VORDogc2V0IGVtcHR5IGNyaXRpY2FsaXR5X2lkIGluIHRoZSBzZXJ2aWNlIHRhYmxlCiAgICBpZiAoICEkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0gKSB7CgogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgaGFuZGxpbmcKICAgICAgICBpZiAoICEleyRDcml0aWNhbGl0eUxpc3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZmluZCBhbnkgaXRlbSBpbiBnZW5lcmFsIGNhdGFsb2cgY2xhc3MgSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHkhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgQENyaXRpY2FsaXR5S2V5TGlzdCA9IHNvcnQga2V5cyAleyRDcml0aWNhbGl0eUxpc3R9OwoKICAgICAgICAjIHVwZGF0ZSBjcml0aWNhbGl0eV9pZAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc2VydmljZSAiCiAgICAgICAgICAgICAgICAuICJTRVQgY3JpdGljYWxpdHlfaWQgPSAkQ3JpdGljYWxpdHlLZXlMaXN0WzBdICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIGNyaXRpY2FsaXR5X2lkID0gMCBPUiBjcml0aWNhbGl0eV9pZCBJUyBOVUxMIiwKICAgICAgICApOwoKICAgICAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0gPSAkQ3JpdGljYWxpdHlLZXlMaXN0WzBdOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgdHlwZSBsaXN0CiAgICBteSAkU2VydmljZVR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7CiAgICAkU2VydmljZURhdGF7VHlwZX0gPSAkU2VydmljZVR5cGVMaXN0LT57ICRTZXJ2aWNlRGF0YXtUeXBlSUR9IH0gfHwgJyc7CgogICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgKTsKICAgICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57ICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eUlEfSB9IHx8ICcnOwoKICAgICMgc2V0IGRlZmF1bHQgaW5jaWRlbnQgdHlwZQogICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9ID0gJ29wZXJhdGlvbmFsJzsKCiAgICAjIGdldCBJVFNNIG1vZHVsZSBkaXJlY3RvcnkKICAgIG15ICRDb25maWdJdGVtTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9JVFNNQ29uZmlnSXRlbS5wbSc7CgogICAgIyBjaGVjayBpZiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQgcGFja2FnZSBpcyBpbnN0YWxsZWQKICAgIGlmICggLWUgJENvbmZpZ0l0ZW1Nb2R1bGUgKSB7CgogICAgICAgICMgZ2V0IHRoZSBpbmNpZGVudCBsaW5rIHR5cGUKICAgICAgICBteSAkTGlua1R5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZScpOwoKICAgICAgICAjIGZpbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMKICAgICAgICBteSAlTGlua2VkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgICAgIE9iamVjdDEgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgIEtleTEgICAgICA9PiAkU2VydmljZURhdGF7U2VydmljZUlEfSwKICAgICAgICAgICAgT2JqZWN0MiAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIFN0YXRlICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICBUeXBlICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiBlYWNoIGNvbmZpZyBpdGVtCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICgga2V5cyAlTGlua2VkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRMaW5rZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9OwoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJENvbmZpZ0l0ZW1EYXRhLT57Q3VyRGVwbFN0YXRlVHlwZX0gbmUgJ3Byb2R1Y3RpdmUnOwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnd2FybmluZycgKSB7CiAgICAgICAgICAgICAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gPSAnd2FybmluZyc7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9ID0gJ2luY2lkZW50JzsKICAgICAgICAgICAgICAgIGxhc3QgQ09ORklHSVRFTUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgdGhlIHN0YXRlIG9mIGFsbGUgY2hpbGQgc2VydmljZXMKICAgIGlmICggJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IGVxICdvcGVyYXRpb25hbCcgKSB7CgogICAgICAgICMgY3JlYXRlIHRoZSB2YWxpZCBzdHJpbmcKICAgICAgICBteSAkVmFsaWRJRFN0cmluZyA9IGpvaW4gcXssIH0sICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpOwoKICAgICAgICAjIHByZXBhcmUgbmFtZQogICAgICAgIG15ICROYW1lID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgICAgICROYW1lID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkTmFtZSApOwoKICAgICAgICAjIEhvdGZpeCBmb3IgTVNTUUwgYnVnIyAyMjI3CiAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0RGF0YWJhc2VGdW5jdGlvbignVHlwZScpIG5lICdtc3NxbCcgKSB7CiAgICAgICAgICAgICROYW1lID1+IHN7IFxbIH17W1tdfXhtc2c7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IG9mIGFsbCB2YWxpZCBjaGlsZHMKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIG5hbWUgTElLRSAnJFNlcnZpY2VEYXRhe05hbWV9OjolJyBBTkQgdmFsaWRfaWQgSU4gKCRWYWxpZElEU3RyaW5nKSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBmaW5kIGxlbmd0aCBvZiBjaGlsZHMgcHJlZml4CiAgICAgICAgbXkgJFByZWZpeExlbmd0aCA9IGxlbmd0aCAiJFNlcnZpY2VEYXRhe05hbWV9OjoiOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ2hpbGRJRHM7CiAgICAgICAgUk9XOgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgY2hpbGQgcGFydAogICAgICAgICAgICBteSAkQ2hpbGRQYXJ0ID0gc3Vic3RyICRSb3dbMV0sICRQcmVmaXhMZW5ndGg7CgogICAgICAgICAgICBuZXh0IFJPVyBpZiAkQ2hpbGRQYXJ0ID1+IG17IDo6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBDaGlsZElEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEBDaGlsZElEcyApIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGEgb2YgY2hpbGQgc2VydmljZQogICAgICAgICAgICBteSAlQ2hpbGRTZXJ2aWNlRGF0YSA9ICRTZWxmLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAkQ2hpbGRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9ID0gJ3dhcm5pbmcnOwogICAgICAgICAgICBsYXN0IFNFUlZJQ0VJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgZGVmYXVsdCBpbmNpZGVudCBzdGF0ZXMKICAgIG15ICVEZWZhdWx0SW5jaVN0YXRzID0gKAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ1dhcm5pbmcnLAogICAgICAgIGluY2lkZW50ICAgID0+ICdJbmNpZGVudCcsCiAgICApOwoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0IG9mIHRoaXMgdHlwZQogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0sCiAgICApOwoKICAgIG15ICVSZXZlcnNlSW5jaVN0YXRlTGlzdCA9IHJldmVyc2UgJXsgJEluY2lTdGF0ZUxpc3QgfTsKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0KICAgICAgICA9ICRSZXZlcnNlSW5jaVN0YXRlTGlzdHsgJERlZmF1bHRJbmNpU3RhdHN7ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSB9IH07CgogICAgIyBmYWxsYmFjayBpZiB0aGUgZGVmYXVsdCBpbmNpZGVudCBzdGF0ZSBpcyBkZWFjdGl2YXRlZAogICAgaWYgKCAhJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZUlEfSApIHsKICAgICAgICBteSBAU29ydGVkSW5jaUxpc3QgPSBzb3J0IGtleXMgJXsgJEluY2lTdGF0ZUxpc3QgfTsKICAgICAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlSUR9ID0gJFNvcnRlZEluY2lMaXN0WzBdOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGZ1bmN0aW9uYWxpdHkKICAgIG15ICRJbmNpU3RhdGUgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZUlEfSwKICAgICk7CgogICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9ID0gJEluY2lTdGF0ZS0+e0Z1bmN0aW9uYWxpdHl9OwojIC0tLQoKICAgIHJldHVybiAlU2VydmljZURhdGE7Cn0KCj1pdGVtIFNlcnZpY2VMb29rdXAoKQoKcmV0dXJuIGEgc2VydmljZSBuYW1lIGFuZCBpZAoKICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NlcnZpY2U6OlN1YlNlcnZpY2UnLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57JENhY2hlS2V5fTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIGlmICggZGVmaW5lZCAkU2VsZi0+eyRDYWNoZUtleX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFNlbGYtPnskQ2FjaGVLZXl9ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+eyRDYWNoZUtleX07CiAgICB9Cn0KCj1pdGVtIFNlcnZpY2VBZGQoKQoKYWRkIGEgc2VydmljZQoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIFR5cGVJRCAgICAgICAgPT4gMiwKICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgojIC0tLQojIElUU00KIyAtLS0KIyAgICBmb3IgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQgVHlwZUlEIENyaXRpY2FsaXR5SUQpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNvbW1lbnQKICAgICRQYXJhbXtDb21tZW50fSA9ICRQYXJhbXtDb21tZW50fSB8fCAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IC86Oi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwgKTsKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaW5kIGV4aXN0aW5nIHNlcnZpY2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRFeGlzdHMgPSAxOwogICAgfQoKICAgICMgYWRkIHNlcnZpY2UgdG8gZGF0YWJhc2UKICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5cJ3QgYWRkIHNlcnZpY2UhIFNlcnZpY2Ugd2l0aCBzYW1lIG5hbWUgYW5kIHBhcmVudCBhbHJlYWR5IGV4aXN0cy4nCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2UgJwojICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwojICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZSAnCiAgICAgICAgICAgIC4gJyhuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksICcKICAgICAgICAgICAgLiAndHlwZV9pZCwgY3JpdGljYWxpdHlfaWQpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgXSwKIyAtLS0KICAgICk7CgogICAgIyBnZXQgc2VydmljZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRTZXJ2aWNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OlNlcnZpY2VMb29rdXA6OklEOjonIC4gJFNlcnZpY2VJRCB9OwogICAgZGVsZXRlICRTZWxmLT57ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtGdWxsTmFtZX0gfTsKCiAgICByZXR1cm4gJFNlcnZpY2VJRDsKfQoKPWl0ZW0gU2VydmljZVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBzZXJ2aWNlCgogICAgbXkgJFRydWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVVwZGF0ZSgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFBhcmVudElEICA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgIENvbW1lbnQgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgID0+IDIsCiAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgZm9yIChxdyhTZXJ2aWNlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgIGZvciAocXcoU2VydmljZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQgVHlwZUlEIENyaXRpY2FsaXR5SUQpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNvbW1lbnQKICAgICRQYXJhbXtDb21tZW50fSA9ICRQYXJhbXtDb21tZW50fSB8fCAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IC86Oi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvbGQgbmFtZSBvZiBzZXJ2aWNlCiAgICBteSAkT2xkU2VydmljZU5hbWUgPSAkU2VsZi0+U2VydmljZUxvb2t1cCggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCApOwoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OlNlcnZpY2VMb29rdXA6OklEOjonIC4gJFBhcmFte1NlcnZpY2VJRH0gfTsKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OlNlcnZpY2VMb29rdXA6Ok5hbWU6OicgLiAkT2xkU2VydmljZU5hbWUgfTsKCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwgKTsKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIGlmIHNlbGVjdGVkIHBhcmVudCB3YXMgYSBjaGlsZCBvZiB0aGlzIHNlcnZpY2UKICAgICAgICBpZiAoICRQYXJhbXtGdWxsTmFtZX0gPX4gL14oXFEkT2xkU2VydmljZU5hbWVcRSk6Oi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5cJ3QgdXBkYXRlIHNlcnZpY2UhIEludmFsaWQgcGFyZW50IHdhcyBzZWxlY3RlZC4nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBmaW5kIGV4aXN0cyBzZXJ2aWNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0Z1bGxOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgbXkgJEV4aXN0czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRXhpc3RzID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgaWYgKCRFeGlzdHMpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCB1cGRhdGUgc2VydmljZSEgU2VydmljZSB3aXRoIHNhbWUgbmFtZSBhbmQgcGFyZW50IGFscmVhZHkgZXhpc3RzLicKICAgICAgICApOwogICAgICAgIHJldHVybjsKCiAgICB9CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPywgdmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKIyAgICAgICAgICAgIC4gJyBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/IFdIRVJFIGlkID0gPycsCiMgICAgICAgIEJpbmQgPT4gWwojICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiMgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17U2VydmljZUlEfSwKIyAgICAgICAgXSwKICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPywgdmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sIHR5cGVfaWQgPSA/LCBjcml0aWNhbGl0eV9pZCA9ID8nCiAgICAgICAgICAgIC4gJyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17Q3JpdGljYWxpdHlJRH0sIFwkUGFyYW17U2VydmljZUlEfSwKICAgICAgICBdLAojIC0tLQogICAgKTsKCiAgICAjIGZpbmQgYWxsIGNoaWxkcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgTElLRSAnIgogICAgICAgICAgICAuICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJE9sZFNlcnZpY2VOYW1lLCAnTGlrZScgKQogICAgICAgICAgICAuICI6OiUnIiwKICAgICk7CiAgICBteSBAQ2hpbGRzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlQ2hpbGQ7CiAgICAgICAgJENoaWxke1NlcnZpY2VJRH0gPSAkUm93WzBdOwogICAgICAgICRDaGlsZHtOYW1lfSAgICAgID0gJFJvd1sxXTsKICAgICAgICBwdXNoKCBAQ2hpbGRzLCBcJUNoaWxkICk7CiAgICB9CgogICAgIyB1cGRhdGUgY2hpbGRzCiAgICBmb3IgbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgJENoaWxkLT57TmFtZX0gPX4gcy9eKFxRJE9sZFNlcnZpY2VOYW1lXEUpOjovJFBhcmFte0Z1bGxOYW1lfTo6LzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIHNlcnZpY2UgU0VUIG5hbWUgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENoaWxkLT57TmFtZX0sIFwkQ2hpbGQtPntTZXJ2aWNlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTZXJ2aWNlU2VhcmNoKCkKCnJldHVybiBzZXJ2aWNlIGlkcyBhcyBhbiBhcnJheQoKICAgIG15IEBTZXJ2aWNlTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU2VhcmNoKAogICAgICAgIE5hbWUgICA9PiAnU2VydmljZSBOYW1lJywgIyAob3B0aW9uYWwpCiAgICAgICAgTGltaXQgID0+IDEyMiwgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxMDAwCiAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIFR5cGVJRHMgICAgICAgID0+IDIsCiAgICAgICAgQ3JpdGljYWxpdHlJRHMgPT4gMSwKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAkUGFyYW17TGltaXR9ID0gJFBhcmFte0xpbWl0fSB8fCAxMDAwOwoKICAgICMgRklYTUU6IHZhbGlkX2lkID0gMQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIHZhbGlkX2lkID0gMSAnOwoKICAgIGlmICggJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte05hbWV9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TmFtZX0sICdMaWtlJyApOwoKICAgICAgICAjIHJlcGxhY2UgKiB3aXRoICUgYW5kIGNsZWFuIHRoZSBzdHJpbmcKICAgICAgICAkUGFyYW17TmFtZX0gPX4gc3sgXCorIH17JX14bXNnOwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyAlKyB9eyV9eG1zZzsKCiAgICAgICAgJFNRTCAuPSAiQU5EIG5hbWUgTElLRSAnJFBhcmFte05hbWV9JyAiOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgYWRkIHR5cGUgaWRzCiAgICBpZiAoICRQYXJhbXtUeXBlSURzfSAmJiByZWYgJFBhcmFte1R5cGVJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte1R5cGVJRHN9IH0gKSB7CiAgICAgICAgJFNRTCAuPSAiQU5EIHR5cGVfaWQgSU4gKCIgLiBqb2luKCcsICcsIEB7ICRQYXJhbXtUeXBlSURzfSB9KSAuICIpICI7CiAgICB9CiAgICAjIGFkZCBjcml0aWNhbGl0eSBpZHMKICAgIGlmICgkUGFyYW17Q3JpdGljYWxpdHlJRHN9ICYmIHJlZiAkUGFyYW17Q3JpdGljYWxpdHlJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte0NyaXRpY2FsaXR5SURzfSB9ICkgewogICAgICAgICRTUUwgLj0gIkFORCBjcml0aWNhbGl0eV9pZCBJTiAoIiAuIGpvaW4oJywgJywgQHsgJFBhcmFte0NyaXRpY2FsaXR5SURzfSB9KSAuICIpICI7CiAgICB9CiMgLS0tCgogICAgJFNRTCAuPSAnT1JERVIgQlkgbmFtZSc7CgogICAgIyBzZWFyY2ggc2VydmljZSBpbiBkYgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CgogICAgbXkgQFNlcnZpY2VMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoKCBAU2VydmljZUxpc3QsICRSb3dbMF0gKTsKICAgIH0KCiAgICByZXR1cm4gQFNlcnZpY2VMaXN0Owp9Cgo9aXRlbSBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgpCgpyZXR1cm5zIGEgbGlzdCBvZiBjdXN0b21lcnVzZXIvc2VydmljZSBtZW1iZXJzCgogICAgU2VydmljZUlEOiBzZXJ2aWNlIGlkCiAgICBDdXN0b21lclVzZXJMb2dpbjogY3VzdG9tZXIgdXNlciBsb2dpbgogICAgRGVmYXVsdFNlcnZpY2VzOiBhY3RpdmF0ZSBvciBkZWFjdGl2YXRlIGRlZmF1bHQgc2VydmljZXMKCiAgICBSZXN1bHQ6IEhBU0ggLT4gcmV0dXJucyBhIGhhc2ggb2Yga2V5ID0+IHNlcnZpY2UgaWQsIHZhbHVlID0+IHNlcnZpY2UgbmFtZQogICAgICAgICAgICBOYW1lIC0+IHJldHVybnMgYW4gYXJyYXkgb2YgdXNlciBuYW1lcwogICAgICAgICAgICBJRCAgIC0+IHJldHVybnMgYW4gYXJyYXkgb2YgdXNlciBpZHMKCiAgICBFeGFtcGxlIChnZXQgc2VydmljZXMgb2YgY3VzdG9tZXIgdXNlcik6CgogICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICdUZXN0JywKICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKICAgICk7CgogICAgRXhhbXBsZSAoZ2V0IGN1c3RvbWVyIHVzZXIgb2Ygc2VydmljZSk6CgogICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkSUQsCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhSZXN1bHQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBDdXN0b21lclVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdAogICAgaWYgKCAhZGVmaW5lZCggJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gKSApIHsKICAgICAgICAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfSA9IDE7CiAgICB9CgogICAgIyBkYiBxdW90ZQogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApOwogICAgfQogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBjcmVhdGUgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkgPSAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3Q6OicgLiAkUGFyYW17UmVzdWx0fSAuICc6Oic7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRDYWNoZUtleSAuPSAnU2VydmljZUlEOjonIC4gJFBhcmFte1NlcnZpY2VJRH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49ICdDdXN0b21lclVzZXJMb2dpbjo6JyAuICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn07CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSB8fCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgIGlmICggJFNlbGYtPntGb3JjZUNhY2hlfSApIHsKICAgICAgICAgICAgJFBhcmFte0NhY2hlZH0gPSAkU2VsZi0+e0ZvcmNlQ2FjaGV9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtDYWNoZWR9ICYmICRTZWxmLT57JENhY2hlS2V5fSApIHsKICAgICAgICAgICAgaWYgKCByZWYoICRTZWxmLT57JENhY2hlS2V5fSApIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQHsgJFNlbGYtPnskQ2FjaGVLZXl9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYoICRTZWxmLT57JENhY2hlS2V5fSApIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAleyAkU2VsZi0+eyRDYWNoZUtleX0gfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbAogICAgbXkgJURhdGEgPSAoKTsKICAgIG15IEBOYW1lID0gKCk7CiAgICBteSBASUQgICA9ICgpOwogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHNjdS5zZXJ2aWNlX2lkLCBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiwgcy5uYW1lICcKICAgICAgICAuICcgRlJPTSAnCiAgICAgICAgLiAnIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBzY3UsIHNlcnZpY2UgcycKICAgICAgICAuICcgV0hFUkUgJwogICAgICAgIC4gIiBzLnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkSURzR2V0KCkpfSApIEFORCAiCiAgICAgICAgLiAnIHMuaWQgPSBzY3Uuc2VydmljZV9pZCBBTkQgJzsKCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRTUUwgLj0gIiBzY3Uuc2VydmljZV9pZCA9ICRQYXJhbXtTZXJ2aWNlSUR9IjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKICAgICAgICAkU1FMIC49ICIgc2N1LmN1c3RvbWVyX3VzZXJfbG9naW4gPSAnJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSciOwogICAgfQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRLZXkgICA9ICcnOwogICAgICAgIG15ICRWYWx1ZSA9ICcnOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICRLZXkgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRWYWx1ZSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkS2V5ICAgPSAkUm93WzBdOwogICAgICAgICAgICAkVmFsdWUgPSAkUm93WzJdOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBwZXJtaXNzaW9ucwogICAgICAgIGlmICggIWRlZmluZWQoICREYXRheyRLZXl9ICkgKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFZhbHVlOwogICAgICAgICAgICBwdXNoKCBATmFtZSwgJFZhbHVlICk7CiAgICAgICAgICAgIHB1c2goIEBJRCwgICAkS2V5ICk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICYmICRQYXJhbXtEZWZhdWx0U2VydmljZXN9ICYmICFrZXlzKCVEYXRhKSApIHsKICAgICAgICAlRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgcHVzaCggQE5hbWUsICREYXRheyRLZXl9ICk7CiAgICAgICAgICAgIHB1c2goIEBJRCwgICAkS2V5ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdAogICAgaWYgKCAkUGFyYW17UmVzdWx0fSAmJiAkUGFyYW17UmVzdWx0fSBlcSAnSUQnICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gfHwgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKCiAgICAgICAgICAgICMgY2FjaGUgcmVzdWx0CiAgICAgICAgICAgICRTZWxmLT57JENhY2hlS2V5fSA9IFxASUQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBASUQ7CiAgICB9CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9ICYmICRQYXJhbXtSZXN1bHR9IGVxICdOYW1lJyApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9IHx8ICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CgogICAgICAgICAgICAjIGNhY2hlIHJlc3VsdAogICAgICAgICAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSBcQE5hbWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBATmFtZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gfHwgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKCiAgICAgICAgICAgICMgY2FjaGUgcmVzdWx0CiAgICAgICAgICAgICRTZWxmLT57JENhY2hlS2V5fSA9IFwlRGF0YTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICVEYXRhOwogICAgfQp9Cgo9aXRlbSBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKCkKCnRvIGFkZCBhIG1lbWJlciB0byBhIHNlcnZpY2UKCiAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdDEnLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+IDYsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkY291bnQ7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQ3VzdG9tZXJVc2VyTG9naW4gU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFICcKICAgICAgICAgICAgLiAnY3VzdG9tZXJfdXNlcl9sb2dpbiA9ID8gQU5EIHNlcnZpY2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgXQogICAgKTsKCiAgICAjIHJldHVybiBpZiByZWxhdGlvbiBpcyBub3QgYWN0aXZlCiAgICByZXR1cm4gaWYgISRQYXJhbXtBY3RpdmV9OwoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2VfY3VzdG9tZXJfdXNlciAnCiAgICAgICAgICAgIC4gJyhjdXN0b21lcl91c2VyX2xvZ2luLCBzZXJ2aWNlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtVc2VySUR9IF0KICAgICk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA4LzA3LzA1IDE4OjAxOjM1ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU0xBLnBtIC0gYWxsIHNsYSBmdW5jdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU0xBLnBtLHYgMS4yIDIwMDgvMDcvMDIgMTI6MjM6MjMgbWggRXhwICQKIyAkT2xkSWQ6IFNMQS5wbSx2IDEuMzAgMjAwOC8wNi8xOSAxMTowODoyMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTTEE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNMQSAtIHNsYSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHNsYSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CgogICAgbXkgJFNMQU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU0xBTGlzdCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2Ygc2xhcwoKICAgIG15ICVTTEFMaXN0ID0gJFNMQU9iamVjdC0+U0xBTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMSwgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkICAgICA9PiAwLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTTEFMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBhZGQgU2VydmljZUlECiAgICBteSAlU1FMVGFibGU7CiAgICAkU1FMVGFibGV7c2xhfSA9ICdzbGEgcyc7CiAgICBteSBAU1FMV2hlcmU7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtTZXJ2aWNlSUR9LCAnSW50ZWdlcicgKTsKCiAgICAgICAgJFNRTFRhYmxle3NlcnZpY2V9ID0gJ3NlcnZpY2Vfc2xhIHInOwogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAicy5pZCA9IHIuc2xhX2lkIEFORCByLnNlcnZpY2VfaWQgPSAkUGFyYW17U2VydmljZUlEfSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgcGFydAogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewoKICAgICAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgbGlzdAogICAgICAgIG15ICRWYWxpZElEcyA9IGpvaW4gJywgJywgJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkSURzR2V0KCk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAicy52YWxpZF9pZCBJTiAoICRWYWxpZElEcyApIjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGFibGUgYW5kIHdoZXJlIHN0cmluZ3MKICAgIG15ICRUYWJsZVN0cmluZyA9IGpvaW4gcXssIH0sIHZhbHVlcyAlU1FMVGFibGU7CiAgICBteSAkV2hlcmVTdHJpbmcgPSBAU1FMV2hlcmUgPyAnIFdIRVJFICcgLiBqb2luIHF7IEFORCB9LCBAU1FMV2hlcmUgOiAnJzsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1Qgcy5pZCwgcy5uYW1lIEZST00gJFRhYmxlU3RyaW5nICRXaGVyZVN0cmluZyIsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVNMQUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTTEFMaXN0eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiAlU0xBTGlzdDsKfQoKPWl0ZW0gU0xBR2V0KCkKCnJldHVybiBhIHNsYSBhcyBoYXNoCgpSZXR1cm4KICAgICRTTEFEYXRhe1NMQUlEfQogICAgJFNMQURhdGF7U2VydmljZUlEc30KICAgICRTTEFEYXRhe05hbWV9CiAgICAkU0xBRGF0YXtDYWxlbmRhcn0KICAgICRTTEFEYXRhe0ZpcnN0UmVzcG9uc2VUaW1lfQogICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeX0KICAgICRTTEFEYXRhe1VwZGF0ZVRpbWV9CiAgICAkU0xBRGF0YXtVcGRhdGVOb3RpZnl9CiAgICAkU0xBRGF0YXtTb2x1dGlvblRpbWV9CiAgICAkU0xBRGF0YXtTb2x1dGlvbk5vdGlmeX0KICAgICRTTEFEYXRhe1ZhbGlkSUR9CiAgICAkU0xBRGF0YXtDb21tZW50fQogICAgJFNMQURhdGF7Q3JlYXRlVGltZX0KICAgICRTTEFEYXRhe0NyZWF0ZUJ5fQogICAgJFNMQURhdGF7Q2hhbmdlVGltZX0KICAgICRTTEFEYXRhe0NoYW5nZUJ5fQojIC0tLQojIElUU00KIyAtLS0KICAgICRTTEFEYXRhe1R5cGVJRH0KICAgICRTTEFEYXRhe1R5cGV9CiAgICAkU0xBRGF0YXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30KIyAtLS0KCiAgICBteSAlU0xBRGF0YSA9ICRTTEFPYmplY3QtPlNMQUdldCgKICAgICAgICBTTEFJRCAgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTTEFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU0xBSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkQXJndW1lbnQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNMQUdldDo6JyAuICRQYXJhbXtTTEFJRH07CiAgICBpZiAoICRTZWxmLT57JENhY2hlS2V5fSApIHsKICAgICAgICByZXR1cm4gJXsgJFNlbGYtPnskQ2FjaGVLZXl9IH07CiAgICB9CgogICAgIyBnZXQgc2xhIGZyb20gZGIKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCBjYWxlbmRhcl9uYW1lLCBmaXJzdF9yZXNwb25zZV90aW1lLCBmaXJzdF9yZXNwb25zZV9ub3RpZnksICcKICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUsIHVwZGF0ZV9ub3RpZnksIHNvbHV0aW9uX3RpbWUsIHNvbHV0aW9uX25vdGlmeSwgJwogICAgICAgICAgICAuICd2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgLiAiLCB0eXBlX2lkLCBtaW5fdGltZV9iZXRfaW5jaWRlbnRzICIKIyAtLS0KICAgICAgICAgICAgLiAnRlJPTSBzbGEgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTTEFJRH0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTTEFEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU0xBRGF0YXtTTEFJRH0gICAgICAgICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJFNMQURhdGF7TmFtZX0gICAgICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRTTEFEYXRhe0NhbGVuZGFyfSAgICAgICAgICAgID0gJFJvd1syXSB8fCAnJzsKICAgICAgICAkU0xBRGF0YXtGaXJzdFJlc3BvbnNlVGltZX0gICA9ICRSb3dbM107CiAgICAgICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeX0gPSAkUm93WzRdOwogICAgICAgICRTTEFEYXRhe1VwZGF0ZVRpbWV9ICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkU0xBRGF0YXtVcGRhdGVOb3RpZnl9ICAgICAgICA9ICRSb3dbNl07CiAgICAgICAgJFNMQURhdGF7U29sdXRpb25UaW1lfSAgICAgICAgPSAkUm93WzddOwogICAgICAgICRTTEFEYXRhe1NvbHV0aW9uTm90aWZ5fSAgICAgID0gJFJvd1s4XTsKICAgICAgICAkU0xBRGF0YXtWYWxpZElEfSAgICAgICAgICAgICA9ICRSb3dbOV07CiAgICAgICAgJFNMQURhdGF7Q29tbWVudH0gICAgICAgICAgICAgPSAkUm93WzEwXSB8fCAnJzsKICAgICAgICAkU0xBRGF0YXtDcmVhdGVUaW1lfSAgICAgICAgICA9ICRSb3dbMTFdOwogICAgICAgICRTTEFEYXRhe0NyZWF0ZUJ5fSAgICAgICAgICAgID0gJFJvd1sxMl07CiAgICAgICAgJFNMQURhdGF7Q2hhbmdlVGltZX0gICAgICAgICAgPSAkUm93WzEzXTsKICAgICAgICAkU0xBRGF0YXtDaGFuZ2VCeX0gICAgICAgICAgICA9ICRSb3dbMTRdOwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAkU0xBRGF0YXtUeXBlSUR9ICAgICAgICAgICAgICAgICAgPSAkUm93WzE1XTsKICAgICAgICAkU0xBRGF0YXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30gPSAkUm93WzE2XSB8fCAwOwojIC0tLQogICAgfQoKICAgICMgY2hlY2sgc2xhCiAgICBpZiAoICEkU0xBRGF0YXtTTEFJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIFNMQUlEICgkUGFyYW17U0xBSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIFdPUktBUk9VTkQ6IHNldCBlbXB0eSB0eXBlX2lkIGluIHRoZSBzbGEgdGFibGUKICAgIGlmICggISRTTEFEYXRhe1R5cGVJRH0gKSB7CgogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CgogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAjIGdldCBzbGEgdHlwZSBsaXN0CiAgICAgICAgbXkgJFNMQVR5cGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBoYW5kbGluZwogICAgICAgIGlmICggISV7JFNMQVR5cGVMaXN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgYW55IGl0ZW0gaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIElUU006OlNMQTo6VHlwZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSBAU0xBVHlwZUtleUxpc3QgPSBzb3J0IGtleXMgJXskU0xBVHlwZUxpc3R9OwoKICAgICAgICAjIHVwZGF0ZSB0eXBlX2lkCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzbGEgIgogICAgICAgICAgICAgICAgLiAiU0VUIHR5cGVfaWQgPSAkU0xBVHlwZUtleUxpc3RbMF0gIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgdHlwZV9pZCA9IDAgT1IgdHlwZV9pZCBJUyBOVUxMIiwKICAgICAgICApOwoKICAgICAgICAkU0xBRGF0YXtUeXBlSUR9ID0gJFNMQVR5cGVLZXlMaXN0WzBdOwogICAgfQoKICAgICMgZ2V0IHNsYSB0eXBlIGxpc3QKICAgIG15ICRTTEFUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKICAgICk7CiAgICAkU0xBRGF0YXtUeXBlfSA9ICRTTEFUeXBlTGlzdC0+eyAkU0xBRGF0YXtUeXBlSUR9IH0gfHwgJyc7CiMgLS0tCgogICAgIyBnZXQgYWxsIHNlcnZpY2UgaWRzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNsYV9pZCA9ID8gT1JERVIgQlkgc2VydmljZV9pZCBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFNMQURhdGF7U0xBSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFNlcnZpY2VJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFNlcnZpY2VJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyBhZGQgdGhlIGlkcwogICAgJFNMQURhdGF7U2VydmljZUlEc30gPSBcQFNlcnZpY2VJRHM7CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSBcJVNMQURhdGE7CgogICAgcmV0dXJuICVTTEFEYXRhOwp9Cgo9aXRlbSBTTEFMb29rdXAoKQoKcmV0dXJuIHRoZSBuYW1lIG9yIHRoZSBzbGEgaWQKCiAgICBteSAkU0xBTmFtZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICBTTEFJRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFNMQUlEID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NMQSBOYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgU0xBTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTTEFJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU0xBSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte1NMQUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U0xBTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTTEFJRH07CiAgICAgICAgaWYgKCBkZWZpbmVkICRTZWxmLT57JENhY2hlS2V5fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57JENhY2hlS2V5fTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIHNsYSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17U0xBSUR9LCBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICROYW1lOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICROYW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUKICAgICAgICAkU2VsZi0+eyRDYWNoZUtleX0gPSAkTmFtZTsKCiAgICAgICAgcmV0dXJuICROYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNMQUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBpZiAoIGRlZmluZWQgJFNlbGYtPnskQ2FjaGVLZXl9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPnskQ2FjaGVLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNsYSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRTTEFJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkU0xBSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZQogICAgICAgICRTZWxmLT57JENhY2hlS2V5fSA9ICRTTEFJRDsKCiAgICAgICAgcmV0dXJuICRTTEFJRDsKICAgIH0KfQoKPWl0ZW0gU0xBQWRkKCkKCmFkZCBhIHNsYQoKICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgMSwgNSwgNyBdLCAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICdDYWxlbmRhcjEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAxMjAsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gNjAsICAgICAgICAgICAjIChvcHRpb25hbCkgbm90aWZ5IGFnZW50IGlmIGZpcnN0IHJlc3BvbnNlIGVzY2FsYXRpb24gaXMgNjAlIHJlYWNoZWQKICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDE4MCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA4MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgdXBkYXRlIGVzY2FsYXRpb24gaXMgODAlIHJlYWNoZWQKICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDU4MCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA4MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgc29sdXRpb24gZXNjYWxhdGlvbiBpcyA4MCUgcmVhY2hlZAogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzID0+IDM0NDMsICAjIChvcHRpb25hbCkKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgU0xBQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQgVHlwZUlEKSkgewojIC0tLQogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UgaWRzCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlcnZpY2VJRHN9ICYmIHJlZiAkUGFyYW17U2VydmljZUlEc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlcnZpY2VJRHMgbmVlZCB0byBiZSBhbiBhcnJheSByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte1NlcnZpY2VJRHN9ICAgICAgICAgIHx8PSBbXTsKICAgICRQYXJhbXtDYWxlbmRhcn0gICAgICAgICAgICB8fD0gJyc7CiAgICAkUGFyYW17Q29tbWVudH0gICAgICAgICAgICAgfHw9ICcnOwogICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSAgIHx8PSAwOwogICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9IHx8PSAwOwogICAgJFBhcmFte1VwZGF0ZVRpbWV9ICAgICAgICAgIHx8PSAwOwogICAgJFBhcmFte1VwZGF0ZU5vdGlmeX0gICAgICAgIHx8PSAwOwogICAgJFBhcmFte1NvbHV0aW9uVGltZX0gICAgICAgIHx8PSAwOwogICAgJFBhcmFte1NvbHV0aW9uTm90aWZ5fSAgICAgIHx8PSAwOwojIC0tLQojIElUU00KIyAtLS0KICAgICRQYXJhbXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30gfHw9IDA7CiMgLS0tCgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIHNsYSdzIHdpdGggdGhlIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNsYSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgc2xhLCBpZiBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgbmV3IFNMQSEgJyRQYXJhbXtOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBzbGEgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzbGEgJwojICAgICAgICAgICAgLiAnKG5hbWUsIGNhbGVuZGFyX25hbWUsIGZpcnN0X3Jlc3BvbnNlX3RpbWUsIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSwgJwojICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUsIHVwZGF0ZV9ub3RpZnksIHNvbHV0aW9uX3RpbWUsIHNvbHV0aW9uX25vdGlmeSwgJwojICAgICAgICAgICAgLiAndmFsaWRfaWQsIGNvbW1lbnRzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwojICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAojICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAojICAgICAgICAgICAgXCRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSwgXCRQYXJhbXtVcGRhdGVUaW1lfSwgXCRQYXJhbXtVcGRhdGVOb3RpZnl9LAojICAgICAgICAgICAgXCRQYXJhbXtTb2x1dGlvblRpbWV9LCBcJFBhcmFte1NvbHV0aW9uTm90aWZ5fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2xhICcKICAgICAgICAgICAgLiAnKG5hbWUsIGNhbGVuZGFyX25hbWUsIGZpcnN0X3Jlc3BvbnNlX3RpbWUsIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSwgJwogICAgICAgICAgICAuICd1cGRhdGVfdGltZSwgdXBkYXRlX25vdGlmeSwgc29sdXRpb25fdGltZSwgc29sdXRpb25fbm90aWZ5LCAnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgJwogICAgICAgICAgICAuICd0eXBlX2lkLCBtaW5fdGltZV9iZXRfaW5jaWRlbnRzKSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9LCBcJFBhcmFte1VwZGF0ZVRpbWV9LCBcJFBhcmFte1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17TWluVGltZUJldHdlZW5JbmNpZGVudHN9LAogICAgICAgIF0sCiMgLS0tCiAgICApOwoKICAgICMgZ2V0IHNsYSBpZAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2xhIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRTTEFJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNMQUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIHNsYSBpZAogICAgaWYgKCAhJFNMQUlEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZmluZCBTTEFJRCBmb3IgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZXhpc3RpbmcgYWxsb2NhdGlvbnMKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzbGFfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRTTEFJRCBdLAogICAgKTsKCiAgICAjIGFkZCB0aGUgbmV3IGFsbG9jYXRpb25zCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEB7ICRQYXJhbXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAjIGFkZCBvbmUgYWxsb2NhdGlvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX3NsYSAoc2VydmljZV9pZCwgc2xhX2lkKSBWQUxVRVMgKD8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlELCBcJFNMQUlEIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNMQUlEOwp9Cgo9aXRlbSBTTEFVcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3Rpbmcgc2xhCgogICAgbXkgJFRydWUgPSAkU0xBT2JqZWN0LT5TTEFVcGRhdGUoCiAgICAgICAgU0xBSUQgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAxLCAyLCAzIF0sICAjIChvcHRpb25hbCkKICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJ0NhbGVuZGFyMScsICAjIChvcHRpb25hbCkKICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDEyMCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA2MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgZmlyc3QgcmVzcG9uc2UgZXNjYWxhdGlvbiBpcyA2MCUgcmVhY2hlZAogICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiB1cGRhdGUgZXNjYWxhdGlvbiBpcyA4MCUgcmVhY2hlZAogICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiBzb2x1dGlvbiBlc2NhbGF0aW9uIGlzIDgwJSByZWFjaGVkCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgTWluVGltZUJldHdlZW5JbmNpZGVudHMgPT4gMzQ0MywgICMgKG9wdGlvbmFsKQojIC0tLQogICAgKTsKCj1jdXQKCnN1YiBTTEFVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgojIC0tLQojIElUU00KIyAtLS0KIyAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTTEFJRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU0xBSUQgTmFtZSBWYWxpZElEIFVzZXJJRCBUeXBlSUQpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc2VydmljZSBpZHMKICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VydmljZUlEc30gJiYgcmVmICRQYXJhbXtTZXJ2aWNlSURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VydmljZUlEcyBuZWVkIHRvIGJlIGFuIGFycmF5IHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17U2VydmljZUlEc30gICAgICAgICAgfHw9IFtdOwogICAgJFBhcmFte0NhbGVuZGFyfSAgICAgICAgICAgIHx8PSAnJzsKICAgICRQYXJhbXtDb21tZW50fSAgICAgICAgICAgICB8fD0gJyc7CiAgICAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9ICAgfHw9IDA7CiAgICAkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0gfHw9IDA7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gICAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17VXBkYXRlTm90aWZ5fSAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17U29sdXRpb25UaW1lfSAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17U29sdXRpb25Ob3RpZnl9ICAgICAgfHw9IDA7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFBhcmFte01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSB8fD0gMDsKIyAtLS0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgc2xhJ3Mgd2l0aCB0aGUgc2FtZSBuYW1lCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzbGEgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFVwZGF0ZSA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSAhPSAkUGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAkVXBkYXRlID0gJFJvd1swXTsKICAgICAgICB9CiAgICB9CgogICAgIyBhYm9ydCB1cGRhdGUgb2Ygc2xhLCBpZiBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJFVwZGF0ZSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIFNMQSEgJyRQYXJhbXtOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPnsgJ0NhY2hlOjpTTEFHZXQ6OicgLiAkUGFyYW17U0xBSUR9IH07CiAgICBkZWxldGUgJFNlbGYtPnsgJ0NhY2hlOjpTTEFMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX0gfTsKICAgIGRlbGV0ZSAkU2VsZi0+eyAnQ2FjaGU6OlNMQUxvb2t1cDo6SUQ6OicgLiAkUGFyYW17U0xBSUR9IH07CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBTUUwgPT4gJ1VQREFURSBzbGEgU0VUIG5hbWUgPSA/LCBjYWxlbmRhcl9uYW1lID0gPywgJwojICAgICAgICAgICAgLiAnZmlyc3RfcmVzcG9uc2VfdGltZSA9ID8sIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSA9ID8sICcKIyAgICAgICAgICAgIC4gJ3VwZGF0ZV90aW1lID0gPywgdXBkYXRlX25vdGlmeSA9ID8sIHNvbHV0aW9uX3RpbWUgPSA/LCBzb2x1dGlvbl9ub3RpZnkgPSA/LCAnCiMgICAgICAgICAgICAuICd2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnCiMgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAojICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAojICAgICAgICAgICAgXCRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSwgXCRQYXJhbXtVcGRhdGVUaW1lfSwgXCRQYXJhbXtVcGRhdGVOb3RpZnl9LAojICAgICAgICAgICAgXCRQYXJhbXtTb2x1dGlvblRpbWV9LCBcJFBhcmFte1NvbHV0aW9uTm90aWZ5fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtTTEFJRH0sCiMgICAgICAgIF0sCiAgICAgICAgU1FMID0+ICdVUERBVEUgc2xhIFNFVCBuYW1lID0gPywgY2FsZW5kYXJfbmFtZSA9ID8sICcKICAgICAgICAgICAgLiAnZmlyc3RfcmVzcG9uc2VfdGltZSA9ID8sIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSA9ID8sICcKICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUgPSA/LCB1cGRhdGVfbm90aWZ5ID0gPywgc29sdXRpb25fdGltZSA9ID8sIHNvbHV0aW9uX25vdGlmeSA9ID8sICcKICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sICcKICAgICAgICAgICAgLiAndHlwZV9pZCA9ID8sIG1pbl90aW1lX2JldF9pbmNpZGVudHMgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcn0sICAgXCRQYXJhbXtGaXJzdFJlc3BvbnNlVGltZX0sCiAgICAgICAgICAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0sIFwkUGFyYW17VXBkYXRlVGltZX0sIFwkUGFyYW17VXBkYXRlTm90aWZ5fSwKICAgICAgICAgICAgXCRQYXJhbXtTb2x1dGlvblRpbWV9LCBcJFBhcmFte1NvbHV0aW9uTm90aWZ5fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17TWluVGltZUJldHdlZW5JbmNpZGVudHN9LCBcJFBhcmFte1NMQUlEfSwKICAgICAgICBdLAojIC0tLQogICAgKTsKCiAgICAjIHJlbW92ZSBhbGwgZXhpc3RpbmcgYWxsb2NhdGlvbnMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNsYV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1NMQUlEfSwgXQogICAgKTsKCiAgICAjIGFkZCB0aGUgbmV3IGFsbG9jYXRpb25zCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEB7ICRQYXJhbXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAjIGFkZCBvbmUgYWxsb2NhdGlvbgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2Vfc2xhIChzZXJ2aWNlX2lkLCBzbGFfaWQpIFZBTFVFUyAoPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRTZXJ2aWNlSUQsIFwkUGFyYW17U0xBSUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMDgvMDcvMDIgMTI6MjM6MjMgJAoKPWN1dAo=
IyAtLQojIEN1c3RvbWVyVXNlclNlcnZpY2UudCAtIEN1c3RvbWVyVXNlclNlcnZpY2UgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEN1c3RvbWVyVXNlclNlcnZpY2UudCx2IDEuMiAyMDA4LzA3LzA3IDExOjI0OjU5IG1oIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclVzZXJTZXJ2aWNlLnQsdiAxLjQgMjAwOC8wNS8wOCAwOTozNTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CgokU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKCiMgc2F2ZSBhbGwgb3JpZ2luYWwgZGVmYXVsdCBzZXJ2aWNlcwpteSBAT3JpZ2luYWxEZWZhdWx0U2VydmljZXMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICc8REVGQVVMVD4nLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgojIGRlbGV0ZSBhbGwgZGVmYXVsdCBzZXJ2aWNlcwpmb3IgbXkgJFNlcnZpY2VJRCAoQE9yaWdpbmFsRGVmYXVsdFNlcnZpY2VzKSB7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICc8REVGQVVMVD4nLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKfQoKIyBhZGQgc2VydmljZTEKbXkgJFNlcnZpY2VSYW5kMSA9ICdTb21lU2VydmljZScgLiBpbnQoIHJhbmQoMTAwMDAwMCkgKTsKbXkgJFNlcnZpY2VJRDEgICA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICRTZXJ2aWNlUmFuZDEsCiAgICBDb21tZW50ID0+ICdTb21lIENvbW1lbnQnLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KKTsKCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRDEsCiAgICAnU2VydmljZUFkZDEoKScsCik7CgojIGFkZCBzZXJ2aWNlMgpteSAkU2VydmljZVJhbmQyID0gJ1NvbWVTZXJ2aWNlJyAuIGludCggcmFuZCgxMDAwMDAwKSApOwpteSAkU2VydmljZUlEMiAgID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUFkZCgKICAgIE5hbWUgICAgPT4gJFNlcnZpY2VSYW5kMiwKICAgIENvbW1lbnQgPT4gJ1NvbWUgQ29tbWVudCcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQopOwoKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZUlEMiwKICAgICdTZXJ2aWNlQWRkMigpJywKKTsKCm15ICRDdXN0b21lclVzZXIxID0gJ1NvbWVVc2VyJyAuIGludCggcmFuZCgxMDAwMDAwKSApOwpteSAkQ3VzdG9tZXJVc2VyMiA9ICdTb21lVXNlcicgLiBpbnQoIHJhbmQoMTAwMDAwMCkgKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDEKbXkgQEFsbG9jYXRpb24xID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uMSwKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDEoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAyCm15IEBBbGxvY2F0aW9uMiA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uMiwKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDIoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAzCm15IEBBbGxvY2F0aW9uMyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAogICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjMsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QzKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgNApteSBAQWxsb2NhdGlvbjQgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjQsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3Q0KCknLAopOwoKIyBzZXQgYWxsb2NhdGlvbiAxCiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGFsbG9jYXRpb24gdGVzdCA1Cm15IEBBbGxvY2F0aW9uNSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAogICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKKTsKCiRTZWxmLT5GYWxzZSgKICAgIHNjYWxhciBAQWxsb2NhdGlvbjUsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3Q1KCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgNgpteSBAQWxsb2NhdGlvbjYgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uNkNvdW50ID0gQEFsbG9jYXRpb242OwpteSAkQWxsb2NhdGlvbjZPayAgICA9IDA7CmlmICggJEFsbG9jYXRpb242Q291bnQgZXEgMSAmJiAkQWxsb2NhdGlvbjZbMF0gZXEgJFNlcnZpY2VJRDEgKSB7CiAgICAkQWxsb2NhdGlvbjZPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb242T2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3Q2KCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgNwpteSBAQWxsb2NhdGlvbjcgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb243LAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NygpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDgKbXkgQEFsbG9jYXRpb244ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjhDb3VudCA9IEBBbGxvY2F0aW9uODsKbXkgJEFsbG9jYXRpb244T2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uOENvdW50IGVxIDEgJiYgJEFsbG9jYXRpb244WzBdIGVxICRTZXJ2aWNlSUQxICkgewogICAgJEFsbG9jYXRpb244T2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uOE9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OCgpJywKKTsKCiMgc2V0IGFsbG9jYXRpb24gMgokU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMiwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgOQpteSBAQWxsb2NhdGlvbjkgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgpteSAkQWxsb2NhdGlvbjlDb3VudCA9IEBBbGxvY2F0aW9uOTsKbXkgJEFsbG9jYXRpb245T2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uOUNvdW50IGVxIDEgJiYgJEFsbG9jYXRpb245WzBdIGVxICRTZXJ2aWNlSUQyICkgewogICAgJEFsbG9jYXRpb245T2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uOU9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDEwCm15IEBBbGxvY2F0aW9uMTAgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uMTBDb3VudCA9IEBBbGxvY2F0aW9uMTA7Cm15ICRBbGxvY2F0aW9uMTBPayAgICA9IDA7CmlmICggJEFsbG9jYXRpb24xMENvdW50IGVxIDEgJiYgJEFsbG9jYXRpb24xMFswXSBlcSAkU2VydmljZUlEMiApIHsKICAgICRBbGxvY2F0aW9uMTBPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xME9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTAoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxMQpteSBAQWxsb2NhdGlvbjExID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uMTEsCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxMSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDEyCm15IEBBbGxvY2F0aW9uMTIgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uMTJDb3VudCA9IEBBbGxvY2F0aW9uMTI7Cm15ICRBbGxvY2F0aW9uMTJPayAgICA9IDA7CmlmICggJEFsbG9jYXRpb24xMkNvdW50IGVxIDEgJiYgJEFsbG9jYXRpb24xMlswXSBlcSAkU2VydmljZUlEMSApIHsKICAgICRBbGxvY2F0aW9uMTJPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xMk9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTIoKScsCik7CgojIHNldCBhbGxvY2F0aW9uIDMKJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRDEsCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRDIsCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDEzCm15IEBBbGxvY2F0aW9uMTMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgpteSAkQWxsb2NhdGlvbjEzQ291bnQgPSBAQWxsb2NhdGlvbjEzOwpteSAkQWxsb2NhdGlvbjEzT2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uMTNDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uMTNbMF0gZXEgJFNlcnZpY2VJRDIgKSB7CiAgICAkQWxsb2NhdGlvbjEzT2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uMTNPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDEzKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMTQKbXkgQEFsbG9jYXRpb24xNCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb24xNENvdW50ID0gQEFsbG9jYXRpb24xNDsKbXkgJEFsbG9jYXRpb24xNE9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjE0Q291bnQgZXEgMSAmJiAkQWxsb2NhdGlvbjE0WzBdIGVxICRTZXJ2aWNlSUQyICkgewogICAgJEFsbG9jYXRpb24xNE9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjE0T2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxNCgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDE1Cm15IEBBbGxvY2F0aW9uMTUgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgpteSAkQWxsb2NhdGlvbjE1Q291bnQgPSBAQWxsb2NhdGlvbjE1OwpteSAkQWxsb2NhdGlvbjE1T2sgICAgPSAwOwppZiAoCiAgICAkQWxsb2NhdGlvbjE1Q291bnQgZXEgMiAmJiAoCiAgICAgICAgKCAkQWxsb2NhdGlvbjE1WzBdIGVxICRTZXJ2aWNlSUQxICYmICRBbGxvY2F0aW9uMTVbMV0gZXEgJFNlcnZpY2VJRDIgKSB8fAogICAgICAgICggJEFsbG9jYXRpb24xNVswXSBlcSAkU2VydmljZUlEMiAmJiAkQWxsb2NhdGlvbjE1WzFdIGVxICRTZXJ2aWNlSUQxICkKICAgICkKICAgICkKewogICAgJEFsbG9jYXRpb24xNU9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjE1T2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxNSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDE2Cm15IEBBbGxvY2F0aW9uMTYgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uMTZDb3VudCA9IEBBbGxvY2F0aW9uMTY7Cm15ICRBbGxvY2F0aW9uMTZPayAgICA9IDA7CmlmICgKICAgICRBbGxvY2F0aW9uMTZDb3VudCBlcSAyICYmICgKICAgICAgICAoICRBbGxvY2F0aW9uMTZbMF0gZXEgJFNlcnZpY2VJRDEgJiYgJEFsbG9jYXRpb24xNlsxXSBlcSAkU2VydmljZUlEMiApIHx8CiAgICAgICAgKCAkQWxsb2NhdGlvbjE2WzBdIGVxICRTZXJ2aWNlSUQyICYmICRBbGxvY2F0aW9uMTZbMV0gZXEgJFNlcnZpY2VJRDEgKQogICAgKQogICAgKQp7CiAgICAkQWxsb2NhdGlvbjE2T2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uMTZPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDE2KCknLAopOwoKIyBkZWxldGUgYWxsIHRlc3QgYWxsb2NhdGlvbnMgdG8gY2xlYW4gc3lzdGVtCiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQyLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQyLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQyLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIHJlc3RvcmUgYWxsIG9yaWdpbmFsIGRlZmF1bHQgc2VydmljZXMKZm9yIG15ICRTZXJ2aWNlSUQgKEBPcmlnaW5hbERlZmF1bHRTZXJ2aWNlcykgewogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cn0KCiMgc2V0IHNlcnZpY2UxIGludmFsaWQKbXkgJFNlcnZpY2VVcGRhdGUxID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVVwZGF0ZSgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlEMSwKICAgIE5hbWUgICAgICA9PiAkU2VydmljZVJhbmQxLAogICAgVmFsaWRJRCAgID0+IDIsCiAgICBVc2VySUQgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlVXBkYXRlMSwKICAgICdTZXJ2aWNlVXBkYXRlMSgpJywKKTsKCiMgc2V0IHNlcnZpY2UyIGludmFsaWQKbXkgJFNlcnZpY2VVcGRhdGUyID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZVVwZGF0ZSgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlEMiwKICAgIE5hbWUgICAgICA9PiAkU2VydmljZVJhbmQyLAogICAgVmFsaWRJRCAgID0+IDIsCiAgICBVc2VySUQgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlVXBkYXRlMiwKICAgICdTZXJ2aWNlVXBkYXRlMigpJywKKTsKCjE7Cg==
IyAtLQojIElUU01DSVBBbGxvY2F0ZS50IC0gZ2VuZXJhbCBjYXRhbG9nIHRlc3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ0lQQWxsb2NhdGUudCx2IDEuNiAyMDA4LzAzLzA2IDE3OjAyOjI0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwoKJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoICV7JFNlbGZ9ICk7CgojIGdldCBjdXJyZW50IGFsbG9jYXRpb24gbGlzdCAoVXNlcklEIGlzIG5lZWRlZCkKbXkgJEFsbG9jYXRlRGF0YTEgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KCk7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKCAkQWxsb2NhdGVEYXRhMSwgJ0FsbG9jYXRlTGlzdCgpJyApOwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QKbXkgJEFsbG9jYXRlRGF0YTIgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPlRydWUoICRBbGxvY2F0ZURhdGEyLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJEhhc2hPSyA9IDE7CmlmICggcmVmICRBbGxvY2F0ZURhdGEyIG5lICdIQVNIJyApIHsKICAgICRIYXNoT0sgPSAwOwp9CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIDJkIGhhc2gKaWYgKCRIYXNoT0spIHsKCiAgICBJTVBBQ1RJRDoKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7JEFsbG9jYXRlRGF0YTJ9ICkgewoKICAgICAgICBpZiAoIHJlZiAkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkSGFzaE9LID0gMDsKICAgICAgICAgICAgbGFzdCBJTVBBQ1RJRDsKICAgICAgICB9CgogICAgICAgIENSSVRJQ0FMSVRZSUQ6CiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eUlEICgga2V5cyAleyAkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0gfSApIHsKCiAgICAgICAgICAgIGlmICggISRDcml0aWNhbGl0eUlEIHx8ICEkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAkSGFzaE9LID0gMDsKICAgICAgICAgICAgICAgIGxhc3QgSU1QQUNUSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2hlY2sgSGFzaE9LCiRTZWxmLT5UcnVlKCAkSGFzaE9LLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoIChub3QgYWxsIG5lZWRlZCBhcmd1bWVudHMgZ2l2ZW4pCm15ICRTdWNjZXNzMSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSggJFN1Y2Nlc3MxLCAnQWxsb2NhdGVVcGRhdGUoKScgKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJFN1Y2Nlc3MyID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgQWxsb2NhdGVEYXRhID0+ICRBbGxvY2F0ZURhdGEyLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSggJFN1Y2Nlc3MyLCAnQWxsb2NhdGVVcGRhdGUoKScgKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKGFsbG9jYXRpb24gaGFzaCkKbXkgJFN1Y2Nlc3MzID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgQWxsb2NhdGVEYXRhID0+IHsKICAgICAgICBUZXN0ICA9PiAnYWFhJywKICAgICAgICBUZXN0MiA9PiAnYmJiJywKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoICRTdWNjZXNzMywgJ0FsbG9jYXRlVXBkYXRlKCknICk7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoCm15ICRTdWNjZXNzNCA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiAkQWxsb2NhdGVEYXRhMiwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5UcnVlKCAkU3VjY2VzczQsICdBbGxvY2F0ZVVwZGF0ZSgpJyApOwoKMTsK
IyAtLQojIFNlcnZpY2UudCAtIFNlcnZpY2UgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNlcnZpY2UudCx2IDEuMSAyMDA4LzA2LzE5IDEyOjM5OjMyIHViIEV4cCAkCiMgJE9sZElkOiBTZXJ2aWNlLnQsdiAxLjkgMjAwOC8wNS8xNSAyMjowNTo0NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CgokU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnU2VydmljZScgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1TZXJ2aWNlLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtU2VydmljZS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIHNlcnZpY2UgbmFtZXMKbXkgQFNlcnZpY2VOYW1lOwpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDExICkgewogICAgcHVzaCBAU2VydmljZU5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgZ2V0IG9yaWdpbmFsIHNlcnZpY2UgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzCm15ICVTZXJ2aWNlTGlzdE9yaWdpbmFsID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU2VydmljZU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICBUeXBlSUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAojIC0tLQoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFNlcnZpY2VOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpcyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgVHlwZUlEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZXJ2aWNlTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKIyAtLS0KCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQyJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAyLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbMV0sCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1Rlc3RDb21tZW50MicsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAzLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2VydmljZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICdUZXN0Q29tbWVudDJVUERBVEUyJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gNCwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiA1LAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUyJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gNCwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiA1LAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMycsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJzo6VVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnOjpUZXN0OjpVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsyXSAuICc6OlRlc3QnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJzo6VGVzdCcgLiAkU2VydmljZU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMl0gLiAnOjpUZXN0OjpUZXN0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsyXSAuICdUZXN0OjonLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRTZXJ2aWNlTmFtZVszXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzNdLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzNdLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRTZXJ2aWNlTmFtZVszXSAuICIgVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzNdIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVszXSAuICcgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54gJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPnicsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAn0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54gVVBEQVRFMScsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgJyAuICRTZXJ2aWNlTmFtZVs4XSAuICcgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1t0ZXN0XSUqXFwgJyAuICRTZXJ2aWNlTmFtZVs4XSAuICcgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBbdGVzdF0lKlxcJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodXNlZCBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0cykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs1XSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVs1XSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs1XSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHBhcmVudCBzZXJ2aWNlIGNoZWNrKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbNl0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVs1XSAuICc6OicgLiAkU2VydmljZU5hbWVbNl0sCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbNl0sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChwYXJlbnQgc2VydmljZSBjaGVjaykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCA9PiAnTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gIiBcbiBcdCAiIC4gJFNlcnZpY2VOYW1lWzddIC4gIiBcbiBcdCAiLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJ0xBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbNV0gLiAnOjonIC4gJFNlcnZpY2VOYW1lWzZdIC4gJzo6JyAuICRTZXJ2aWNlTmFtZVs3XSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs3XSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2UgbXVzdCBiZSBOT1QgdXBkYXRlZCAocGFyZW50IHNlcnZpY2UgaWQgYW5kIHBhcmVudCBpZCBhcmUgaWRlbnRpY2FsKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChtb3ZlIHNlcnZpY2UgdG8gdGhlIGhpZ2hlcnN0IGxldmVsKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzddIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAobW92ZSBzZXJ2aWNlIGJhY2sgd2l0aCB0aGUgb2xkIHBhcmVudCBzZXJ2aWNlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFNlcnZpY2VOYW1lWzddIC4gJyBVUERBVEUoMiknLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCA9PiAnTEFTVExBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs1XSAuICc6OicKICAgICAgICAgICAgICAgIC4gJFNlcnZpY2VOYW1lWzZdIC4gJzo6JwogICAgICAgICAgICAgICAgLiAkU2VydmljZU5hbWVbN10KICAgICAgICAgICAgICAgIC4gJyBVUERBVEUoMiknLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzddIC4gJyBVUERBVEUoMiknLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7Cm15ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwpteSAkQWRkZWRDb3VudGVyID0gMDsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBwcmVwYXJlIHBhcmVudCBpZAogICAgICAgIGlmICggJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9ICYmICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSBlcSAnTEFTVEFERElEJyApIHsKICAgICAgICAgICAgJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9ID0gJExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9IGVxICdMQVNUTEFTVEFERElEJyApIHsKICAgICAgICAgICAgJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9ID0gJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbmV3IHNlcnZpY2UKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUFkZCgKICAgICAgICAgICAgJXsgJEl0ZW0tPntBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgcGFyZW50IGlkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9ICYmICRJdGVtLT57QWRkR2V0fS0+e1BhcmVudElEfSBlcSAnTEFTVEFERElEJyApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+e1BhcmVudElEfSA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0FkZEdldH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9IGVxICdMQVNUTEFTVEFERElEJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+e1BhcmVudElEfSA9ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlQWRkKCkgLSBTZXJ2aWNlSUQ6ICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTZXJ2aWNlSUQpIHsKCiAgICAgICAgICAgICAgICAjIGxvb2t1cCBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkU2VydmljZU5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUxvb2t1cCgpIC0gbG9va3VwIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0aGUgc2VydmljZSBpZAogICAgICAgICAgICAgICAgbXkgJFNlcnZpY2VJRE5ldyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VydmljZU5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGVzdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlSUROZXcgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgJFNlcnZpY2VJRCAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTG9va3VwKCkgLSByZXZlcnNlIGxvb2t1cCIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3Qgc2VydmljZSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQgPSAkTGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgICAgICAgICAgJExhc3RBZGRlZFNlcnZpY2VJRCAgICAgPSAkU2VydmljZUlEOwoKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50IHRoZSBhZGRlZCBjb3VudGVyCiAgICAgICAgICAgICAgICAkQWRkZWRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHNlcnZpY2UKICAgICAgICBteSAlU2VydmljZUdldCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNlcnZpY2UgZGF0YSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2VydmljZQogICAgICAgIGZvciBteSAkU2VydmljZUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZXJ2aWNlR2V0eyRTZXJ2aWNlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRTZXJ2aWNlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VHZXQoKSAtICRTZXJ2aWNlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBzZXJ2aWNlIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJExhc3RBZGRlZFNlcnZpY2VJRCApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgU0VSVklDRSBJRCBHSVZFTiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgcGFyZW50IGlkCiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntVcGRhdGV9LT57UGFyZW50SUR9IGVxICdMQVNUQURESUQnICkgewogICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gPSAkTGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gZXEgJ0xBU1RMQVNUQURESUQnICkgewogICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gPSAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH07CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc2VydmljZQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgU2VydmljZUlEID0+ICRMYXN0QWRkZWRTZXJ2aWNlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZVVwZGF0ZSgpIC0gU2VydmljZUlEOiAkTGFzdEFkZGVkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIHBhcmVudCBpZAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9ICYmICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfSBlcSAnTEFTVEFERElEJyApIHsKICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9ID0gJExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0KICAgICAgICAgICAgJiYgJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9IGVxICdMQVNUTEFTVEFERElEJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0gPSAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGUKICAgICAgICBteSAlU2VydmljZUdldDIgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJExhc3RBZGRlZFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzZXJ2aWNlIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNlcnZpY2VHZXQyeyRTZXJ2aWNlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRTZXJ2aWNlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VHZXQoKSAtICRTZXJ2aWNlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIHNlcnZpY2UgbmFtZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUdldDJ7U2VydmljZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb2t1cCB0ZXN0CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VydmljZU5hbWUgfHwgJycsCiAgICAgICAgICAgICRTZXJ2aWNlR2V0MntOYW1lfSB8fCAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUxvb2t1cCgpIC0gbG9va3VwIiwKICAgICAgICApOwoKICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRoZSBzZXJ2aWNlIGlkCiAgICAgICAgbXkgJFNlcnZpY2VJRE5ldyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJFNlcnZpY2VOYW1lIHx8ICcnLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGVzdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlcnZpY2VJRE5ldyB8fCAnJywKICAgICAgICAgICAgJFNlcnZpY2VHZXQye1NlcnZpY2VJRH0gfHwgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICApOwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAlU2VydmljZUxpc3QxID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwpteSAlU2VydmljZUxpc3QxT3JnID0gJVNlcnZpY2VMaXN0T3JpZ2luYWw7CgpTRVJWSUNFSUQ6CmZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZUxpc3QxT3JnICkgewoKICAgIGlmICggJFNlcnZpY2VMaXN0MXskU2VydmljZUlEfSAmJiAkU2VydmljZUxpc3QxT3JneyRTZXJ2aWNlSUR9IGVxICRTZXJ2aWNlTGlzdDF7JFNlcnZpY2VJRH0gKSB7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdDF7JFNlcnZpY2VJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VydmljZUxpc3Qxe0R1bW15fSA9IDE7CiAgICB9Cn0KCm15ICRTZXJ2aWNlTGlzdDFDb3VudCA9IHNjYWxhciBrZXlzICVTZXJ2aWNlTGlzdDE7CgokU2VsZi0+SXMoCiAgICAkU2VydmljZUxpc3QxQ291bnQgfHwgJycsCiAgICAkQWRkZWRDb3VudGVyICAgICAgfHwgJycsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTGlzdCgpIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBTZXJ2aWNlTGlzdCB0ZXN0IDIgKGNoZWNrIGNhY2hlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAlU2VydmljZUxpc3QyID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKbXkgJFNlcnZpY2VMaXN0MlNlcnZpY2VJRCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs5XSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eUlEID0+IDEsCiMgLS0tCik7CgpteSAlU2VydmljZUxpc3QyYiA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgVmFsaWQgID0+IDAsCiAgICBVc2VySUQgPT4gMSwKKTsKClNFUlZJQ0VJRDoKZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlTGlzdDIgKSB7CgogICAgaWYgKCAkU2VydmljZUxpc3QyYnskU2VydmljZUlEfSAmJiAkU2VydmljZUxpc3QyeyRTZXJ2aWNlSUR9IGVxICRTZXJ2aWNlTGlzdDJieyRTZXJ2aWNlSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3QyYnskU2VydmljZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZXJ2aWNlTGlzdDJie0R1bW15fSA9IDE7CiAgICB9Cn0KCm15IEBTZXJ2aWNlTGlzdDJJRHMgICA9IGtleXMgJVNlcnZpY2VMaXN0MmI7Cm15ICRTZXJ2aWNlTGlzdDJDb3VudCA9IHNjYWxhciBAU2VydmljZUxpc3QySURzOwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VMaXN0MkNvdW50IHx8ICcnLAogICAgMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMaXN0KCkgLSBjaGVjayBudW1iZXIgb2Ygc2VydmljZXMiLAopOwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VMaXN0MklEc1swXSB8fCAnJywKICAgICRTZXJ2aWNlTGlzdDJTZXJ2aWNlSUQgfHwgJycsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTGlzdCgpIC0gY2hlY2sgaWQgb2YgbGFzdCBzZXJ2aWNlIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBTZXJ2aWNlU2VhcmNoIHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSBAU2VydmljZVNlYXJjaDFTZWFyY2ggPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlU2VhcmNoKAogICAgVXNlcklEID0+IDEsCik7CgpteSAlU2VydmljZVNlYXJjaDFMaXN0ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKClNFUlZJQ0VJRDoKZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlU2VhcmNoMVNlYXJjaCkgewoKICAgIGlmICggJFNlcnZpY2VTZWFyY2gxTGlzdHskU2VydmljZUlEfSApIHsKICAgICAgICBkZWxldGUgJFNlcnZpY2VTZWFyY2gxTGlzdHskU2VydmljZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZXJ2aWNlU2VhcmNoMUxpc3R7RHVtbXl9ID0gMTsKICAgIH0KfQoKbXkgJFNlcnZpY2VTZWFyY2gxQ291bnQgPSBzY2FsYXIga2V5cyAlU2VydmljZVNlYXJjaDFMaXN0OwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VTZWFyY2gxQ291bnQsCiAgICAwLAogICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZVNlYXJjaCgpIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyBmb3IgbGF0ZXIgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBhZGQgc29tZSBuZWVkZWQgc2VydmljZXMgZm9yIGxhdGVyIHRlc3RzCm15IEBTZXJ2aWNlTmFtZXMgPSAoICRTZXJ2aWNlTmFtZVsxMF0gLiAnTm9ybWFsJywgJFNlcnZpY2VOYW1lWzEwXSAuICfUiCDTtCDPqiDPvicgKTsKbXkgJVNlcnZpY2VTZWFyY2gyU2VydmljZUlEOwoKbXkgJENvdW50ZXIxID0gMDsKZm9yIG15ICRTZXJ2aWNlTmFtZSAoQFNlcnZpY2VOYW1lcykgewoKICAgICRTZXJ2aWNlU2VhcmNoMlNlcnZpY2VJRHskQ291bnRlcjF9ID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAxLAojIC0tLQogICAgKTsKCiAgICAkQ291bnRlcjErKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VTZWFyY2ggdGVzdCAyIChnZW5lcmFsIG5hbWUgY2hlY2tzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ291bnRlcjIgPSAwOwpmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZU5hbWVzKSB7CgogICAgbXkgQFByZXBhcmVkTmFtZXMgPSAoCiAgICAgICAgJFNlcnZpY2VOYW1lLAogICAgICAgICcqJyAuICRTZXJ2aWNlTmFtZSwKICAgICAgICAkU2VydmljZU5hbWUgLiAnKicsCiAgICAgICAgJyonIC4gJFNlcnZpY2VOYW1lIC4gJyonLAogICAgICAgICcqKicgLiAkU2VydmljZU5hbWUsCiAgICAgICAgJFNlcnZpY2VOYW1lIC4gJyoqJywKICAgICAgICAnKionIC4gJFNlcnZpY2VOYW1lIC4gJyoqJywKICAgICk7CgogICAgZm9yIG15ICRQcmVwYXJlZE5hbWUgKEBQcmVwYXJlZE5hbWVzKSB7CgogICAgICAgIG15IEBTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VTZWFyY2goCiAgICAgICAgICAgIE5hbWUgICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlcnZpY2VMaXN0WzBdIHx8ICcnLAogICAgICAgICAgICAkU2VydmljZVNlYXJjaDJTZXJ2aWNlSUR7JENvdW50ZXIyfSB8fCAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZVNlYXJjaCgpIC0gZ2VuZXJhbCBuYW1lIGNoZWNrIiwKICAgICAgICApOwoKICAgICAgICAkVGVzdENvdW50Kys7CiAgICB9CgogICAgJENvdW50ZXIyKys7Cn0KCjE7Cg==
IyAtLQojIFNMQS50IC0gU0xBIHRlc3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTTEEudCx2IDEuMiAyMDA4LzA3LzAyIDEyOjIwOjQwIG1oIEV4cCAkCiMgJE9sZElkOiBTTEEudCx2IDEuOSAyMDA4LzA1LzEwIDEwOjI4OjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CgokU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntTTEFPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnU0xBJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LVNMQS0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LVNMQS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIHNlcnZpY2UgbmFtZXMKbXkgQFNMQU5hbWU7CmZvciBteSAkQ291bnRlciAoIDEgLi4gMTAgKSB7CiAgICBwdXNoIEBTTEFOYW1lLCAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwp9CgojIGNyZWF0ZSBzb21lIHRlc3Qgc2VydmljZXMKbXkgQFNlcnZpY2VJRHM7CmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAjIGFkZCBhIHNlcnZpY2UKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0LVNMQScgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMSwKIyAtLS0KICAgICk7CgogICAgcHVzaCBAU2VydmljZUlEcywgJFNlcnZpY2VJRDsKfQoKIyBnZXQgb3JpZ2luYWwgc2xhIGxpc3QgZm9yIGxhdGVyIGNoZWNrcwpteSAlU0xBTGlzdE9yaWdpbmFsID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgVmFsaWQgID0+IDAsCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSXRlbURhdGEgPSBbCgogICAgIyB0aGlzIHNsYSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFNMQU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyB0aGlzIHNsYSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCgogICAgIyBzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHNlcnZpY2UgaWRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHNlcnZpY2UgaWRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2xhIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFNMQU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2xhIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoY2hlY2sgdGhlIHJldHVybmVkIHNlcnZpY2UgaWQgYXJyYXkpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVsxXSwKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoY2hlY2sgdGhlIHNvcnRpbmcgb2YgdGhlIHJldHVybmVkIHNlcnZpY2UgaWQgYXJyYXkpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzFdLCAkU2VydmljZUlEc1swXSBdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzJdLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzBdLCAkU2VydmljZUlEc1sxXSBdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzJdLAogICAgICAgICAgICBDYWxlbmRhciAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2xhIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMV0sICRTZXJ2aWNlSURzWzJdLCAkU2VydmljZUlEc1swXSBdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzNdLAogICAgICAgICAgICBDYWxlbmRhciAgID0+ICcxJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAxMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAyMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA0MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA2MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDInLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyAkU2VydmljZUlEc1swXSwgJFNlcnZpY2VJRHNbMV0sICRTZXJ2aWNlSURzWzJdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbM10sCiAgICAgICAgICAgIENhbGVuZGFyICAgPT4gJzEnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDEwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDIwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDMwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDQwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDUwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDYwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MicsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2xhIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2xhIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzbGEgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChzbGEgdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUyJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMjAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMzAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gNDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNjAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gNzAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDIwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDMwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDQwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDUwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDYwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDcwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNsYSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMl0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUzJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnMicsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMzAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gNDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gNTAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gNjAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNzAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gODAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMycsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAkU2VydmljZUlEc1syXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAzMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA0MCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiA1MCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA2MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA3MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA4MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUzJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNsYSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiIFx0IFxuIFxyICIgLiAkU0xBTmFtZVs0XSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbNF0sCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzbGEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyAkU2VydmljZUlEc1sxXSBdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICIgXHQgXG4gXHIgIiAuICRTTEFOYW1lWzRdIC4gIiBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAkU2VydmljZUlEc1sxXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzRdIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVs1XSAuICcgz5Igz6Egxqkgz54gJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAzLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVs1XSAuICcgz5Igz6Egxqkgz54nLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2xhIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzVdIC4gJyDPkiDPoSDGqSDPniBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pIFVQREFURTEnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzVdIC4gJyDPkiDPoSDGqSDPniBVUERBVEUxJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzbGEgbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJyBbdGVzdF0lKlxcICcgLiAkU0xBTmFtZVs2XSAuICcgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNMQU5hbWVbNl0gLiAnIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNsYSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJyBbdGVzdF0lKlxcICcgLiAkU0xBTmFtZVs2XSAuICcgVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdbdGVzdF0lKlxcICcgLiAkU0xBTmFtZVs2XSAuICcgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKbXkgJExhc3RBZGRlZFNMQUlEOwpteSAkQWRkZWRDb3VudGVyID0gMDsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IHNsYQogICAgICAgIG15ICRTTEFJRCA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBQWRkKAogICAgICAgICAgICAleyAkSXRlbS0+e0FkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNsYSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU0xBSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFBZGQoKSAtIFNMQUlEOiAkU0xBSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTTEFJRCkgewoKICAgICAgICAgICAgICAgICMgbG9va3VwIHNsYSBuYW1lCiAgICAgICAgICAgICAgICBteSAkU0xBTmFtZSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsb29rdXAgdGVzdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTTEFOYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUxvb2t1cCgpIC0gbG9va3VwIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0aGUgc2xhIGlkCiAgICAgICAgICAgICAgICBteSAkU0xBSUROZXcgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRTTEFOYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRlc3QKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkU0xBSUROZXcgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgJFNMQUlEICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUxvb2t1cCgpIC0gcmV2ZXJzZSBsb29rdXAiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBsYXN0IHNsYSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZFNMQUlEID0gJFNMQUlEOwoKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50IHRoZSBhZGRlZCBjb3VudGVyCiAgICAgICAgICAgICAgICAkQWRkZWRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRTTEFJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUFkZCgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNsYSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHNsYQogICAgICAgIG15ICVTTEFHZXQgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgU0xBSUQgID0+ICRTTEFJRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0sCiAgICAgICAgICAgIENhY2hlICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgogICAgICAgICMgY2hlY2sgc2xhIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHNsYQogICAgICAgIGZvciBteSAkU0xBQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKCiAgICAgICAgICAgICMgZHVtcCB0aGUgZ2l2ZW4gYXR0cmlidXRlCiAgICAgICAgICAgIGlmICggcmVmICRTTEFHZXR7JFNMQUF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkU0xBR2V0eyRTTEFBdHRyaWJ1dGV9ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRTTEFHZXR7JFNMQUF0dHJpYnV0ZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2Ugc3RyaW5nCiAgICAgICAgICAgIGlmICggcmVmICRJdGVtLT57QWRkR2V0fS0+eyRTTEFBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFNMQUF0dHJpYnV0ZX0gPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskU0xBQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTTEFHZXR7JFNMQUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskU0xBQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUdldCgpIC0gJFNMQUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3Qgc2xhIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJExhc3RBZGRlZFNMQUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBTRVJWSUNFIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzbGEKICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFVcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBTTEFJRCA9PiAkTGFzdEFkZGVkU0xBSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzbGEgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFVcGRhdGUoKSAtIFNMQUlEOiAkTGFzdEFkZGVkU0xBSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNsYSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICVTTEFHZXQyID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFHZXQoCiAgICAgICAgICAgIFNMQUlEICA9PiAkTGFzdEFkZGVkU0xBSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgc2xhIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRTTEFBdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewoKICAgICAgICAgICAgIyBkdW1wIHRoZSBnaXZlbiBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgKCByZWYgJFNMQUdldDJ7JFNMQUF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkU0xBR2V0MnskU0xBQXR0cmlidXRlfSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkU0xBR2V0MnskU0xBQXR0cmlidXRlfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCByZWYgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFNMQUF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskU0xBQXR0cmlidXRlfSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKAogICAgICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRTTEFBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNMQUdldDJ7JFNMQUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskU0xBQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUdldCgpIC0gJFNMQUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzbGEgbmFtZQogICAgICAgIG15ICRTTEFOYW1lID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMb29rdXAoCiAgICAgICAgICAgIFNMQUlEID0+ICRTTEFHZXQye1NMQUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb2t1cCB0ZXN0CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU0xBTmFtZSB8fCAnJywKICAgICAgICAgICAgJFNMQUdldDJ7TmFtZX0gfHwgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQUxvb2t1cCgpIC0gbG9va3VwIiwKICAgICAgICApOwoKICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRoZSBzbGEgaWQKICAgICAgICBteSAkU0xBSUROZXcgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkU0xBTmFtZSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTTEFJRE5ldyB8fCAnJywKICAgICAgICAgICAgJFNMQUdldDJ7U0xBSUR9IHx8ICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICApOwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNMQUxpc3QgdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVTTEFMaXN0MSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7Cm15ICVTTEFMaXN0MU9yZyA9ICVTTEFMaXN0T3JpZ2luYWw7CgpTRVJWSUNFSUQ6CmZvciBteSAkU0xBSUQgKCBrZXlzICVTTEFMaXN0MU9yZyApIHsKCiAgICBpZiAoICRTTEFMaXN0MXskU0xBSUR9ICYmICRTTEFMaXN0MU9yZ3skU0xBSUR9IGVxICRTTEFMaXN0MXskU0xBSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU0xBTGlzdDF7JFNMQUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTTEFMaXN0MXtEdW1teX0gPSAxOwogICAgfQp9CgpteSAkU0xBTGlzdDFDb3VudCA9IHNjYWxhciBrZXlzICVTTEFMaXN0MTsKCiRTZWxmLT5JcygKICAgICRTTEFMaXN0MUNvdW50IHx8ICcnLAogICAgJEFkZGVkQ291bnRlciAgfHwgJycsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMaXN0KCkiLAopOwoKMTsK
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAFEElEQVR42qyVe2xTZRjGn9Oe9vS+tuvaddeuG2MUt0E22IAxMExBN3UzwGSMzEsIzhg0RjHBRI2XP9QEVGRAohiFMCKMWyI4hpvIZZNsMjd62YVu67a2o7uWXs9pz/EPI3LRAYm//758yfO+eb7ne18e7qKyciMEAgEAEBaLbUdV1cZlAFD78lakpBjwoJC3H9TqWFV5efk7HE9hFkukxenpc54vLl4p4wkTSpYV5UtHRh1NDsdgE0EQ4DhuVmE+ACgUCixcmIe8gifrt7/92osmk2l5KBwtDIVZwpiemScQ8Be/ULNu5enGCxGXc/jknIwsuMec9xfW6xPit29/v8o95skjSHmafcgtTklJJEiSRDBEQx2rEYTDUbiczsCi/IIIx7Jys6XLcV8r5ucsrS1eUfJuStp89PQNIs2QBKGAhEQiQjhMIxAIYWDIhfWVVct8fnqZrdd+BMDFWTsmCAK9PV2XxLL4V/gCqSROo0KEYTE84kZb6+WpUCgqoCgxjyRJDDrcaG5pZusPfLWeYejxWYWlUhm/pmZLWVq6qVJISQVSiRh+P409uz/59uB3Xz7b0d7mzFlYtEYuk8HhcEOl0hA6rTYw6nT87rs5E/wvYZ5cHrOgZHXlcb3eIAFHgGU5KOQS0OHpHw2GVHcoNHNUKhH4GDoKuUwCDgQy5i56SyZTPn3LT5IERVF3dry6bFPB2cbjDkokz47XJ1NiSghljBxFRUU5hQWLx8rK1m7LzHwkl+NYsBwwODSIUye/3zU/p0Bss7S3sCyLNIMRScmpcLv/SQrZcLjuhEKh/LW8vLpaRJEKESWAiBJAFzc3a06G6Qg4Dv5AAOEwBZksCqFQiiG7reFK69nzO3d+gbq63WCYCHg83p1WAEBSckbFxKQ3wWa10HK5CFIJBZpmEAwGEQyFIBQKEBsrh31ggLVauzmVJrEUAEwmk4kkSQnLsmBZ9t4cj4+7HJcvnj7R12uxJ6ZmlyQn66DVKEFRfIjFQkRZFm3tZny+4+P6ftvFD58qfVwnFFIzmzfXXhgc9uizMtOFsTpDdefVtmaCIAAAxO1V4rSJJeuq3mzqtbbbjEajNsuUq/Z6Z6ItP5+2JKSYsi+1HNuWlZnUve/r+jNO1xgrogQ8hVzG6fU6Yu+eXT8crj9UabVdg9/vuysiPL5OpY6vBRAPIOuJZ7Y4CpeXnwdAyWSq6gMHG8xnz10ZvXDZwk1Phzma5jifL8KNjE5zZsuQ92hDi3nevOwVt6z4G47j/KGgrx2AD8D46HCfwznSdyYaZfppOtRlNM4tzl2wdIkxVY+evmH81Njsn5oOkBKplKAZUB0dnXT9oX0fAQjwZ/s9ESZsjUaZQQAor9hQUbyy9CWJVKaMRgl8s39/6wfvbV1iNlvZ/EWPFrlcN0AzrFCtjmOCAZ+HfND5Oj4+kT817U8Simbg9zPIz8slBx5bFc7JKWT9vgAmJr3wen3U9f6eNM/4mJLAQ7Cp5vVja0o3VExOeKCP18BoSIh4Jmb43dd6CUoshr2/Z3TnZ2/kANwk74E3AimIoZnovM6rrbRWq8TwiAuN51rJjqtmQq1WIOCbYuz2PmmsJqHgnsebDZZlGXP3lcNjrtGbKk3yKqMxETqdGgq5GNNeP35pafrj1LG9S4KBmzYAkYey4q9toy6OUerWejwjnRXrX/30el9Xh/Xaby0ikcTrueGow/9BjFL7HCWS5P/b3Z8DADulJ5doF3IEAAAAAElFTkSuQmCC
IyAtLQojIElUU01Db3JlLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db3JlLnBtLHYgMS42IDIwMDgvMDcvMTUgMDk6MTU6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUNvcmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpJVFNNQ29yZS5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSBJVFNNQ29yZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQcmlvcml0eU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGFuZ2UgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgSVRTTSBibHVlCiAgICAkU2VsZi0+X0JhY2tncm91bmRDb2xvckNoYW5nZSgKICAgICAgICBPbGRDb2xvciA9PiAnYmJkZGZmJywKICAgICAgICBOZXdDb2xvciA9PiAnMDAzMzk5JywKICAgICk7CgogICAgIyBzZXQgZGVmYXVsdCBDSVAgbWF0cml4CiAgICAkU2VsZi0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1zZXJ2aWNlCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLXNlcnZpY2UnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBTZXJ2aWNlIG1hc2sgYWNjZXNzIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hhbmdlIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIElUU00gYmx1ZQogICAgJFNlbGYtPl9CYWNrZ3JvdW5kQ29sb3JDaGFuZ2UoCiAgICAgICAgT2xkQ29sb3IgPT4gJ2JiZGRmZicsCiAgICAgICAgTmV3Q29sb3IgPT4gJzAwMzM5OScsCiAgICApOwoKICAgICMgc2V0IGRlZmF1bHQgQ0lQIG1hdHJpeAogICAgJFNlbGYtPl9DSVBEZWZhdWx0TWF0cml4U2V0KCk7CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tc2VydmljZQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1zZXJ2aWNlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gU2VydmljZSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgZGVmYXVsdCBDSVAgbWF0cml4CiAgICAkU2VsZi0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZXN0b3JlIHRoZSBvcmlnaW5hbCBiYWNrZ3JvdW5kCiAgICAkU2VsZi0+X0JhY2tncm91bmRDb2xvckNoYW5nZSgKICAgICAgICBPbGRDb2xvciA9PiAnMDAzMzk5JywKICAgICAgICBOZXdDb2xvciA9PiAnYmJkZGZmJywKICAgICk7CgogICAgIyBkZWFjdGl2YXRlIHRoZSBncm91cCBpdHNtLXNlcnZpY2UKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tc2VydmljZScsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQmFja2dyb3VuZENvbG9yQ2hhbmdlKCkKCmNoYW5nZSB0aGUgYmFja3JvdW5kIGNvbG9yCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQmFja2dyb3VuZENvbG9yQ2hhbmdlKAogICAgICAgIE9sZENvbG9yID0+ICdiYmRkZmYnLAogICAgICAgIE5ld0NvbG9yID0+ICcwMDMzOTknLAogICAgKTsKCj1jdXQKCnN1YiBfQmFja2dyb3VuZENvbG9yQ2hhbmdlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9sZENvbG9yIE5ld0NvbG9yKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSB0aGUgY3NzIGZpbGUKICAgIG15ICRDc3NGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL2Nzcy5kdGwnOwoKICAgIHJldHVybiAxIGlmIC1lICRDc3NGaWxlIC4gJy5zYXZlJzsKCiAgICAjIHJlYWQgZmlsZSBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgICAgIExvY2F0aW9uICAgICAgICA9PiAkQ3NzRmlsZSwKICAgICAgICBNb2RlICAgICAgICAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgIFJlc3VsdCAgICAgICAgICA9PiAnU0NBTEFSJywKICAgICAgICBEaXNhYmxlV2FybmluZ3MgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ29udGVudDsKICAgIHJldHVybiBpZiByZWYgJENvbnRlbnQgbmUgJ1NDQUxBUic7CiAgICByZXR1cm4gaWYgISR7JENvbnRlbnR9OwoKICAgICMgY2hhbmdlIGJhY2tncm91bmQgY29sb3IKICAgICR7JENvbnRlbnR9ID1+IHN7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvclw6XCMkUGFyYW17T2xkQ29sb3J9XDsKICAgIH17YmFja2dyb3VuZC1jb2xvclw6XCMkUGFyYW17TmV3Q29sb3J9XDt9eG1zOwoKICAgICMgd3JpdGUgbmV3IGNvbnRlbnQgdG8gZmlsZQogICAgJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVdyaXRlKAogICAgICAgIExvY2F0aW9uID0+ICRDc3NGaWxlLAogICAgICAgIENvbnRlbnQgID0+ICRDb250ZW50LAogICAgICAgIE1vZGUgICAgID0+ICdiaW5tb2RlJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9DSVBEZWZhdWx0TWF0cml4U2V0KCkKCnNldCB0aGUgZGVmYXVsdCBDSVAgbWF0cml4CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKPWN1dAoKc3ViIF9DSVBEZWZhdWx0TWF0cml4U2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QKICAgIG15ICRMaXN0ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTGlzdDsKICAgIHJldHVybiBpZiByZWYgJExpc3QgbmUgJ0hBU0gnOwoKICAgICMgc2V0IG5vIG1hdHJpeCBpZiBhbHJlYWR5IGRlZmluZWQKICAgIHJldHVybiBpZiAleyRMaXN0fTsKCiAgICAjIGRlZmluZSB0aGUgYWxsb2NhdGlvbnMKICAgIG15ICVBbGxvY2F0aW9uOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eycxIHZlcnkgbG93J30gICA9ICcxIHZlcnkgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnMiBsb3cnfSAgICAgICAgPSAnMSB2ZXJ5IGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzMgbm9ybWFsJ30gICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnNCBoaWdoJ30gICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eyc1IHZlcnkgaGlnaCd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eycxIHZlcnkgbG93J30gICAgICAgID0gJzEgdmVyeSBsb3cnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnMiBsb3cnfSAgICAgICAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzQgaGlnaCd9ICAgICAgICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnMSB2ZXJ5IGxvdyd9ICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eycyIGxvdyd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzMgbm9ybWFsJ30gICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNCBoaWdoJ30gICAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzEgdmVyeSBsb3cnfSAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnMiBsb3cnfSAgICAgICAgICAgID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc1IHZlcnkgaGlnaCd9ICAgICAgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnMSB2ZXJ5IGxvdyd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eycyIGxvdyd9ICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgID0gJzUgdmVyeSBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzUgdmVyeSBoaWdoJ30gPSAnNSB2ZXJ5IGhpZ2gnOwoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICk7CiAgICBteSAlSW1wYWN0TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEltcGFjdExpc3R9OwoKICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICk7CiAgICBteSAlQ3JpdGljYWxpdHlMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskQ3JpdGljYWxpdHlMaXN0fTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntQcmlvcml0eU9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlUHJpb3JpdHlMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVByaW9yaXR5TGlzdDsKCiAgICAjIGNyZWF0ZSB0aGUgYWxsb2NhdGlvbiBtYXRyaXgKICAgIG15ICVBbGxvY2F0aW9uTWF0cml4OwogICAgSU1QQUNUOgogICAgZm9yIG15ICRJbXBhY3QgKCBrZXlzICVBbGxvY2F0aW9uICkgewoKICAgICAgICBuZXh0IElNUEFDVCBpZiAhJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICAjIGV4dHJhY3QgaW1wYWN0IGlkCiAgICAgICAgbXkgJEltcGFjdElEID0gJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICBDUklUSUNBTElUWToKICAgICAgICBmb3IgbXkgJENyaXRpY2FsaXR5ICgga2V5cyAleyAkQWxsb2NhdGlvbnskSW1wYWN0fSB9ICkgewoKICAgICAgICAgICAgbmV4dCBDUklUSUNBTElUWSBpZiAhJENyaXRpY2FsaXR5TGlzdFJldmVyc2V7JENyaXRpY2FsaXR5fTsKCiAgICAgICAgICAgICMgZXh0cmFjdCBwcmlvcml0eQogICAgICAgICAgICBteSAkUHJpb3JpdHkgPSAkQWxsb2NhdGlvbnskSW1wYWN0fS0+eyRDcml0aWNhbGl0eX07CgogICAgICAgICAgICBuZXh0IENSSVRJQ0FMSVRZIGlmICEkUHJpb3JpdHlMaXN0UmV2ZXJzZXskUHJpb3JpdHl9OwoKICAgICAgICAgICAgIyBleHRyYWN0IGNyaXRpY2FsaXR5IGlkIGFuZCBwcmlvcml0eSBpZAogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlJRCA9ICRDcml0aWNhbGl0eUxpc3RSZXZlcnNleyRDcml0aWNhbGl0eX07CiAgICAgICAgICAgIG15ICRQcmlvcml0eUlEICAgID0gJFByaW9yaXR5TGlzdFJldmVyc2V7JFByaW9yaXR5fTsKCiAgICAgICAgICAgICRBbGxvY2F0aW9uTWF0cml4eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH0gPSAkUHJpb3JpdHlJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBzYXZlIHRoZSBtYXRyaXgKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gXCVBbGxvY2F0aW9uTWF0cml4LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dyb3VwQWRkKCkKCmFkZCBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGdyb3VwIGRlc2NyaXB0aW9uLicsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIERlc2NyaXB0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGNoZWNrIGlmIGdyb3VwIGFscmVhZHkgZXhpc3RzCiAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIHJlYWN0aXZhdGUgdGhlIGdyb3VwCiAgICBpZiAoJEdyb3VwSUQpIHsKCiAgICAgICAgIyBnZXQgY3VycmVudCBncm91cCBkYXRhCiAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJlYWN0aXZhdGUgZ3JvdXAKICAgICAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBVcGRhdGUoCiAgICAgICAgICAgICVHcm91cERhdGEsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBhZGQgdGhlIGdyb3VwCiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgbG9va3VwIHRoZSBuZXcgZ3JvdXAgaWQKICAgIG15ICROZXdHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgYWRkIHVzZXIgcm9vdCB0byB0aGUgZ3JvdXAKICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckFkZCgKICAgICAgICBHSUQgICAgICAgID0+ICROZXdHcm91cElELAogICAgICAgIFVJRCAgICAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgICAgICBydyAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dyb3VwRGVhY3RpdmF0ZSgpCgpkZWFjdGl2YXRlIGEgZ3JvdXAKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAndGhlLWdyb3VwLW5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBEZWFjdGl2YXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIGdyb3VwIGlkCiAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBnZXQgY3VycmVudCBncm91cCBkYXRhCiAgICBteSAlR3JvdXBEYXRhID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwR2V0KAogICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBkZWFjdGl2YXRlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBVcGRhdGUoCiAgICAgICAgJUdyb3VwRGF0YSwKICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle2ludmFsaWR9LAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA4LzA3LzE1IDA5OjE1OjE2ICQKCj1jdXQK
ITSM::Core::Criticality
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Criticality
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::Impact
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Operational
operational
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Warning
warning
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Incident
incident
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
End User Service
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Front End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Back End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Management
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Reporting
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Operational
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Demonstration
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Project
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Training
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Underpinning Contract
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Availability
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Response Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Recovery Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Resolution Rate
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Transactions
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Errors
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Other
1
current_timestamp
1
current_timestamp
1