ITSMIncidentProblemManagement
3.3.95
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 4 beta5.
Build for OTRS::ITSM 4 beta4.
Build for OTRS::ITSM 4 beta3.
Build for OTRS::ITSM 4 beta2.
Build for OTRS::ITSM 4 beta1.
The OTRS::ITSM Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
Paquete Incident and Problem Management de OTRS::ITSM.
4.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de instalar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, the ticket types and states that were added during installation will be deactivated.
They can be activated again in the admin area.
<br/>
<br/>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Ticket-Typen und -Status deaktiviert.
Diese können jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Si usted desinstala este paquete, los tipos de ticket y estados que fueron agregados durante la instalación serán desactivados.
Pueden ser activados de nuevo en el área de admin.
<br/>
<br/>
Las estadísticas asociadas a este paquete no estarán disponibles si desinstala el paquete.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de actualizar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 3.3.95</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
ITSMCore
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# uninstall Feature AddOn OTRSServiceIncidentState that has been integrated in OTRS::ITSM 3.2.91 (OTRS::ITSM 3.3.0 Beta 1)
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSServiceIncidentState',
);
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_3_2_91();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
{
# cleanup stats list
$Kernel::OM->Get('Kernel::System::Stats')->StatsCleanUp();
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2014-10-31 12:28:39
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkZGl0aW9uYWwgSVRTTSBUaWNrZXQgRmllbGRzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5BZGRpdGlvbmFsIElUU00gRmllbGRzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXREZWNpc2lvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpY2tldCBEZWNpc2lvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RGVjaXNpb248L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGlja2V0PC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LlRpY2tldEFjdGlvbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMTUtQWRkdGxJVFNNRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM0MjAtRGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkRlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZGQgYSBkZWNpc2lvbiE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb247VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc24ndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjT3duZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNSZXNwb25zaWJsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPm9wZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+b3BlbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNOb3RlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N1YmplY3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlslIFRyYW5zbGF0ZSgiTm90ZSIpIHwgaHRtbCAlXTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFRleHRBcmVhPjwvVGV4dEFyZWE+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0ludm9sdmVkQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSW5mb3JtQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUHJpb3JpdHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXBhaXJTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZWNvdmVyeVN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUR1ZURhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSGlzdG9yeVR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+QWRkTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNIaXN0b3J5Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4lJUZyZWVUZXh0PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzbid0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1RpY2tldFR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjT3duZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1Jlc3BvbnNpYmxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmNsb3NlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcmVtaW5kZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPm9wZW48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjTm90ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N1YmplY3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+WyUgVHJhbnNsYXRlKCJEZWNpc2lvbiIpIHwgaHRtbCAlXTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8VGV4dEFyZWE+WyUgVHJhbnNsYXRlKCJSZWFzb24iKSB8IGh0bWwgJV06PC9UZXh0QXJlYT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSW52b2x2ZWRBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0luZm9ybUFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlVHlwZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ub3RlLWludGVybmFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0FydGljbGVUeXBlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWludGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWV4dGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLXJlcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQcmlvcml0eSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHlEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25SZXN1bHQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvbkRhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSGlzdG9yeVR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5BZGROb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlDb21tZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+JSVOb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2U8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQaG9uZU5ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RW1haWwjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0VtYWlsTmV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Q2xvc2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEZyZWVUZXh0IyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Tm90ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0T3duZXIjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld093bmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQZW5kaW5nIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQZW5kaW5nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UHJpb3JpdHk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFJlc3BvbnNpYmxlIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdSZXNwb25zaWJsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFDTEtleXNMZXZlbDM6OkFjdGlvbnMjIyMxMDAtRGVmYXVsdC1JVFNNIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgd2hpY2ggaXRlbXMgYXJlIGF2YWlsYWJsZSBmb3IgJ0FjdGlvbicgaW4gdGhpcmQgbGV2ZWwgb2YgdGhlIEFDTCBzdHJ1Y3R1cmUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0QUNMPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkFnZW50VGlja2V0RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6VHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHBob25lIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUR1ZURhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEVtYWlsIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgZW1haWwgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdFbWFpbE5ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1NlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmV2aWV3UmVxdWlyZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlcGFpclN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlY292ZXJ5U3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTURlY2lzaW9uUmVzdWx0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVjb3ZlcnlTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvbkRhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UHJpb3JpdHk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q2xvc2UjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBjbG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0Nsb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdDb21wb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfQlNC+0LHQsNCy0Lgg0YDQtdGI0LXQvdC40LUg0LrRitC8INCx0LjQu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn0JTQsNGC0LAg0LfQsCDRgNC10YjQsNCy0LDQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ9Cg0LXQt9GD0LvRgtCw0YIg0L7RgiDRgNC10YjQtdC90LjQtdGC0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfQmtGA0LDQudC90LAg0LTQsNGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn0J7RgdC90L7QstCw0L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfQktGA0LXQvNC1INC90LAg0YHRgtCw0YDRgtC40YDQsNC90LUg0L3QsCDQstGK0LfRgdGC0LDQvdC+0LLRj9Cy0LDQvdC10YLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ9CS0YDQtdC80LUg0L3QsCDRgdGC0LDRgNGC0LjRgNCw0L3QtSDQvdCwINGA0LXQvNC+0L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9CY0LfQuNGB0LrQstCwINC/0YDQtdCz0LvQtdC20LTQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ9C/0YDQuNC60LvRjtGH0LXQvSDRgSDQvtCx0YXQvtC00L3QviDRgNC10YjQtdC90LjQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9Cf0YDQvtC80LXQvdC4IElUU00g0L/QvtC70LXRgtCw0YLQsCDQvdCwINCx0LjQu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAn0JTQvtC/0YrQu9C90LjRgtC10LvQvdC4IElUU00g0L/QvtC70LXRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ9Cg0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdQxZlpZGF0IMWZZcWhZW7DrSBrIHRpa2V0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0dW0gxZhlxaFlbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1bDvXNsZWRlayDFmGXFoWVuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnUMWZw63EjWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnxIxhcyB6YWjDoWplbsOtIG9ibm92ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ8SMYXMgemFow6FqZW7DrSBvcHJhdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnVnnFvmFkdWplIFDFmWVobGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICd1emF2xZllbm8gZG/EjWFzbsO9bSDFmWXFoWVuw61tJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnWm3Em25hIElUU00gcG9sw60gdiB0aWtldHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb3BsxYh0ZSDFmWXFoWVuw60hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdEb3BsxYhrb3bDoSBJVFNNIHBvbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnWm3Em8WIdGUgSVRNUyBwb2xlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ8WYZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0NhdmlhciBDYW1wcyBJVFNNIGFkZGljaW9uYWxzIGRlbCB0aXF1ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkCgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXREZWNpc2lvbgoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldFBob25lCgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRQcmludAoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0Wm9vbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmVzdWx0YXQgZGUgbGEgZGVjaXNpw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGUgZGVjaXNpw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdUZW1wcyBkXCdpbmljaSBkZSBsYSByZXBhcmFjacOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdUZW1wcyBkXCdpbmljaSBkZSBsYSByZWN1cGVyYWNpw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdEYXRhIGRlIHZlbmNpbWVudCc7CgogICAgIyBUZW1wbGF0ZTogQ3VzdG9tZXJUaWNrZXRQcmludAoKICAgICMgVGVtcGxhdGU6IEN1c3RvbWVyVGlja2V0Wm9vbQoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0NhbXBzIElUU00gYWRkaWNpb25hbHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc2nDsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ID0gJ0FmZWdpciBkZWNpc2nDsyBhbCB0aXF1ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnUmHDsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpc2nDsyByZXF1ZXJpZGEnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdUaWxmw7hqIGJlc2x1dG5pbmcgdGlsIHNhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0Jlc2x1dG5pbmdzcmVzdWx0YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGb3JmYWxkc2RhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnQmVncnVuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1N0YXJ0dGlkIGZvciBnZW5ldGFibGVyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnU3RhcnR0aWQgZm9yIHJlcGVyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnQW5tZWxkZWxzZSBrcsOmdmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdMdWtrZXQgbWVkIHdvcmthcm91bmQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdSZXQgc2FnZW5zIElUU00gZmVsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnVGlsZsO4aiBlbiBiZXNsdXRuaW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnWWRlcmxpZ2UgSVRTTSBmZWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnUmV0IElUU00gZmVsdGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0Jlc2x1dG5pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdFbnRzY2hlaWR1bmcgYW4gVGlja2V0IGjDpG5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0VudHNjaGVpZHVuZ3NkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdFbnRzY2hlaWR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGw6RsbGlna2VpdHNkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdCZWdyw7xuZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnV2llZGVyaGVyc3RlbGx1bmcgU3RhcnR6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnUmVwYXJhdHVyIFN0YXJ0emVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdOYWNoYmVhcmJlaXR1bmcgZXJmb3JkZXJsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdwcm92aXNvcmlzY2ggZ2VzY2hsb3NzZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnRGllIEVudHNjaGVpZHVuZyBkZXMgVGlja2V0cyDDpG5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfDhG5kZXJuIGRlciBJVFNNIEZlbGRlciBkZXMgVGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU2VydmljZSBWb3JmYWxsc3N0YXR1cyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdUaWNrZXQgdmVya27DvHBmZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXTDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnQXVzd2lya3VuZyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0hpbnp1ZsO8Z2VuIGVpbmVyIEVudHNjaGVpZHVuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ1p1c8OkdHpsaWNoZSBJVFNNIEZlbGRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcmxhdWJ0IGRhcyBIaW56dWbDvGdlbiB2b24gTm90aXplbiBpbSBFbnRzY2hlaWR1bmdzLUJpbGRzY2hpcm0gaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnw4RuZGVybiBkZXIgSVRTTS1GZWxkZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRW50c2NoZWlkdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBw7FhZGlyIGRlY2lzacOzbiBhbCB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0ZlY2hhIGRlIERlY2lzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSZXN1bHRhZG8gZGUgRGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRmVjaGEgZGUgdmVuY2ltaWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnTW90aXZvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdGZWNoYSBJbmljaWFsIGRlIFJlY3VwZXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdGZWNoYSBJbmljaWFsIGRlIFJlcGFyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JldmlzacOzbiBSZXF1ZXJpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0NlcnJhZG8gY29uIHNvbHVjacOzbiBwcm92aXNpb25hbCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWNhciBjYW1wb3MgSVRTTSBkZWwgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnVmluY3VsYXIgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnwqFBZ3JlZ3VlIHVuYSBkZWNpc2nDs24hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBBZGljaW9uYWxlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFncmVnYXIgbm90YXMgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgYWdyZWdhciBub3RhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ01vZGlmaWNhciBsb3MgY2FtcG9zIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RldGVybWluYSBzaSBlcyBuZWNlc2FyaW8gcXVlIGVsIHRpY2tldCBlc3TDqSBibG9xdWVhZG8gcGFyYSBhY2NlZGVyIGEgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChzaSBlbCB0aWNrZXQgbm8gZXN0w6EgYmxvcXVlYWRvIGHDum4sIHNlIGJsb3F1ZWEgeSBlbCBhZ2VudGUgYWN0dWFsIHNlIGNvbnZlcnRpcsOhIGF1dG9tw6F0aWNhbWVudGUgZW4gc3UgcHJvcGlldGFyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZXRlcm1pbmEgc2kgZXMgbmVjZXNhcmlvIHF1ZSBlbCB0aWNrZXQgZXN0w6kgYmxvcXVlYWRvIHBhcmEgYWNjZWRlciBhIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKHNpIGVsIHRpY2tldCBubyBlc3TDoSBibG9xdWVhZG8gYcO6biwgc2UgYmxvcXVlYSB5IGVsIGFnZW50ZSBhY3R1YWwgc2UgY29udmVydGlyw6EgYXV0b23DoXRpY2FtZW50ZSBlbiBzdSBwcm9waWV0YXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQgcG9yIGRlZmF1bHQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0IHBvciBkZWZhdWx0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBhc3VudG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgYXN1bnRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbGEgcHJpb3JpZGFkIGRlZmF1bHQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIGVsIGNvbWVudGFyaW8gZGVsIGhpc3RvcmlhbCBwYXJhIGxhIGFjY2nDs24gZGUgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBjb21lbnRhcmlvIGRlbCBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwgcGFyYSBsYSBhY2Npw7NuIGRlIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIG1pc21hIHF1ZSBlcyB1c2FkYSBwb3IgZWwgaGlzdG9yaWFsIGRlbCB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCB0YXNhIHByb21lZGlvIGRlIHNvbHVjacOzbiBkZSBwcmltZXIgbml2ZWwgZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCBwcm9tZWRpbyBkZSBzb2x1Y2nDs24gZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaSB1bmEgbm90YSBlcyBhZ3JlZ2FkYSBwb3IgdW4gYWdlbnRlLCBkZWZpbmUgZWwgZXN0YWRvIGRlIHVuIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NpIHVuYSBub3RhIGVzIGFncmVnYWRhIHBvciB1biBhZ2VudGUsIGRlZmluZSBlbCBlc3RhZG8gZGUgdW4gdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyBuZWNlc2FyaW9zIHBhcmEgdXNhciBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlNlcnZpY2UgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBwcm9waWV0YXJpbyBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcHJvcGlldGFyaW8gZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcmVzcG9uc2FibGUgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHJlc3BvbnNhYmxlIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24sIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHRpcG8gZGUgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoVGlja2V0OjpUeXBlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCB0aXBvIGRlIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlR5cGUgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBtb2RpZmljYXIgbGEgZGVjaXNpw7NuIGRlIHVuIHRpY2tldCwgZW4gZWwgZGV0YWxsZSBkZSBkaWNobyB0aWNrZXQsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RhIHVuIHbDrW5jdWxvIGVuIGVsIG1lbsO6IHBhcmEgbW9kaWZpY2FyIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBlbCBkZXRhbGxlIGRlbCB0aWNrZXQgY29ycmVzcG9uZGllbnRlLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIGludm9sdWNyYWRvcyBlbiBlc3RlIHRpY2tldCwgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIHBvc2libGVzIChhcXVlbGxvcyBjb24gcGVybWlzb3MgcGFyYSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIGZpbGEgbyB0aWNrZXQpLCBwYXJhIGRldGVybWluYXIgcXVpw6luL3F1acOpbmVzIGRlYmVuIHNlciBpbmZvcm1hZG9zIGFjZXJjYSBkZSDDqXN0YSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIHVuYSBsaXN0YSBkZSB0b2RvcyBsb3MgYWdlbnRlcyBwb3NpYmxlcyAoYXF1ZWxsb3MgY29uIHBlcm1pc29zIHBhcmEgYWdyZWdhciBub3RhcyBlbiBsYSBmaWxhIG8gdGlja2V0KSwgcGFyYSBkZXRlcm1pbmFyIHF1acOpbi9xdWnDqW5lcyBkZWJlbiBzZXIgaW5mb3JtYWRvcyBhY2VyY2EgZGUgw6lzdGEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxhcyBvcGNpb25lcyBkZSBwcmlvcmlkYWQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxhcyBvcGNpb25lcyBkZSBwcmlvcmlkYWQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxvcyBjYW1wb3MgZGVsIHTDrXR1bG8gZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbG9zIGNhbXBvcyBkZWwgdMOtdHVsbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfYp9mE2LXYp9mCINuM2qkg2KrYtdmF24zZhSDYqNmHINiv2LHYrtmI2KfYs9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINiq2LXZhduM2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn2YbYqtuM2KzZhyDYqti12YXbjNmFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn2KrYp9ix24zYriDYp9mG2KzYp9mFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ9iv2YTbjNmEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqNmH2KjZiNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn2LLZhdin2YYg2LTYsdmI2Lkg2KrYudmF24zYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfZhtuM2KfYsiDYqNmHINio2KfYstio24zZhtuMINiv2KfYsdivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfZhdmI2YLYqtinINio2LPYqtmHINi02K8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAn2KrYutuM24zYsSDYqti12YXbjNmFINiv2LHYrtmI2KfYs9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfYqti624zbjNixINmB24zZhNiv2YfYp9uMIElUU00g2K/Ysdiu2YjYp9iz2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfYp9ix2KrYqNin2Lcg2K/Ysdiu2YjYp9iz2KonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9in2YfZhduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn2KfYq9ixJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn24zaqSDYqti12YXbjNmFINin2LbYp9mB2Ycg2qnZhtuM2K8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfZgduM2YTYr9mH2KfbjCDYp9i22KfZgdmHIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAn2YHbjNmE2K/Zh9in24wgSVRTTSDYsdinINiq2LrbjNuM2LEg2K/Zh9uM2K8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn2KrYtdmF24zZhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBam91dGVyIHVuZSBkw6ljaXNpb24gYXUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEYXRlIGRlIGTDqWNpc2lvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSw6lzdWx0YXQgZGUgbGEgRMOpY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRW5nYWdlbmVudCBkZSBkYXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ1JhaXNvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnRGF0ZSBkZSBkw6lidXQgZGUgcmV0b3VyIMOgIGxhIG5vcm1hbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdEYXRlIGRlIGTDqWJ1dCBkZSByw6lwYXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZ1ZSByZXF1aXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdGZXJtw6kgYXZlYyBjb250b3VybmVtZW50JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnTW9kaWZpZXIgbGVzIGNoYW1wcyBJVFNNIGR1IHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0Fqb3V0ZXogdW5lIGTDqWNpc2lvbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0NoYW1wcyBJVFNNIGFkZGl0aW9uZWxzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ01vZGlmaWV6IGxlcyBjaGFtcHMgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEw6ljaXNpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZ2dpdW5naSB1bmEgQXBwcm92YXppb25lIGFsIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkaSBBcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmlzdWx0YXRvIGRlbGxhIEFwcHJvdmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdNb3Rpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmVjdXBlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdEYXRhIGluaXppYWxlIGRpIHJpcGFyYXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JpY2hpZXN0YSBSZXZpc2lvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnTW9kaWZpY2EgY2FtcGkgSVRTTSBkZWwgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWdnaXVuZ2kgdW5hIHJpc29sdXppb25lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcGkgSVRTTSBhZ2dpdW50aXZpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0NhbWJpYSBpIGNhbXBpIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQXBwcm92YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICflr77lv5zmnJ/pmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfjg4HjgrHjg4Pjg4jjgpLjg6rjg7Pjgq/jgZnjgosnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn7/luqYnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdLZXB1dHVzYW4gYmVyZ2FudHVuZyBhdGFzIHRpa2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdUYXJpa2ggS2VwdXR1c2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0tlcHV0dXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1RhcmlraCBkaXNlYmFia2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ0FsYXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnUGVtdWxpaGFuIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1BlcmJhaWtpIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdrZXJqYSBzZW11bGEgZGlwZXJsdWthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnZGl0dXR1cCBkZW5nYW4ga2VyamEgZGkgc2VraXRhcic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdVYmFoIEtlcHV0dXNhbiBUaWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnUGVydWJhaGFuIGJpZGFuZyBJVFNNIHRpa2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnUGF1dGFuIHRpa2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0aWthbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdLZXNhbic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ1RhbWJhaCBrZXB1dHVzYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdUYW1iYWhhbiBJVFNNIE1lZGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ8OEbmRlcm4gZGVyIElUU00tRmVsZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdMZWdnIHRpbCBiZXNsdXRuaW5nIGZvciBzYWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0Jlc2x1dG5pbmdzZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdCZXNsdXRuaW5nc3Jlc3VsdGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRm9yZmFsbHNkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ0JlZ3J1bm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgZ2plbm9wcHJldHRpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgcmVwYXJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdFdmFsdWVyaW5nIGtyZXZlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnTHVra2V0IG1lZCBtaWRsZXJ0aWRpZyBsw7hzbmluZyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdFbmRyZSBzYWtlbnMgYmVzbHV0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnRW5kcmUgc2FrZW5zIElUU00tZmVsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnS29ibGUgc2FrJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0aWthbGl0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnT21mYW5nJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnTGVnZyB0aWwgZW4gYmVzbHV0bmluZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0Vrc3RyYSBJVFNNLWZlbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGlsbGF0ZXIgw6UgbGVnZ2UgdGlsIG5vdGlzZXIgaSBkZSBla3N0cmEgSVRTTS1mZWx0ZW5lIGkgc2Frc2JlaGFuZGxlcmRlbGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnRW5kcmUgSVRTTS1mZWx0ZW5lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0Jlc2x1dG5pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdLb3BwZWwgYmVzbGlzc2luZyBhYW4gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdCZXNsaXNzaW5nc2RhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFhdCBiZXNsaXNzaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnVmVydmFsZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnUmVkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0JlZ2ludGlqZCBoZXJzdGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnQmVnaW50aWpkIHJlcGFyYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpZXcgYmVub2RpZ2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2dlc2xvdGVuIG1ldCB3b3JrYXJvdW5kJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnVmVyYW5kZXJlbiB2YW4gSVRTTSB2ZWxkZW4gdmFuIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0Jlc2xpc3NpbmcgdG9ldm9lZ2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnRXh0cmEgSVRTTSB2ZWxkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnVmVyYW5kZXJlbiB2YW4gSVRTTSB2ZWxkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQmVzbGlzc2luZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdEb2RhaiBkZWN5emrEmSBkbyB6Z8WCb3N6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZWN5emppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1JlenVsdGF0IGRlY3l6amknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdDemFzIHpha2/FhGN6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdQb3fDs2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG9kenlza2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG5hcHJhd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnV3ltYWdhbnkgcHJ6ZWdsxIVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdyb3p3acSFemFuZSB6IG9iZWrFm2NpZW0nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnWm1pZcWEIGRlY3l6asSZIHcgemfFgm9zemVuaXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ptaWXFhCBwb2xhIElUU00gemfFgm9zemVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdQb8WCxIVjeiB6Z8WCb3N6ZW5pZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3J5dHljem5vxZvEhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdXcMWCeXcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb2RhaiBkZWN5emrEmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0a293ZSBwb2xhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG96d2FsYSBuYSBkb2Rhd2FuaWUgbm90YXRlayBuYSBla3JhbmllIHogZG9kYXRrb3d5bWkgcG9sYW1pIElUU00gdyBwYW5lbHUgYWdlbnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvendhbGEgbmEgZG9kYXdhbmllIG5vdGF0ZWsgbmEgZWtyYW5pZSBkZWN5emppIHcgcGFuZWx1IGFnZW50YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdabWllxYQgcG9sYSBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY3l6amEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZGljaW9uYXIgZGVjaXPDo28gYW8gY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZSBEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdEZWNpc8OjbyBSZXN1bHRhbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkZSB2ZW5jaW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ1JhesOjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnSG9yw6FyaW8gSW5pY2lhbCBkZSBSZWN1cGVyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnSG9yw6FyaW8gSW5pY2lhbCBkZSBSZXBhcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnUmV2aXPDo28gUmVxdWlzaXRhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2ZlY2hhZG8gY29tIHNvbHXDp8OjbyBkZSBjb250b3Jubyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdBbHRlcmFyIERlY2lzw6NvIGRlIENoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0FsdGVyYXIgb3MgY2FtcG9zIElUU00gZG8gY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkbyBTZXJ2acOnbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdBc3NvY2lhciBjaGFtYWRvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdDcml0aWNhbGlkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdG8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGljaW9uYXIgdW1hIGRlY2lzw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIGFkaWNpb25haXMgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQWx0ZXJhciBjYW1wb3MgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVtIGJsb3F1ZWlvIGRlIGNoYW1hZG8gw6kgZXhpZ2lkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoc2UgbyBjaGFtYWRvIG7Do28gZXN0aXZlciBibG9xdWVhZG8gYWluZGEsIG8gY2hhbWFkbyBzZXLDoSBibG9xdWVhZG9lIG8gYXRlbmRlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVtIGJsb3F1ZWlvIGRlIGNoYW1hZG8gw6kgZXhpZ2lkbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUgKHNlIG8gY2hhbWFkbyBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvIGFpbmRhLCBvIGNoYW1hZG8gc2Vyw6EgYmxvcXVlYWRvZSBvIGF0ZW5kZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkbyBzZXJ2acOnbyBkZXZlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGEgc2VsZcOnw6NvIGRlIHNlcnZpw6dvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvcnBvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gY29ycG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBhZHLDo28gZGUgdW0gY2hhbWFkbyBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBwYWRyw6NvIGRlIHVtIGNoYW1hZG8gYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIHByaW9yaWRhZGUgcGFkcsOjbyBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgYSBwcmlvcmlkYWRlIHBhZHLDo28gZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSwgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCBxdWUgw6kgdXNhZG8gbm8gaGlzdMOzcmljbyBkbyBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHF1ZSDDqSB1c2FkbyBubyBoaXN0w7NyaWNvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgcGVzcXVpc2EgZGUgY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBkZXRhbGhlcyBkbyBjaGFtYWRvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgY2hhbWFkb3MgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgY2hhbWFkb3MgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhdGVuZGVudGUsIGRlZmluZSBvIGVzdGFkbyBkZSB1bSBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NlIHVtYSBub3RhIMOpIGFkaWNpb25hZGEgcG9yIHVtIGF0ZW5kZW50ZSwgZGVmaW5lIG8gZXN0YWRvIGRlIHVtIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGQgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGRlY2lzw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBhZGljaW9uYWwgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRlIGludGVyZmFjZSBkbyBhdGVuZGVudGUgKENoYW1hZG86OlNlcnZpw6dvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlcnZpw6dvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoQ2hhbWFkbzo6U2VydmnDp28gcHJlY2lzYSBlc3RhciBhdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIGNoYW1hZG8gZGUgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyBjaGFtYWRvIG5hIHRlbGEgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gY2hhbWFkbyBuYSBzdWEgdmlzw6NvIGVtIGRldGFsaGVzIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIG1vZGlmaWNhciBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIG5hIHZpc8OjbyBlbSBkZXRhbGhlcyBkZSB1bSBjaGFtYWRvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGF0ZW5kZW50ZXMgcG9zc8OtdmVpcyAodG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8O1ZXMgZGUgbm90YSBuYSBmaWxhL2NoYW1hZG8pIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhdGVuZGVudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGF0ZW5kZW50ZXMgY29tIHBlcm1pc3PDtWVzIG5vdGEgbmEgZmlsYS9jaGFtYWRvKSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIHByaW9yaWRhZGUgZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBwcmlvcmlkYWRlIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZGljaW9uYXIgZGVjaXPDo28gYW8gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEYXRhIGRhIERlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFkbyBkYSBkZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ0RhdGEgdmVuY2ltZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdNb3Rpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGEgUmVjdXBlcmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGUgUmVwYXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnQXZhbGlhw6fDo28gbmVjZXNzw6FyaWEgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdmZWNoYWRvIGNvbSBzb2x1w6fDo28gZGUgY29udG9ybm8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnQWx0ZXJhciBkZWNpc8OjbyBkbyB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0FsdGVyYXIgb3MgY2FtcG9zIElUU00gZG8gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgSW5jaWRlbnRlIGRvIFNlcnZpw6dvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0Fzc29jaWFyIHRpY2tldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnQ3JpdGljaWRhZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0byc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0FkaWNpb25hciB1bWEgZGVjaXPDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBhZGljaW9uYWlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgYWRpY2lvbmFyIG5vdGFzIGFvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBhbyBmb3JtdWzDoXJpb2RlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQWx0ZXJhciBjYW1wb3MgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUgKHNlIG8gdGlja2V0IG7Do28gZXN0aXZlciBibG9xdWVhZG8sIHNlcsOhIGJsb3F1ZWFkbyBlIG8gYWdlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlIChzZSBvIHRpY2tldCBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvLCBzZXLDoSBibG9xdWVhZG8gZSBvIGFnZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkbyBzZXJ2acOnbyBkZXZlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGEgc2VsZcOnw6NvIGRlIHNlcnZpw6dvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRleHRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGV4dG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBvciBvbWlzc8OjbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcG9yIG9taXNzw6NvIGRlIHVtIHRpY2tldCBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwb3Igb21pc3PDo28gZGUgdW1hIG5vdGEgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gY29tZW50w6FyaW8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgdXRpbGl6YWRvIG5vIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGRlY2lzw6NvLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgcGVzcXVpc2EgZGUgY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBkZXRhbGhlcyBkbyBjaGFtYWRvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgdGlja2V0cyBJVFNNIG5vIHByaW1laXJvIG7DrXZlbCBkZSBzb2x1w6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnUGVybWl0ZSBxdWUgbyBtw7NkdWxvIGRlIGVzdGF0w61zdGljYXMgZ2VyZSBlc3RhdMOtc3RpY2FzIHNvYnJlIG8gbsOtdmVsIG3DqWRpbyBkZSB0aWNrZXRzIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW1hIG5vdGEgw6kgYWRpY2lvbmFkYSBwb3IgdW0gYWdlbnRlLCBkZWZpbmUgbyBlc3RhZG8gZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhZ2VudGUsIGRlZmluZSBvIGVzdGFkbyBkbyB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1dGlsaXphciBvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXRpbGl6YXIgbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBhZGljaW9uYWwgYW8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBpbnRlcmZhY2UgZG8gYWdlbnRlICh0aWNrZXQ6OlNlcnZpw6dvIG5lY2Vzc2l0YSBkZSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlcnZpw6dvIGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZSAodGlja2V0OjpTZXJ2acOnbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByb3ByaWV0w6FyaW8gZG8gdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHJvcHJpZXTDoXJpbyBkbyB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGQwIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkbyBhZ2VudGUuICh0aWNrZXQ6OlRpcG8gbmVjZXNzaXRhIGRlIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZSAodGlja2V0OjpUaXBvIG5lY2Vzc2l0YSBkZSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gdGlja2V0IG5hIHZpc3RhIGRlIGRldGFsaGVzIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgbW9kaWZpY2FyIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgdmlzdGEgZGUgZGV0YWxoZXMgZG8gdGlja2V0IGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhZ2VudGVzIGVudm9sdmlkb3MgbmVzdGUgdGlja2V0LCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGFnZW50ZXMgZW52b2x2aWRvcyBuZXN0ZSB0aWNrZXQsIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRvcyBhZ2VudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGFnZW50ZXMgY29tIHBlcm1pc3PDtWVzIGRlIG5vdGEgbmEgZmlsYS90aWNrZXQpIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkb3MgYWdlbnRlcyBwb3Nzw612ZWlzICh0b2RvcyBvcyBhZ2VudGVzIGNvbSBwZXJtaXNzw7VlcyBub3RhIG5hIGZpbGEvdGlja2V0KSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZGUgdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBvcyBjYW1wb3MgZGUgdMOtdHVsbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfQktGL0L3QtdGB0YLQuCDRgNC10YjQtdC90LjQtSDQv9C+INC30LDRj9Cy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn0JTQsNGC0LAg0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GM0YLQsNGCINGA0LXRiNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn0JTQsNGC0LAg0LjRgdC/0L7Qu9C90LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn0J/RgNC40YfQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ9CU0LDRgtCwINCy0L7RgdGB0YLQsNC90L7QstC70LXQvdC40Y8g0YHQtdGA0LLQuNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfQlNCw0YLQsCDQvdCw0YfQsNC70LAg0YDQsNCx0L7Rgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfQndC10L7QsdGF0L7QtNC40Lwg0L/RgNC+0YHQvNC+0YLRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAn0LfQsNC60YDRi9GC0L4g0YEg0L7QsdGF0L7QtNC90YvQvCDRgNC10YjQtdC90LjQtdC8JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJ9CY0LfQvNC10L3QuNGC0Ywg0YDQtdGI0LXQvdC40LUg0L/QviDQt9Cw0Y/QstC60LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9CY0LfQvNC10L3QuNGC0YwgSVRTTSDQv9C+0LvRjyDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ9Ch0L7RgdGC0L7Rj9C90LjQtSDQodC10YDQstC40YHQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfQodCy0Y/Qt9Cw0YLRjCDQt9Cw0Y/QstC60YMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9Ca0YDQuNGC0LjRh9C90L7RgdGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0KHRgtC10L/QtdC90Ywg0LLQu9C40Y/QvdC40Y8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINGA0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KDQsNC30YDQtdGI0LDQtdGCINC00L7QsdCw0LLQuNGC0Ywg0LfQsNC80LXRgtC60YMg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cg0LDQt9GA0LXRiNCw0LXRgiDQtNC+0LHQsNCy0LjRgtGMINC30LDQvNC10YLQutGDINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ9CY0LfQvNC10L3QuNGC0YwgSVRTTSDQv9C+0LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ9Cg0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfQntC/0YDQtdC00LXQu9GP0LXRgiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLRjCDQsdC70L7QutC40YDQvtCy0LrQuCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0LfQsNGP0LLQutCwINC10YnQtSDQvdC1INCx0LvQvtC60LjRgNC+0LLQsNC90LAsINC+0L3QsCDQsdC70L7QutC40YDRg9C10YLRgdGPINC4INGC0LXQutGD0YnQuNC5INCw0LPQtdC90YIg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0L3QsNC30L3QsNGH0LDQtdGC0YHRjyDQtdC1INCy0LvQsNC00LXQu9GM0YbQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCINC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtGMINCx0LvQvtC60LjRgNC+0LLQutC4INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKNC10YHQu9C4INC30LDRj9Cy0LrQsCDQtdGJ0LUg0L3QtSDQsdC70L7QutC40YDQvtCy0LDQvdCwLCDQvtC90LAg0LHQu9C+0LrQuNGA0YPQtdGC0YHRjyDQuCDRgtC10LrRg9GJ0LjQuSDQsNCz0LXQvdGCINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC90LDQt9C90LDRh9Cw0LXRgtGB0Y8g0LXQtSDQstC70LDQtNC10LvRjNGG0LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCLCDQv9C+0LrQsNC30YvQstCw0YLRjCDQu9C4INGB0L7RgdGC0L7Rj9C90LjQtSDQodC10YDQstC40YHQsCDQv9GA0Lgg0LXQs9C+INCy0YvQsdC+0YDQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQtdC60YHRgiDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwICjQtdGB0LvQuCDQvdC10L7QsdGF0L7QtNC40LzQviknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC10LrRgdGCINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Rg9GOINGC0LXQvNGDINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YPRjiDRgtC10LzRgyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC40L8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQuNC/INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtC40L8g0LrQvtC80LzQtdC90YLQsNGA0LjRjyDQsiDQuNGB0YLQvtGA0LjQuCDQtNC70Y8g0LTQtdC50YHRgtCy0LjQuSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLQuNC/INC60L7QvNC80LXQvdGC0LDRgNC40Y8g0LIg0LjRgdGC0L7RgNC40Lgg0LTQu9GPINC00LXQudGB0YLQstC40Lkg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdC70LXQtNGD0Y7RidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDRj9Cy0LrQuCDQv9C+0YHQu9C1INC00L7QsdCw0LLQu9C10L3QuNGPINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0Y/QstC60Lgg0L/QvtGB0LvQtSDQtNC+0LHQsNCy0LvQtdC90LjRjyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ9Ch0L/QuNGB0L7QuiDQlNC40L3QsNC80LjRh9C10YHQutC40YUg0L/QvtC70LXQuSwg0L/QvtC60LDQt9GL0LLQsNC10LzRi9GFINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LjRgdC60LAg0LfQsNCy0L7QuiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LTRgNC+0LHQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAg0LfQsNGP0LLQutC4INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgLSDQvdC1INC/0L7QutCw0LfRi9Cy0LDRgtGMLCAxIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ9CS0LrQu9GO0YfQsNC10YIg0LzQvtC00YPQu9GMINC+0YLRh9C10YLQvtCyINC00LvRjyDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0L7RgtGH0LXRgtC+0LIg0L4g0YHRgNC10LTQvdC10LwgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICfQktC60LvRjtGH0LDQtdGCINC80L7QtNGD0LvRjCDQvtGC0YfQtdGC0L7QsiDQtNC70Y8g0YTQvtGA0LzQuNGA0L7QstCw0L3QuNGPINC+0YLRh9C10YLQvtCyINC+INGB0YDQtdC00L3QtdC8IElUU00gdGlja2V0IHNvbHV0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQktC+0LfQvNC+0LbQvdC+0YHRgtGMINGD0YHRgtCw0L3QvtCy0LjRgtGMINC90L7QstC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDQstC60Lgg0L/RgNC4INC00L7QsdCw0LLQu9C10L3QuNC4INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JLQvtC30LzQvtC20L3QvtGB0YLRjCDRg9GB0YLQsNC90L7QstC40YLRjCDQvdC+0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LLQutC4INC/0YDQuCDQtNC+0LHQsNCy0LvQtdC90LjQuCDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQv9GD0L3QutGC0LAg0LzQtdC90Y4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0L/Rg9C90LrRgtCwINC80LXQvdGOINCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKFRpY2tldDo6U2VydmljZSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LDQutGC0LjQstC40YDQvtCy0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpTZXJ2aWNlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCS0LvQsNC00LXQu9GM0YbQsCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0JLQu9Cw0LTQtdC70YzRhtCwINC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7Qs9C+INC30LAg0LfQsNGP0LLQutGDINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCe0YLQstC10YLRgdGC0LLQtdC90L3QvtCz0L4g0LfQsCDQt9Cw0Y/QstC60YMg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KLQuNC/INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwIChUaWNrZXQ6OlR5cGUg0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0LrRgtC40LLQuNGA0L7QstCw0L0pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQotC40L8g0LfQsNGP0LLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpUeXBlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHRgdGL0LvQutGDINC90LAg0L/Rg9C90LrRgiDQvNC10L3RjiDQtNC70Y8g0LjQt9C80LXQvdC10L3QuNGPINCg0LXRiNC10L3QuNGPINC/0L4g0LfQsNGP0LLQutC1INCyINC+0LrQvdC1INC/0L7QtNGA0L7QsdC90L7Qs9C+INC/0YDQvtGB0LzQvtGC0YDQsCAoVGlja2V0Wm9vbSkg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0YHRi9C70LrRgyDQvdCwINC/0YPQvdC60YIg0LzQtdC90Y4g0LTQu9GPINC40LfQvNC10L3QtdC90LjRjyDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9GFIElUU00g0L/QvtC70LXQuSDQt9Cw0Y/QstC60Lgg0LIg0L7QutC90LUg0L/QvtC00YDQvtCx0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwIChUaWNrZXRab29tKSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0L/QuNGB0L7QuiDQtNC70Y8g0LLRi9Cx0L7RgNCwINCy0YHQtdGFINCy0L7QstC70LXRh9C10L3QvdGL0YUg0LDQs9C10L3RgtC+0LIg0L/QviDRjdGC0L7QuSDQt9Cw0Y/QstC60LUg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LLQu9C10YfQtdC90L3Ri9GFINCw0LPQtdC90YLQvtCyINC/0L4g0Y3RgtC+0Lkg0LfQsNGP0LLQutC1INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LfQvNC+0LbQvdGL0YUg0LDQs9C10L3RgtC+0LIgKCDRgSDQv9GA0LDQstCw0LzQuCDQvdCwINGB0L7Qt9C00LDQvdC40LUg0LfQsNC80LXRgtC+0LogKG5vdGUpINC00LvRjyDQvtGH0LXRgNC10LTQuC/Qt9Cw0Y/QstC60LggKSwg0LrQvtGC0L7RgNGL0YUg0L3QsNC00L4g0LjQvdGE0L7RgNC80LjRgNC+0LLQsNGC0Ywg0L7QsSDRjdGC0L7QuSDQt9Cw0LzQtdGC0LrQtSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHQv9C40YHQvtC6INC00LvRjyDQstGL0LHQvtGA0LAg0LLRgdC10YUg0LLQvtC30LzQvtC20L3Ri9GFINCw0LPQtdC90YLQvtCyICgg0YEg0L/RgNCw0LLQsNC80Lgg0L3QsCDRgdC+0LfQtNCw0L3QuNC1INC30LDQvNC10YLQvtC6IChub3RlKSDQtNC70Y8g0L7Rh9C10YDQtdC00Lgv0LfQsNGP0LLQutC4ICksINC60L7RgtC+0YDRi9GFINC90LDQtNC+INC40L3RhNC+0YDQvNC40YDQvtCy0LDRgtGMINC+0LEg0Y3RgtC+0Lkg0LfQsNC80LXRgtC60LUg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINC/0L7Qu9C1INCy0YvQsdC+0YDQsCDQv9GA0LjQvtGA0LjRgtC10YLQsCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0LLRi9Cx0L7RgNCwINC/0YDQuNC+0YDQuNGC0LXRgtCwINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0KLQtdC80LAg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9C+0LvQtSDQotC10LzQsCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICflop7liqDlhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+WGs+WumuaXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICflhrPlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfmiKrmraLml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn55CG55SxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfmgaLlpI3lvIDlp4vml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67lpI3lvIDlp4vml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn6ZyA6KaB5aSN5a6hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICflhbPpl60o5Y+Y6YCaKSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfkv67mlLnlt6XljZXlhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWKoeaVhemanOeKtuaAgSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpk77mjqXlt6XljZUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHlk40nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmt7vliqDlhrPlrpohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdJVFNN5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5Yaz5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9UV19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX1RXX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICflop7liqDmsbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+axuuWumuaXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfmiKrmraLml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn55CG55SxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfmgaLlvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67lvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn6ZyA6KaB6KSH5a+pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfpl5zploko6K6K6YCaKSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfkv67mlLnlt6Xllq7msbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWLmeaVhemanOeLgOaFiyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpj4jmjqXlt6Xllq4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn78nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmt7vliqDmsbrlrpohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdJVFNN5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5rG65a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtIC0gY29tbW9uIGZpbGUgZm9yIHNldmVyYWwgbW9kdWxlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3I7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CiMgLS0tCgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RW1haWxQYXJzZXJPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICAgICBNb2RlICA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgRGVidWcgPT4gMCwKICAgICk7CiAgICAkU2VsZi0+e1N0YW5kYXJkVGVtcGxhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBnZXQgYXJ0aWNsZSBmb3Igd2hvbSB0aGlzIHNob3VsZCBiZSBhIHJlcGx5LCBpZiBhdmFpbGFibGUKICAgIG15ICRSZXBseVRvQXJ0aWNsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1JlcGx5VG9BcnRpY2xlJyApIHx8ICIiOwoKICAgICMgY2hlY2sgaWYgUmVwbHlUb0FydGljbGUgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIHRpY2tldAogICAgbXkgJVJlcGx5VG9BcnRpY2xlQ29udGVudDsKICAgIG15IEBSZXBseVRvQWRyZXNzZXM7CiAgICBpZiAoJFJlcGx5VG9BcnRpY2xlKSB7CiAgICAgICAgJVJlcGx5VG9BcnRpY2xlQ29udGVudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkUmVwbHlUb0FydGljbGUsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gICAgICAgID0gJFJlcGx5VG9BcnRpY2xlOwogICAgICAgICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSA9IFwlUmVwbHlUb0FydGljbGVDb250ZW50OwoKICAgICAgICAjIGdldCBzZW5kZXIgb2Ygb3JpZ2luYWwgbm90ZSAodG8gaW5mb3JtIHNlbmRlciBhYm91dCBhbnN3ZXIpCiAgICAgICAgaWYgKCAkUmVwbHlUb0FydGljbGVDb250ZW50e0NyZWF0ZWRCeX0gKSB7CiAgICAgICAgICAgIG15IEBSZXBseVRvU2VuZGVySUQgPSAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7Q3JlYXRlZEJ5fSApOwogICAgICAgICAgICAkU2VsZi0+e1JlcGx5VG9TZW5kZXJVc2VySUR9ID0gXEBSZXBseVRvU2VuZGVySUQ7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGFydGljbGUgYmVsb25ncyB0byBvdGhlciB0aWNrZXQsIGRvbid0IHVzZSBpdCBhcyByZXBseQogICAgICAgIGlmICggJFJlcGx5VG9BcnRpY2xlQ29udGVudHtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57UmVwbHlUb0FydGljbGV9ID0gIiI7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGFydGljbGUgaXMgbm90IG9mIHR5cGUgbm90ZS1pbnRlcm5hbCwgZG9uJ3QgdXNlIGl0IGFzIHJlcGx5CiAgICAgICAgaWYgKCAkUmVwbHlUb0FydGljbGVDb250ZW50e0FydGljbGVUeXBlfSAhfiAvXm5vdGUtKGludGVybmFsfGV4dGVybmFsKSQvaSApIHsKICAgICAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gPSAiIjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBkZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0VHlwZSA9IFsnVGlja2V0J107CgogICAgIyBvbmx5IHNjcmVlbnMgdGhhdCBhZGQgbm90ZXMgY2FuIG1vZGlmeSBBcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRPYmplY3RUeXBlID0gWyAnVGlja2V0JywgJ0FydGljbGUnIF07CiAgICB9CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJE9iamVjdFR5cGUsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFJlcGx5VG9BcnRpY2xlID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBzaG93IHJpZ2h0IGhlYWRlcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdIZWFkZXInIC4gJFNlbGYtPntBY3Rpb259LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkdldCgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkdldCgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdCBOZXdRdWV1ZUlECiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQgUmVwbHlUb0FydGljbGUgU3RhbmRhcmRUZW1wbGF0ZUlEIENyZWF0ZUFydGljbGUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZHluYW1pYyBmaWVsZCBmb3IgdGhlIGltcGFjdAogICAgbXkgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZzsKIyAtLS0KCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICggJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFRpY2tldHtTZXJ2aWNlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKICAgIH0KCiAgICBteSAlU2VydmljZTsKICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U2hvd0luY2lkZW50U3RhdGV9IHx8IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgIGlmICggISRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBuZSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgbXkgJERlZmF1bHRTZWxlY3Rpb24gPSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX07CgogICAgICAgICAgICBpZiAoJERlZmF1bHRTZWxlY3Rpb24pIHsKCiAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdAogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICREZWZhdWx0U2VsZWN0aW9uOwogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgaW1wYWN0CiAgICAgICAgICAgICAgICBteSAkSW1wYWN0UG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkSW1wYWN0UG9zc2libGVWYWx1ZXMtPnsgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSB9IHx8ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBubyBzZXJ2aWNlIHdhcyBzZWxlY3RlZAogICAgZWxzZSB7CgogICAgICAgICMgZG8gbm90IHNob3cgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9ID0gJyc7CgogICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9IHt9OwogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAnJzsKICAgIH0KCiAgICAjIHNldCB0aGUgc2VsZWN0ZWQgaW1wYWN0CiAgICAkRHluYW1pY0ZpZWxkVmFsdWVze0lUU01JbXBhY3R9ID0gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKCiMgLS0tCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9CiAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgIFBsYWluVGV4dCAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgICAgICBteSAkSXNVcGxvYWQgPSAwOwoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgbXkgQEF0dGFjaG1lbnRJRHMgPSBtYXAgewogICAgICAgICAgICBteSAoJElEKSA9ICRfID1+IG17IFxBIEF0dGFjaG1lbnREZWxldGUgKFxkKykgXHogfXhtczsKICAgICAgICAgICAgJElEID8gJElEIDogKCk7CiAgICAgICAgfSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW1OYW1lcygpOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJc1VwbG9hZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdBdHRhY2htZW50VXBsb2FkJyApICkgewogICAgICAgICAgICAkSXNVcGxvYWQgICAgICAgICAgICAgICAgPSAxOwogICAgICAgICAgICAlRXJyb3IgICAgICAgICAgICAgICAgICAgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntOb3RlTWFuZGF0b3J5fSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgb3duZXIKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gJiYgJFNlbGYtPntDb25maWd9LT57T3duZXJNYW5kYXRvcnl9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnTmV3JyAmJiAhJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnTmV3T3duZXJJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAhJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnT2xkT3duZXJJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHRpdGxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICYmICEkR2V0UGFyYW17VGl0bGV9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUaXRsZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdHlwZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApICYmCiAgICAgICAgICAgICAgICAoICEkR2V0UGFyYW17VHlwZUlEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUlESW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgc2VydmljZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0KICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NMQU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU0xBSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGltZSB1bml0cywgYnV0IG9ubHkgaWYgdGhlIGN1cnJlbnQgc2NyZWVuIGhhcyBhIG5vdGUKICAgICAgICAgICAgIyAgIChhY2NvdW50ZWQgdGltZSBjYW4gb25seSBiZSBzdG9yZWQgaWYgYW5kIGFydGljbGUgaXMgZ2VuZXJhdGVkKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57Tm90ZX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBvbiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSEiLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gIHx8ICcnLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgIElzVXBsb2FkICAgICAgICAgPT4gJElzVXBsb2FkLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVW5sb2NrT25Bd2F5ID0gMTsKCiAgICAgICAgIyBzZXQgbmV3IG93bmVyCiAgICAgICAgbXkgQE5vdGlmeURvbmU7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVubG9ja09uQXdheSA9IDA7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVW5sb2NrT25Bd2F5ID0gMDsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3T3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyByZXNwb25zaWJsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSByZXNwb25zaWJsZSB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtb3ZlIHRpY2tldCB0byBhIG5ldyBxdWV1ZSwgYnV0IG9ubHkgaWYgdGhlIHF1ZXVlIHdhcyBjaGFuZ2VkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntRdWV1ZX0KICAgICAgICAgICAgJiYgJEdldFBhcmFte05ld1F1ZXVlSUR9CiAgICAgICAgICAgICYmICRHZXRQYXJhbXtOZXdRdWV1ZUlEfSBuZSAkVGlja2V0e1F1ZXVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIG1vdmUgdGlja2V0IChzZW5kIG5vdGlmaWNhdGlvbiBpZiBubyBuZXcgb3duZXIgaXMgc2VsZWN0ZWQpCiAgICAgICAgICAgIG15ICRCb2R5QXNUZXh0ID0gJyc7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5QXNUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEJvZHlBc1RleHQgPSAkR2V0UGFyYW17Qm9keX0gfHwgMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkTW92ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UXVldWVTZXQoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgPT4gJEdldFBhcmFte05ld1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICA9PiAkQm9keUFzVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE1vdmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIG15ICRSZXR1cm5VUkw7CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlIHN0YXRlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZSBvbiBwZW5kaW5nIHN0YXRlCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHBhcmVudCB3aW5kb3cgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuVVJMID0gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9IHx8ICdBY3Rpb249QWdlbnREYXNoYm9hcmQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtDcmVhdGVBcnRpY2xlfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfQogICAgICAgICAgICAmJiAoICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAkR2V0UGFyYW17Qm9keX0gKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3ViamVjdCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJEdldFBhcmFte1N1YmplY3R9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIHN1YmplY3QnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBBcnRpY2xlVHlwZUlELCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QXJ0aWNsZVR5cGV9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiXCIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgbXkgQE5vdGlmeVVzZXJJRHM7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CiAgICAgICAgICAgICAgICBATm90aWZ5VXNlcklEcyA9ICgKICAgICAgICAgICAgICAgICAgICBAeyAkU2VsZi0+e1JlcGx5VG9TZW5kZXJVc2VySUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBOb3RpZnlVc2VySURzID0gKCBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFxATm90aWZ5VXNlcklEcywKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gXEBOb3RpZnlEb25lLAogICAgICAgICAgICAgICAgVW5sb2NrT25Bd2F5ICAgICAgICAgICAgICAgICAgICA9PiAkVW5sb2NrT25Bd2F5LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNraXAsIGRlbGV0ZWQgbm90IHVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSBleGlzdGluZyBmaWxlIHRvIGJhY2tlbmQKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlncmF0aW9uCiAgICAgICAgICAgIG15ICRPYmplY3RJRAogICAgICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnID8gJEFydGljbGVJRCA6ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCAoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlnIGZvciBjcml0aWNhbGl0eSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgY3JpdGljYWxpdHkKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldmVyc2UgdGhlIGxpc3QgdG8gZmluZCBvdXQgdGhlIGtleQogICAgICAgICAgICBteSAlUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSByZXZlcnNlICV7ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzIH07CgogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAkUmV0dXJuVVJMIHx8PSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCI7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAkUmV0dXJuVVJMLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0dldFNlcnZpY2VJbmNpZGVudFN0YXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHNlbGVjdGVkIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnOwoKICAgICAgICAjIGJ1aWxkIGVtcHR5IHJlc3BvbnNlIGhhc2gKICAgICAgICBteSAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJycsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJyZuYnNwJywKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgaWYgc2VydmljZSBpZCBpcyBzZWxlY3RlZCBhbmQgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgc2NyZWVuCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3dJbmNpZGVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgICAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkU2VydmljZXtDdXJJbmNpU3RhdGV9KSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZW5jb2RlIHJlc3BvbnNlIHRvIEpTT04KICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJVRpY2tldCAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgIG15ICRTZXJ2aWNlSUQ7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgdmFsdWUgZnJvbSBwYXJhbSBpZiBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBzY3JlZW4KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgdXNlIHRpY2tldCBzZXJ2aWNlIHZhbHVlIHNpbmNlIGl0IGNhbid0IGJlIGNoYW5nZWQKICAgICAgICBlbHNpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRUaWNrZXR7U2VydmljZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRRdWV1ZUlEID0gJEdldFBhcmFte05ld1F1ZXVlSUR9IHx8ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0KICAgICAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkT3duZXJzID0gJFNlbGYtPl9HZXRPd25lcnMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT2xkT3duZXJzID0gJFNlbGYtPl9HZXRPbGRPd25lcnMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGUoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VydmljZUlEIHx8ICEkU2VydmljZXMtPnskU2VydmljZUlEfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaGVtZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkRWxlbWVudENoYW5nZWQgZXEgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgKSB7CiAgICAgICAgICAgIG15IEBUaWNrZXRBdHRhY2htZW50czsKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVGV4dDsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICAgICAgbXkgJFJlbW92ZVN1Y2Nlc3MgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3ItPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGlmIFJlcGx5VG9BcnRpY2xlIGlzIGdpdmVuLCBnZXQgdGhpcyBhcnRpY2xlIHRvIGdlbmVyYXRlCiAgICAgICAgICAgICAgICAjIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBhcnRpY2xlIHRvIHF1b3RlCiAgICAgICAgICAgICAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ID0+ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcHJlcGFyZSBxdW90ZWQgYm9keSBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+X0dldFF1b3RlZFJlcGx5Qm9keSgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4gJEJvZHksCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlVGV4dCAuICc8YnI+PGJyPicgLiAkQm9keTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVUZXh0IC4gIlxuXG4iIC4gJEJvZHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAgICAgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlTm90ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPbGRPd25lcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gPyAwIDogMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVgsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRCb2R5ID0gJyc7CgogICAgICAgICMgaWYgUmVwbHlUb0FydGljbGUgaXMgZ2l2ZW4sIGdldCB0aGlzIGFydGljbGUgdG8gZ2VuZXJhdGUKICAgICAgICAjIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgdG8gcXVvdGUKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgPT4gJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCA9PiAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBxdW90ZWQgYm9keSBjb250ZW50CiAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPl9HZXRRdW90ZWRSZXBseUJvZHkoCiAgICAgICAgICAgICAgICAleyAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH0gfSwKICAgICAgICAgICAgICAgIEJvZHkgPT4gJEJvZHksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgYm9keSBjb250ZW50IHdhcyBwcmUgZGVmaW5lZCwgYWRkIHRoaXMgYmVmb3JlIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQm9keSA9ICRHZXRQYXJhbXtCb2R5fSAuICRCb2R5OwogICAgICAgIH0KCiAgICAgICAgIyBmaWxsdXAgY29uZmlndXJlZCBkZWZhdWx0IHZhcnMKICAgICAgICBpZiAoICRCb2R5IGVxICcnICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQm9keSB2YXIgdG8gY2FsY3VsYXRlZCBjb250ZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEJvZHk7CgogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRTdWJqZWN0UmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTdWJqZWN0UmUnKTsKICAgICAgICAgICAgaWYgKCRUaWNrZXRTdWJqZWN0UmUpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgICAgID0gJFRpY2tldFN1YmplY3RSZSAuICc6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAnUmU6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgb25seSBnZXQgdmFsdWVzIGZvciBUaWNrZXQgZmllbGRzIChhbGwgc2NyZWVucyBiYXNlZCBvbiBBZ2VudFRpY2tlQWN0aW9uQ29tbW9uCiAgICAgICAgICAgICMgZ2VuZXJhdGVzIGEgbmV3IGFydGljbGUsIHRoZW4gYXJ0aWNsZSBmaWVsZHMgd2lsbCBiZSBhbHdheXMgZW1wdHkgYXQgdGhlIGJlZ2lubmluZykKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldAogICAgICAgICAgICAgICAgJFZhbHVlID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICksCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKAogICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIFdpZGdldCBUaWNrZXQgQWN0aW9ucwogICAgaWYgKAogICAgICAgICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkKICAgICAgICB8fAogICAgICAgICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApICAgICB8fAogICAgICAgICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB8fAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSB8fAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1F1ZXVlfSB8fAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSB8fAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSB8fAogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXRUaWNrZXRBY3Rpb25zJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE5hbWVzID0gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgKICAgICAgICBPbmx5RHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGNyZWF0ZSBhIHN0cmluZyB3aXRoIHRoZSBxdW90ZWQgZHluYW1pYyBmaWVsZCBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkTmFtZXMpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyREeW5hbWljRmllbGROYW1lc30gKSB7CiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGROYW1lc1N0cmd9IC49ICIsICciIC4gJEZpZWxkIC4gIiciOwogICAgICAgIH0KICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICEkUGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2VNYW5kYXRvcnl9ICkgewoKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17U2VydmljZUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17U2VydmljZUludmFsaWR9IHx8ICcgJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NMQU1hbmRhdG9yeX0gKSB7CgogICAgICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte1NMQUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEFNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UXVldWV9ICkgewoKICAgICAgICAjIGZldGNoIGFsbCBxdWV1ZXMKICAgICAgICBteSAlTW92ZVF1ZXVlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TW92ZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbW92ZSBxdWV1ZXMKICAgICAgICAkUGFyYW17UXVldWVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBEYXRhID0+IHsgJU1vdmVRdWV1ZXMsICcnID0+ICctJyB9LAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnTmV3UXVldWVJRCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOZXdRdWV1ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte05ld1F1ZXVlSUR9LAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIEN1cnJlbnRRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte05ld093bmVySW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSBAT2xkT3duZXJzOwogICAgICAgIG15ICVTZWVuT2xkT3duZXI7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIFVTRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgICAgICMgc2tpcCBpZiBvbGQgb3duZXIgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdAogICAgICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRTZWVuT2xkT3duZXJ7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFNlZW5PbGRPd25lcnsgJFVzZXItPntVc2VySUR9IH0gPSAxOwogICAgICAgICAgICAgICAgcHVzaCBAT2xkT3duZXJzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFVzZXItPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICIkQ291bnRlcjogJFVzZXItPntVc2VyRnVsbG5hbWV9IgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBPbGRPd25lcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte09sZE93bmVySW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZCA9ICJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZCA9ICJjaGVja2VkIic7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewoKICAgICAgICBteSAlU3RhdGU7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZFZhbHVlfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIFNUQVRFSUQ6CiAgICAgICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IFNUQVRFSUQgaWYgISRTdGF0ZUlEOwoKICAgICAgICAgICAgIyBnZXQgc3RhdGUgZGF0YQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwoKICAgICAgICAgICAgbmV4dCBTVEFURUlEIGlmICRTdGF0ZURhdGF7VHlwZU5hbWV9ICF+IC9wZW5kaW5nL2k7CgogICAgICAgICAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICAgICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGxhc3QgU1RBVEVJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewoKICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkVmFsdWV9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gfHw9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgRW5kIFdpZGdldCBUaWNrZXQgQWN0aW9ucwoKICAgICMgV2lkZ2V0IER5bmFtaWMgRmllbGRzCgogICAgaWYgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXREeW5hbWljRmllbGRzJywKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKIyAtLS0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluZGl2aWR1YWxseQogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKICAgICAgICAgICAgcHVzaCBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgY3ljbGUgdHJvdWdoIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzICkgewoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQoKICAgICMgRW5kIFdpZGdldCBEeW5hbWljIEZpZWxkcwoKICAgICMgV2lkZ2V0IEFydGljbGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICRQYXJhbXtXaWRnZXRTdGF0dXN9ID0gJ0NvbGxhcHNlZCc7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57Tm90ZU1hbmRhdG9yeX0KICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgfHwgJFBhcmFte0lzVXBsb2FkfQogICAgICAgICAgICB8fCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17V2lkZ2V0U3RhdHVzfSA9ICdFeHBhbmRlZCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0UmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte0JvZHlSZXF1aXJlZH0gICAgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1N1YmplY3RSZXF1aXJlZH0KICAgICAgICAgICAgICAgID0gJ1ZhbGlkYXRlX0RlcGVuZGluZ1JlcXVpcmVkQU5EIFZhbGlkYXRlX0RlcGVuZGluZ19DcmVhdGVBcnRpY2xlJzsKICAgICAgICAgICAgJFBhcmFte0JvZHlSZXF1aXJlZH0KICAgICAgICAgICAgICAgID0gJ1ZhbGlkYXRlX0RlcGVuZGluZ1JlcXVpcmVkQU5EIFZhbGlkYXRlX0RlcGVuZGluZ19DcmVhdGVBcnRpY2xlJzsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dpZGdldEFydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgYW5kIHJldHJpZXZlIGludm9sdmVkIGFuZCBpbmZvcm1lZCBhZ2VudHMgb2YgUmVwbHlUbyBOb3RlCiAgICAgICAgbXkgQFJlcGx5VG9Vc2VyczsKICAgICAgICBteSAlUmVwbHlUb1VzZXJzSGFzaDsKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewogICAgICAgICAgICBteSBAUmVwbHlUb1BhcnRzID0gJFNlbGYtPntFbWFpbFBhcnNlck9iamVjdH0tPlNwbGl0QWRkcmVzc0xpbmUoCiAgICAgICAgICAgICAgICBMaW5lID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fS0+e1RvfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFJFUExZVE9QQVJUOgogICAgICAgICAgICBmb3IgbXkgJFNpbmdsZVJlcGx5VG9QYXJ0IChAUmVwbHlUb1BhcnRzKSB7CiAgICAgICAgICAgICAgICBteSAkUmVwbHlUb0FkZHJlc3MgPSAkU2VsZi0+e0VtYWlsUGFyc2VyT2JqZWN0fS0+R2V0RW1haWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEVtYWlsID0+ICRTaW5nbGVSZXBseVRvUGFydCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBSRVBMWVRPUEFSVCBpZiAhJFJlcGx5VG9BZGRyZXNzOwogICAgICAgICAgICAgICAgcHVzaCBAUmVwbHlUb1VzZXJzLCAkUmVwbHlUb0FkZHJlc3M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBseVRvVXNlcnNIYXNoeyRffSsrIGZvciBAUmVwbHlUb1VzZXJzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gfHwgJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZGRpdGlvbmFsQWdlbnRzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGVtYWlsIGFkZHJlc3Mgb2YgYWxsIHVzZXJzIGFuZCBjb21wYXJlIHRvIHJlcGx5dG8tYWRkcmVzc2VzCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFVzZXJFbWFpbCA9ICRVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgICAgIGlmICggJFJlcGx5VG9Vc2Vyc0hhc2h7JFVzZXJFbWFpbH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW5mb3JtQWdlbnRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkluZm9ybUFnZW50TWF4U2l6ZScpCiAgICAgICAgICAgICAgICB8fCAzOwogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgID0+ICRJbmZvcm1BZ2VudFNpemUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CgogICAgICAgICAgICBteSBAVXNlcklEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0SW52b2x2ZWRBZ2VudHNMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBASW52b2x2ZWRBZ2VudHM7CiAgICAgICAgICAgIG15ICVTZWVuSW52b2x2ZWRBZ2VudHM7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKCiAgICAgICAgICAgIFVTRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRTZWVuSW52b2x2ZWRBZ2VudHN7ICRVc2VyLT57VXNlcklEfSB9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyRnVsbG5hbWV9IjsKICAgICAgICAgICAgICAgIGlmICggJFVzZXItPntPdXRPZk9mZmljZU1lc3NhZ2V9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSAuPSAiICRVc2VyLT57T3V0T2ZPZmZpY2VNZXNzYWdlfSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBASW52b2x2ZWRBZ2VudHMsIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkVXNlci0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CgogICAgICAgICAgICAgICAgIyBhZGQgaW52b2x2ZWQgdXNlciwgaWYgYXZhaWxhYmxlIGluIFJlcGx5VG9BZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAmJiAkUmVwbHlUb1VzZXJzSGFzaHsgJFVzZXItPntVc2VyRW1haWx9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9LCAkVXNlci0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRJbnZvbHZlZEFnZW50U2l6ZQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6SW52b2x2ZWRBZ2VudE1heFNpemUnKSB8fCAzOwogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBJbnZvbHZlZEFnZW50cywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgID0+ICRJbnZvbHZlZEFnZW50U2l6ZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdWJqZWN0TGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3ViamVjdExhYmVsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0TGFiZWwnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlT2JqZWN0fS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFR5cGUgID0+ICdOb3RlJywKICAgICAgICApOwoKICAgICAgICBteSAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgICAgICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgfHwgKCAkU2VsZi0+e0NvbmZpZ30tPntRdWV1ZX0gJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzICAgIHx8IHt9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlOwoKICAgICAgICAjIHNldCBhcnRpY2xlIHR5cGUgb2YgdGhpcyBub3RlIHRvIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGFydGljbGUgZm9yIHdob20gdGhpcyBpcyB0aGUgcmVwbHkKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICYmICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRWYWx1ZX0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gKSB7CiAgICAgICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgICAgICBteSAlTm90ZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFJlc3VsdCA9PiAnSEFTSCcgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlOb3RlVHlwZSAoIHNvcnQga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JEtleU5vdGVUeXBlfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRLZXlOb3RlVHlwZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEVuZCBXaWRnZXQgQXJ0aWNsZQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAkU2VsZi0+e0FjdGlvbn0sIERhdGEgPT4gXCVQYXJhbSApOwp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBhbGwgdXNlcnMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgb25seSB1c2VycyB3aXRoIHJlc3BvbnNpYmxlIG9yIHJ3IHBlbWlzc2lvbnMgaW4gdGhlIHF1ZXVlCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCgKICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17TmV3UXVldWVJRH0gfHwgJFBhcmFte1F1ZXVlSUR9CiAgICAgICAgKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldE93bmVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgYWxsIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IG9ubHkgdXNlcnMgd2l0aCBvd25lciBvciBydyBwZW1pc3Npb25zIGluIHRoZSBxdWV1ZQogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte05ld1F1ZXVlSUR9IHx8ICRQYXJhbXtRdWV1ZUlEfQogICAgICAgICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnTmV3T3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRPbGRPd25lcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgbXkgJVVzZXJIYXNoOwogICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICBVU0VSOgogICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CgogICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9CiAgICAgICAgICAgICAgICA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyRnVsbG5hbWV9IjsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ09sZE93bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVVc2VySGFzaDsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVByaW9yaXRpZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICk7CiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICRQcmlvcml0aWVzeycnfSA9ICctJzsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlYWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzCiAgICAgICAgICAgID0gcXcoCiAgICAgICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgTmV3T3duZXJJRCBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQgTmV3U3RhdGVJRAogICAgICAgICAgICBOZXdQcmlvcml0eUlECiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuIFxAVXBkYXRhYmxlRmllbGRzOwp9CgpzdWIgX0dldFF1b3RlZFJlcGx5Qm9keSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICBpZiAoICRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgICAgICBteSAkUXVvdGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpRdW90ZScpIHx8ICcnLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRRdW90ZSkgewoKICAgICAgICAgICAgICAgICMgcXVvdGUgdGV4dAogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIjxibG9ja3F1b3RlIHR5cGU9XCJjaXRlXCI+JFBhcmFte0JvZHl9PC9ibG9ja3F1b3RlPlxuIjsKCiAgICAgICAgICAgICAgICAjIGNsZWFudXAgbm90IGNvbXBhdC4gdGFncwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q2xlYW51cCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtDcmVhdGVkfSwgJ0RhdGVGb3JtYXQnLCAnTm9TZWNvbmRzJyApOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0IC49ICcgLSAnIC4gJFBhcmFte0Zyb219IC4gJyAnOwogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0CiAgICAgICAgICAgICAgICAgICAgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ3dyb3RlJykgLiAnOic7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFJlc3BvbnNlRm9ybWF0IC4gJFBhcmFte0JvZHl9OwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICI8YnIvPiIgLiAkUGFyYW17Qm9keX07CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3JlYXRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICI6ICRQYXJhbXtDcmVhdGVkfTxici8+IiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJF8pIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICRQYXJhbXskX308YnIvPiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRGcm9tID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZUZyb20KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgIG15ICRFbmRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIG1lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJyLz4tLS0tICRNZXNzYWdlRnJvbSAkRnJvbSAtLS08YnIvPjxici8+IiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHByZXBhcmUgYm9keSwgc3ViamVjdCwgUmVwbHlUbyAuLi4KICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkUGFyYW17Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgIG15ICRRdW90ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpRdW90ZScpOwogICAgICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPX4gcy9cbi9cbiRRdW90ZSAvZzsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICJcbiRRdW90ZSAiIC4gJFBhcmFte0JvZHl9OwoKICAgICAgICAgICAgICAgIG15ICRSZXNwb25zZUZvcm1hdCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+Rm9ybWF0VGltZVN0cmluZyggJFBhcmFte0NyZWF0ZWR9LCAnRGF0ZUZvcm1hdCcsICdOb1NlY29uZHMnICk7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgLj0gJyAtICcgLiAkUGFyYW17RnJvbX0gLiAnICc7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQKICAgICAgICAgICAgICAgICAgICAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnd3JvdGUnKSAuICI6XG4iOwoKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRSZXNwb25zZUZvcm1hdCAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICJcbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtDcmVhdGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFte0NyZWF0ZWR9XG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkXykgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFteyRffVxuIiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2VGcm9tCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VuZCBtZXNzYWdlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuLS0tLSAkTWVzc2FnZUZyb20gJFBhcmFte0Zyb219IC0tLVxuXG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9IC49ICJcbi0tLS0gJEVuZE1lc3NhZ2UgLS0tXG4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Qm9keX07Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjcmVhdGUgdGVtcGxhdGVzCiAgICBteSAlVGVtcGxhdGVzOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCBRdWV1ZUlEIGZyb20gdGhlIHRpY2tldAogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFF1ZXVlSUQgPSAkVGlja2V0e1F1ZXVlSUR9IHx8ICcnOwogICAgfQoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIFwlVGVtcGxhdGVzIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze05vdGV9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tOb3RlfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0gLSBhZGRpdGlvbmFsIGl0c20gZmllbGRzIGZvciB0aWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDsKCiMgLS0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyggS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiApOwoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RGVjaXNpb24ucG0gLSB0byBhZGQgbm90ZXMgKGRlY2lzaW9uKSB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldERlY2lzaW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIGJhc2UgcXcoIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb24gKTsKCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0gLSB0byBjb21wb3NlIGluaXRpYWwgZW1haWwgdG8gY3VzdG9tZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvTW9kdWxlcy9BZ2VudFRpY2tldEVtYWlsLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNYWlsOjpBZGRyZXNzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlsczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKIyAtLS0KCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IE1haW5PYmplY3QgQ29uZmlnT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgaWYgKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gJiYgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbC8gKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwogICAgJEFDTENvbXBhdEdldFBhcmFte093bmVySUR9ID0gJEdldFBhcmFte05ld1VzZXJJRH07CgogICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgIG15ICRJc1VwbG9hZCA9ICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSA/IDEgOiAwICk7CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBUby1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyCiAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclNlbGVjdGVkJyApIHx8ICcnOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQKICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwoKICAgICAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgQ2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MKICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MKICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwoKICAgICAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQ2MsIHsKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eENjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudENjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5Q2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQ2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIEJjYy1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjCiAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MKICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CgogICAgICAgICAgICBpZiAoJEN1c3RvbWVyRWxlbWVudEJjYykgewoKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQmNjID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gPSAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRCY2MpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWMgZmllbGQgZm9yIHRoZSBpbXBhY3QKICAgIG15ICRJbXBhY3REeW5hbWljRmllbGRDb25maWc7CiMgLS0tCgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBpbXBhY3QgZmllbGQgd2FzIGZvdW5kCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbXBhY3QgZmllbGQKICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgfQojIC0tLQogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0KICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgaW1wYWN0CiAgICAgICAgICAgIG15ICRJbXBhY3RQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRJbXBhY3REeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRJbXBhY3RQb3NzaWJsZVZhbHVlcy0+eyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9IH0gfHwgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICBlbHNlIHsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgIyBzaG93IG9ubHkgdGhlIGVtcHR5IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ID0ge307CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgfQoKICAgICMgc2V0IHRoZSBzZWxlY3RlZCBpbXBhY3QKICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwojIC0tLQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSB8fCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAjIGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpY2tldCBpZCEKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSB8fCAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ1RpY2tldCAiJXMiIGNyZWF0ZWQhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgTGluayA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0b3JlIHRoZSBkeW5hbWljIGZpZWxkcyBkZWZhdWx0IHZhbHVlcyBvciB1c2VkIHNwZWNpZmljIGRlZmF1bHQgdmFsdWVzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgIyBBQ0xzIGluZm8gZm9yIGFsbCBmaWVsZHMKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgICAgICBteSAkRGVmYXVsdFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICREZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJERlZmF1bHRWYWx1ZSBlcSAnJzsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxECiAgICAgICAgICAgICAgICAgICAgaWYgcmVmICREZWZhdWx0VmFsdWUgZXEgJ0FSUkFZJyAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGREZWZhdWx0c3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICAgICA9ICREZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcQogICAgICAgICAgICAgICAgJ0hBU0gnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVKb2JzCiAgICAgICAgICAgICAgICAgICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhbmQgZm9ybWF0IGRlZmF1bHQgc3ViamVjdCBhbmQgYm9keQogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VycyA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEZyb21MaXN0ID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgID0+IHt9LAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBkZWxpdmVyIHNpZ25hdHVyZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NpZ25hdHVyZScgKSB7CiAgICAgICAgbXkgJFF1ZXVlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdRdWV1ZUlEJyApOwogICAgICAgIGlmICggISRRdWV1ZUlEICkgewogICAgICAgICAgICBteSAkRGVzdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgICAgICgkUXVldWVJRCkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCB3aXRoIGVtcHR5IHNpZ25hdHVyZSAobm8gcXVldWUgc2VsZWN0ZWQpIC0gaWYgd2UgaGF2ZSBhIHF1ZXVlLCBnZXQgdGhlIHNpZy4KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJE1pbWVUeXBlIC4gJzsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICROZXh0U3RhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApIHx8ICcnOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCROZXh0U3RhdGVJRCkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkTmV4dFN0YXRlSUQsICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgICAgICAgID0gJFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICBteSAkTmV3UmVzcG9uc2libGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1Jlc3BvbnNpYmxlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJE5ld1VzZXJJRCAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkRnJvbSApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlUXVldWUgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ICAgICAgICAgICAgPSAkTmV3UXVldWVJRDsKICAgICAgICAkR2V0UGFyYW17RXhwYW5kQ3VzdG9tZXJOYW1lfSA9ICRFeHBhbmRDdXN0b21lck5hbWU7CgogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xlYXJUbycgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRJdGVtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJE51bWJlciIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICROdW1iZXIgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE51bWJlciA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBteSBAQXR0YWNobWVudElEcyA9IG1hcCB7CiAgICAgICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICB9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkRGVsZXRlOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJElzVXBsb2FkICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgJUVycm9yICAgICAgICAgICAgICAgICAgID0gKCk7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICYmICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewoKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uUmVzdWx0ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0hIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgJycsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgRXhwYW5kIEN1c3RvbWVyIE5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJLZXkgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyS2V5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEN1c3RvbWVyVXNlcktleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ICAgICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoIEtleSA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsIFZhbHVlID0+IDAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CgogICAgICAgICAgICAgICAgIyBjbGVhciB0byBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcm9tIGFuZCBjdXN0b21lciBpZCBpZiBjdXN0b21lciB1c2VyIGlzIGdpdmVuCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDIgKSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJLZXkgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyVXNlckxpc3R7JEN1c3RvbWVyVXNlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9ID0gJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBuZXcgZGVzdGluYXRpb24gcXVldWUgaXMgc2VsZWN0ZWQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMyApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIFBBUkFNRVRFUjoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhJEdldFBhcmFteyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRHZXRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0Vycm9yVHlwZScgfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBub3QgYSBzdWJhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMsIGNoZWNrIGZvciBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCAhJElzVXBsb2FkICYmICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUeXBlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9LCApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgIyB0aWNrZXQgcGFyYW1zCiAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtID0gKAogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+QXJ0aWNsZU9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzZXQgQm9keSBhbmQgU3ViamVjdCBwYXJhbWV0ZXJzIGZvciBPdXRwdXQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRCb2R5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGhlYWRlcgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyAgID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZSAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgJycsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgICAgPT4gJFNlbGYtPl9HZXRUb3MoKSwKICAgICAgICAgICAgICAgIEZyb21TZWxlY3RlZCA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte1N1YmplY3R9ICksCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHRpY2tldCwgZG8gZGIgaW5zZXJ0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkU2VsZWN0ZWRDdXN0b21lclVzZXIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlnIGZvciBjcml0aWNhbGl0eSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgY3JpdGljYWxpdHkKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldmVyc2UgdGhlIGxpc3QgdG8gZmluZCBvdXQgdGhlIGtleQogICAgICAgICAgICBteSAlUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSByZXZlcnNlICV7ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzIH07CgogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXN7ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdAogICAgICAgIG15ICRUbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdOZXcnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgbmV3IG93bmVyIGlzIGdpdmVuICh0aGVuIHNlbmQgbm8gYWdlbnQgbm90aWZ5KQogICAgICAgIG15ICROb0FnZW50Tm90aWZ5ID0gMDsKICAgICAgICBpZiAoJE5ld1VzZXJJRCkgewogICAgICAgICAgICAkTm9BZ2VudE5vdGlmeSA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICc8YnIvPjxici8+JyAuICRTaWduYXR1cmU7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50cyA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICJcblxuIiAuICRTaWduYXR1cmU7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzZW5kZXIKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3ItPm5ldyggJXskU2VsZn0gKTsKICAgICAgICBteSAkU2VuZGVyICAgICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNlbmRlcigKICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZW5kIGVtYWlsCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgID0+ICROb0FnZW50Tm90aWZ5LAogICAgICAgICAgICBBdHRhY2htZW50ICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgIEZyb20gICAgICAgICAgID0+ICRTZW5kZXIsCiAgICAgICAgICAgIFRvICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgIENjICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDY30sCiAgICAgICAgICAgIEJjYyAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0KICAgICAgICAgICAgICAgIHx8ICJcJVwlJEdldFBhcmFte1RvfSwgJEdldFBhcmFte0NjfSwgJEdldFBhcmFte0JjY30iLAogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHByZS1zdWJtaXR0ZWQgYXR0YWNobWVudHMKICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgc2V0IG93bmVyIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1VzZXJJRCkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbHNlIHNldCBvd25lciB0byBjdXJyZW50IGFnZW50IGJ1dCBkbyBub3QgbG9jayBpdAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTZW5kTm9Ob3RpZmljYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCROZXdSZXNwb25zaWJsZUlEKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3VsZCBpIHNldCBhbiB1bmxvY2s/CiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBzb3J0IGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBzb3J0IGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgLS0tCiAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVOZXh0TWFza30gfHwgJ0FnZW50VGlja2V0RW1haWwnOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47U3ViYWN0aW9uPUNyZWF0ZWQ7VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdHZXRTZXJ2aWNlSW5jaWRlbnRTdGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRoZSBzZWxlY3RlZCBzZXJ2aWNlIGlkCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBidWlsZCBlbXB0eSByZXNwb25zZSBoYXNoCiAgICAgICAgbXkgJVJlc3BvbnNlID0gKAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICcnLAogICAgICAgICAgICBDdXJJbmNpU3RhdGUgID0+ICcmbmJzcCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBvbmx5IGlmIHNlcnZpY2UgaWQgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICRTZXJ2aWNlSUQgJiYgJFNlbGYtPntDb25maWd9LT57U2hvd0luY2lkZW50U3RhdGV9ICkgewoKICAgICAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgJVJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRTZXJ2aWNle0N1ckluY2lTdGF0ZX0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmNvZGUgcmVzcG9uc2UgdG8gSlNPTgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IFwlUmVzcG9uc2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBGcm9tIGJhc2VkIG9uIHNlbGVjdGVkIHF1ZXVlCiAgICAgICAgbXkgJFF1ZXVlSUQgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgICAgIG15ICVRdWV1ZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRRdWV1ZXtFbWFpbH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRvcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICBteSAkTmV3VG9zOwoKICAgICAgICBpZiAoJFRvcykgewogICAgICAgICAgICBUT3M6CiAgICAgICAgICAgIGZvciBteSAkS2V5VG8gKCBzb3J0IGtleXMgJXskVG9zfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVE9zIGlmICggJFRvcy0+eyRLZXlUb30gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAkTmV3VG9zLT57IiRLZXlUb3x8JFRvcy0+eyRLZXlUb30ifSA9ICRUb3MtPnskS2V5VG99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgfQogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8ICcnLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAwLAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgogICAgICAgIGlmICggJEVsZW1lbnRDaGFuZ2VkIGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAgICAgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQEV4dGVuZGVkRGF0YTsKCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgUXVldWVJRCBmcm9tIHdlYiByZXF1ZXN0IGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRDsKCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgU2lnbmF0dXJlIHRvIEFTQ0lJLCBpZiBSaWNoVGV4dCBpcyBvbgogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKCBTdHJpbmcgPT4gJFNpZ25hdHVyZSwgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV3VG9zLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2lnbmF0dXJlJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVgsCiAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBTdWJhY3Rpb24hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yJywKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRHcm91cE1lbWJlcktleSApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRHcm91cE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIG93bmVyIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJE1lbWJlcktleSAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skTWVtYmVyS2V5fSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRNZW1iZXJLZXl9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ093bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRHcm91cE1lbWJlcktleSApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRHcm91cE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJE1lbWJlcktleSAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skTWVtYmVyS2V5fSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRNZW1iZXJLZXl9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVNlcnZpY2UgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICAgICAgVGFibGUgPT4gJ3N5c3RlbV9hZGRyZXNzJywKICAgICAgICAgICAgICAgIFdoYXQgID0+ICdxdWV1ZV9pZCwgaWQnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIENsYW1wID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlVG9zICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3ItPm5ldyggJXskU2VsZn0gKTsKICAgIG15ICRTaWduYXR1cmUgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIERhdGEgICAgPT4gXCVQYXJhbSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTaWduYXR1cmU7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjcmVhdGUgdGVtcGxhdGVzCiAgICBteSAlVGVtcGxhdGVzOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCBRdWV1ZUlEIGZyb20gdGhlIHRpY2tldAogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFF1ZXVlSUQgPSAkVGlja2V0e1F1ZXVlSUR9IHx8ICcnOwogICAgfQoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIFwlVGVtcGxhdGVzIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze0NyZWF0ZX0gKTsKCiAgICAjIHJldHVybiBqdXN0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gJFN0YW5kYXJkVGVtcGxhdGVze0NyZWF0ZX07Cn0KCnN1YiBfTWFza0VtYWlsTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGJ1aWxkIGN1c3RvbWVyIHNlYXJjaCBhdXRvY29tcGxldGUgZmllbGQKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte1VzZXJzfS0+eycnfSA9ICctJzsKICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICk7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17TmV4dFN0YXRlfSB8fCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIERlc3RpbmF0aW9uIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17RnJvbUxpc3R9ICkgewogICAgICAgIGZvciBteSAkRnJvbUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEZyb21LZXl8fCRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX0ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57RGVzdGluYXRpb25JbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtGcm9tU2VsZWN0ZWR9LAogICAgICAgICAgICBPbkNoYW5nZVN1Ym1pdCA9PiAwLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RnJvbVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAkUGFyYW17RXJyb3JzfS0+e0Rlc3RpbmF0aW9uSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtDdXN0b21lckRhdGF9LAogICAgICAgICAgICBNYXggID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3JLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcktleX0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yS2V5fSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZyb20gZXh0ZXJuYWwKICAgIG15ICRTaG93RXJyb3JzID0gMTsKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0KICAgICAgICAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2hvd0Vycm9ycyA9IDA7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQ2MgKSB7CiAgICAgICAgJFBhcmFte0NjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgQmNjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte1RvSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtCY2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIGNyZWF0ZSBhIHN0cmluZyB3aXRoIHRoZSBxdW90ZWQgZHluYW1pYyBmaWVsZCBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkTmFtZXMpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyREeW5hbWljRmllbGROYW1lc30gKSB7CiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGROYW1lc1N0cmd9IC49ICIsICciIC4gJEZpZWxkIC4gIiciOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2VNYW5kYXRvcnl9ICkgewogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NMQUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1N0YW5kYXJkVGVtcGxhdGVPYmplY3R9LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSAgfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fTsKICAgIH0KICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtQcmlvcml0aWVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBTZWxlY3RlZElEICAgID0+ICRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtQcmlvcml0eX0sCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgKTsKCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgQEluZGl2aWR1YWxEeW5hbWljRmllbGRzOwojIC0tLQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgc2tpcCBmaWVsZHMgdGhhdCBIVE1MIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBodG1sIHN0cmluZ3MgZm9ybSAkUGFyYW0KICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluZGl2aWR1YWxseQogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKICAgICAgICAgICAgcHVzaCBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KIyAtLS0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBjeWNsZSB0cm91Z2ggZHluYW1pYyBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluZGl2aWR1YWxseQogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHMgKSB7CgogICAgICAgICMgZ2V0IHRoZSBodG1sIHN0cmluZ3MgZm9ybSAkUGFyYW0KICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTaG93bk9wdGlvbnNCbG9jazsKCiAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkIGFuZCBqYXZhIHNjcmlwdCBzdXBwb3J0IGlzIGF2YWlsYWJsZQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEJvb2t9CiAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkcmVzc0Jvb2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CiAgICBpZiAoJE9wdGlvbkN1c3RvbWVyKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBvcHRpb25zIGJsb2NrIHNvIHRoYXQgdGhlICJMaW5rIFRpY2tldCIgb3B0aW9uIGlzIHNob3duCiAgICAjIGV2ZW4gaWYgc3BlbGxjaGVja2VyLCBhZGRyZXNzIGJvb2sgYW5kIE9wdGlvbkN1c3RvbWVyIGlzIHR1cm5lZCBvZmYKICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgIH0KIyAtLS0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEVtYWlsJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlYWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzCiAgICAgICAgICAgID0gcXcoCiAgICAgICAgICAgIFR5cGVJRCBEZXN0IE5leHRTdGF0ZUlEIFByaW9yaXR5SUQgU2VydmljZUlEIFNMQUlEIFNpZ25LZXlJRCBDcnlwdEtleUlEIFRvIENjIEJjYwogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQKICAgICAgICApOwogICAgfQoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0gLSB0byBoYW5kbGUgcGhvbmUgY2FsbHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvTW9kdWxlcy9BZ2VudFRpY2tldFBob25lLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQaG9uZTsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNYWlsOjpBZGRyZXNzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwojIC0tLQoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgTWFpbk9iamVjdCBDb25maWdPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoQXJ0aWNsZUlEIExpbmtUaWNrZXRJRCBQcmlvcml0eUlEIE5ld1VzZXJJRAogICAgICAgIEZyb20gU3ViamVjdCBCb2R5IE5leHRTdGF0ZUlEIFRpbWVVbml0cwogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBSZXNwb25zaWJsZUFsbCBPd25lckFsbCBUeXBlSUQgU2VydmljZUlEIFNMQUlECiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEIEZyb21DaGF0SUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKICAgICRBQ0xDb21wYXRHZXRQYXJhbXtPd25lcklEfSA9ICRHZXRQYXJhbXtOZXdVc2VySUR9OwoKICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICBteSAkSXNVcGxvYWQgPSAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgPyAxIDogMCApOwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBGcm9tLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIKICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lcicgKSB8fCAwOwogICAgbXkgJFNlbGVjdGVkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXIpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlciApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudAogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJFNlbGVjdGVkIGVxICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gLj0gJEN1c3RvbWVyRWxlbWVudCAuICcsJzsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmb3JtIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZHluYW1pYyBmaWVsZCBmb3IgdGhlIGltcGFjdAogICAgbXkgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZzsKIyAtLS0KCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9CiAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgIGlmICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICBteSAlU2VydmljZTsKICAgICMgc2VydmljZSB3YXMgc2VsZWN0ZWQKICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U2hvd0luY2lkZW50U3RhdGV9IHx8IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgIGlmICggISRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBuZSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgbXkgJERlZmF1bHRTZWxlY3Rpb24gPSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX07CgogICAgICAgICAgICBpZiAoJERlZmF1bHRTZWxlY3Rpb24pIHsKCiAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdAogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICREZWZhdWx0U2VsZWN0aW9uOwogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgZm9yIGltcGFjdAogICAgICAgICAgICBteSAkSW1wYWN0UG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkSW1wYWN0UG9zc2libGVWYWx1ZXMtPnsgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSB9IHx8ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgfQogICAgfQoKICAgICMgbm8gc2VydmljZSB3YXMgc2VsZWN0ZWQKICAgIGVsc2UgewoKICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSA9ICcnOwoKICAgICAgICAjIHNob3cgb25seSB0aGUgZW1wdHkgc2VsZWN0aW9uCiAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSB7fTsKICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJyc7CiAgICB9CgogICAgIyBzZXQgdGhlIHNlbGVjdGVkIGltcGFjdAogICAgJER5bmFtaWNGaWVsZFZhbHVlc3tJVFNNSW1wYWN0fSA9ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH07CiMgLS0tCgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2hhdCBpcyBub3QgYWN0aXZlLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE9rLCB0YWtlIHRoZSBjaGF0CiAgICAgICAgbXkgJUNoYXRQYXJ0aWNpcGFudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRQYXJ0aWNpcGFudENoZWNrKAogICAgICAgICAgICBDaGF0SUQgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgICA9PiAnVXNlcicsCiAgICAgICAgICAgIENoYXR0ZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBDaGF0dGVyQWN0aXZlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUNoYXRQYXJ0aWNpcGFudCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIHBlcm1pc3Npb24uIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAgICAgIyBub3RpZnkgaW5mbwogICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaWNrZXQgIiVzIiBjcmVhdGVkIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIExpbmsgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0nCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fQogICAgICAgICAgICAmJiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gIX4gL0FjdGlvbj1BZ2VudFRpY2tldFBob25lLwogICAgICAgICAgICAmJiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0gIX4gL0FjdGlvbj1BZ2VudFRpY2tldFBob25lLipMaW5rVGlja2V0SUQ9LwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAjIGdldCBBcnRpY2xlSUQKICAgICAgICBteSAlQXJ0aWNsZTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIG15ICRBcnRpY2xlRnJvbSA9ICcnOwogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkIHJvIHBlcm1pc3Npb24hIiwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIGlzIGZyb20gdGhlIHNhbWUgVGlja2V0SUQgYXMgd2UgY2hlY2tlZCBwZXJtaXNzaW9ucyBmb3IuCiAgICAgICAgICAgIGlmICggJEFydGljbGV7VGlja2V0SUR9IG5lICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQXJ0aWNsZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGlja2V0ICRTZWxmLT57VGlja2V0SUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzYXZlIGFydGljbGUgZnJvbSBmb3IgYWRkcmVzc2VzIGxpc3QKICAgICAgICAgICAgJEFydGljbGVGcm9tID0gJEFydGljbGV7RnJvbX07CgogICAgICAgICAgICAjIGlmIFRvIGlzIHByZXNlbnQgYW5kIGlzIG5vIGEgcXVldWUKICAgICAgICAgICAgIyBzZXQgVG8gYXMgYXJ0aWNsZSBmcm9tCiAgICAgICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJEFydGljbGV7VG99ICkgKSB7CiAgICAgICAgICAgICAgICBteSAlUXVldWVzICAgICAgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMaXN0KCk7CiAgICAgICAgICAgICAgICBteSAlUXVldWVMb29rdXAgPSByZXZlcnNlICVRdWV1ZXM7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRRdWV1ZUxvb2t1cHsgJEFydGljbGV7VG99IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVGcm9tID0gJEFydGljbGV7VG99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJvZHkgcHJlcGFyYXRpb24gZm9yIHBsYWluIHRleHQgcHJvY2Vzc2luZwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXJ0aWNsZVF1b3RlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCAgPT4gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0sCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyTGlzdCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZXtGcm9tfSA9ICRDdXN0b21lclVzZXJMaXN0eyRLZXlDdXN0b21lclVzZXJMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtdWx0aXBsZSBhZGRyZXNzZXMgbGlzdAogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIG15ICRDb3VudEZyb20gPSBzY2FsYXIgQE11bHRpcGxlQ3VzdG9tZXIgfHwgMTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhRnJvbTsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyRGF0YUZyb20gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQXJ0aWNsZUZyb20pICkgewoKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkQ291bnRGcm9tIGVxICcxJyA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkRW1haWxBZGRyZXNzICAgICA9ICRFbWFpbC0+YWRkcmVzcygpOwogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsQWRkcmVzcyApICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsfSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tIC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ID0gJyc7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEN1c3RvbWVyRGF0YUZyb217VXNlckVtYWlsfQogICAgICAgICAgICAgICAgJiYgJEN1c3RvbWVyRGF0YUZyb217VXNlckVtYWlsfSBlcSAkRW1haWxBZGRyZXNzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcktleSA9ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRFbWFpbC0+YWRkcmVzcygpLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskRW1haWxBZGRyZXNzfSA9IDE7CiAgICAgICAgICAgICRDb3VudEZyb20rKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdG9yZSB0aGUgZHluYW1pYyBmaWVsZHMgZGVmYXVsdCB2YWx1ZXMgb3IgdXNlZCBzcGVjaWZpYyBkZWZhdWx0IHZhbHVlcyB0byBiZSB1c2VkIGFzCiAgICAgICAgIyBBQ0xzIGluZm8gZm9yIGFsbCBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkRGVmYXVsdHM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgIG15ICREZWZhdWx0VmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CgogICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgJERlZmF1bHRWYWx1ZQogICAgICAgICAgICAgICAgICAgID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRGVmYXVsdFZhbHVlIGVxICcnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiByZWYgJERlZmF1bHRWYWx1ZSBlcSAnQVJSQVknICYmICFJc0FycmF5UmVmV2l0aERhdGEoJERlZmF1bHRWYWx1ZSk7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGVmYXVsdHN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJERlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICBteSAlU3BsaXRUaWNrZXRQYXJhbTsKCiAgICAgICAgIyBpbiBjYXNlIG9mIHNwbGl0IGEgVGlja2V0SUQgYW5kIEFydGljbGVJRCBhcmUgYWx3YXlzIGdpdmVuLCBzZW5kIHRoZSBUaWNrZXRJRCB0byBjYWxjdWxhdGUKICAgICAgICAjIEFDTHMgYmFzZWQgb24gcGFyZW50IGluZm9ybWF0aW9uCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgICMgZml4IHRvIGJ1ZyMgODA2OCBGaWVsZCAmIER5bmFtaWNGaWVsZCBwcmVzZWxlY3Rpb24gb24gVGlja2V0U3BsaXQKICAgICAgICAjIHdoZW4gc3BsaXR0aW5nIGEgdGlja2V0IHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGVzIG11c3QgcmVtYWluIGluIHRoZSBuZXcgdGlja2V0IHNjcmVlbgogICAgICAgICMgdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgU3BsaXRUaWNrZXRQYXJhbSBoYXNoCiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBpbmZvcm1hdGlvbiBmcm9tIG9yaWdpbmFsIHRpY2tldCAoU3BsaXRUaWNrZXQpCiAgICAgICAgICAgIG15ICVTcGxpdFRpY2tldERhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0ZWRQYXJhbX0gPSAkU3BsaXRUaWNrZXREYXRheyRTcGxpdGVkUGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0FsbFVzZXJzfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RvU2VsZWN0ZWR9CiAgICAgICAgICAgICAgICA9ICRTcGxpdFRpY2tldERhdGF7UXVldWVJRH0gLiAnfHwnIC4gJFNwbGl0VGlja2V0RGF0YXtRdWV1ZX07CgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU3BsaXRUaWNrZXREYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9EeW5hbWljRmllbGRcXyguKikvICkgewogICAgICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0R5bmFtaWNGaWVsZH17JDF9ID0gJFNwbGl0VGlja2V0RGF0YXskS2V5fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFNwbGl0VGlja2V0UGFyYW17JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgR2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAjIGZyb20gREIgdGhpcyBjYXNlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICAjIHNlbGVjdCBUaWNrZXRJRCBvciBBcnRpY2xlSUQgdG8gZ2V0IHRoZSB2YWx1ZSBkZXBlbmRpbmcgb24gZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0SUQKICAgICAgICAgICAgICAgICAgICA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JwogICAgICAgICAgICAgICAgICAgID8gJFNlbGYtPntUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICA6ICRBcnRpY2xle0FydGljbGVJRH07CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZSAoc3BsaXQpCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQm9keSA9ICRBcnRpY2xle0JvZHl9IHx8ICcnOwogICAgICAgIGlmICggISRCb2R5ICkgewogICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dCAoaWYgYm9keSBpcyBiYXNlZCBvbiBjb25maWcpCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIHRpY2tldCBzcGxpdCBzZXQgJFNlbGYtPntRdWV1ZUlEfSBhcyB0aGUgUXVldWVJRCBvZiB0aGUgb3JpZ2luYWwgdGlja2V0LAogICAgICAgICMgaW4gb3JkZXIgdG8gc2V0IGNvcnJlY3QgQUNMcyBvbiBwYWdlIGxvYWQgKGluaXRpYWwpLiBTZWUgYnVnIDg2ODcuCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTcGxpdFRpY2tldFBhcmFtICkKICAgICAgICAgICAgJiYgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0KICAgICAgICAgICAgJiYgISRTZWxmLT57UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgJycsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBUbyA9PiAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICApLAogICAgICAgICAgICBGcm9tICAgICAgICAgPT4gJEFydGljbGV7RnJvbX0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQm9keSAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIExpbmtUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgRnJvbUNoYXRJRCAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSB8fCAnJywKCiAgICAgICAgICAgICMgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ICkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX0gfHwgJyc7CiAgICAgICAgbXkgJERlc3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJEV4cGFuZEN1c3RvbWVyTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0V4cGFuZEN1c3RvbWVyTmFtZScgKQogICAgICAgICAgICB8fCAwOwogICAgICAgIG15ICVGcm9tRXh0ZXJuYWxDdXN0b21lcjsKICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsZWFyRnJvbScgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRDb3VudCIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnQgPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgbXkgQEF0dGFjaG1lbnRJRHMgPSBtYXAgewogICAgICAgICAgICBteSAoJElEKSA9ICRfID1+IG17IFxBIEF0dGFjaG1lbnREZWxldGUgKFxkKykgXHogfXhtczsKICAgICAgICAgICAgJElEID8gJElEIDogKCk7CiAgICAgICAgfSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW1OYW1lcygpOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICAgICAgaWYgKCAhJEV4cGFuZEN1c3RvbWVyTmFtZSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRJc1VwbG9hZCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcntEYXRlSW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkSXNVcGxvYWQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7RGF0ZUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBvbiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgJiYgISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSEiLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyAgICAgID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleHBhbmQgY3VzdG9tZXIgbmFtZQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhOwogICAgICAgIGlmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAxICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXIKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3Q7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9IDA7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSA9ICRLZXlDdXN0b21lclVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ICAgICAgICAgICAgPSAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9OwogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9ID0gJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhhbiBvbmUgY3VzdG9tZXIgdXNlciBleGlzdCwgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoIEtleSA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsIFZhbHVlID0+IDAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CgogICAgICAgICAgICAgICAgIyBjbGVhciBmcm9tIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9ID0gJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBuZXcgZGVzdGluYXRpb24gcXVldWUgaXMgc2VsZWN0ZWQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMyApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjICdqdXN0JyBubyBzdWJtaXQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gNCApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9ye0Vycm9yVHlwZX0gICA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkRXJyb3J7RnJvbUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb219ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzbGEKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NMQUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICggISRHZXRQYXJhbXtUeXBlSUR9ICkgJiYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUlESW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydSaWNoVGV4dEludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzZXQgQm9keSBhbmQgU3ViamVjdCBwYXJhbWV0ZXJzIGZvciBPdXRwdXQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRCb2R5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza1Bob25lTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VyU2VsZWN0ZWQgICAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRDdXN0b21lcklEICksCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUb1NlbGVjdGVkICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICAgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgRnJvbUV4dGVybmFsQ3VzdG9tZXIgPT4gXCVGcm9tRXh0ZXJuYWxDdXN0b21lciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eX0gKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgZm9yIGNyaXRpY2FsaXR5IGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ3JpdGljYWxpdHknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcG9zc2libGUgdmFsdWVzIGZvciBjcml0aWNhbGl0eQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBmaW5kIG91dCB0aGUga2V5CiAgICAgICAgICAgIG15ICVSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9IHJldmVyc2UgJXsgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQbGFpbkJvZHkgPSAkR2V0UGFyYW17Qm9keX07CgogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBsYWluQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmV3IG93bmVyIGlzIGdpdmVuICh0aGVuIHNlbmQgbm8gYWdlbnQgbm90aWZ5KQogICAgICAgIG15ICROb0FnZW50Tm90aWZ5ID0gMDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdVc2VySUR9ICkgewogICAgICAgICAgICAkTm9BZ2VudE5vdGlmeSA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICBUbyAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJFBsYWluQm9keSwKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSAlQ2hhdCAgICAgICA9ICRDaGF0T2JqZWN0LT5DaGF0R2V0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlTGlzdCA9ICRDaGF0T2JqZWN0LT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ2hhdEFydGljbGVJRDsKCiAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICBteSAkSlNPTkJvZHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQENoYXRNZXNzYWdlTGlzdCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlVHlwZSA9ICdjaGF0LWludGVybmFsJzsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ2hhdHtSZXF1ZXN0ZXJUeXBlfSBlcSAnQ3VzdG9tZXInCiAgICAgICAgICAgICAgICAgICAgfHwgJENoYXR7VGFyZ2V0VHlwZX0gZXEgJ0N1c3RvbWVyJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVUeXBlID0gJ2NoYXQtZXh0ZXJuYWwnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICA9PiAkQ2hhdEFydGljbGVUeXBlLAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCgogICAgICAgICAgICAgICAgICAgICMgRnJvbSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICAgICAgIyBUbyAgICAgICAgICAgICAgID0+ICRUbywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgnQ2hhdCcpLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgID0+ICRKU09OQm9keSwKICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICAgICAgUXVldWUgICAgICAgICAgPT4gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG93bmVyIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdVc2VySUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcmVzcG9uc2libGUgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBsaW5rIHRpY2tldHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9CiAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9CiAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9CiAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkIHJvIHBlcm1pc3Npb24hIiwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNvdXJjZUtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICBteSAkVGFyZ2V0S2V5ID0gJFRpY2tldElEOwoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAkU291cmNlS2V5ID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgJFRhcmdldEtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0gfHwgJ05vcm1hbCcsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNsb3NlZCB0aWNrZXRzIGdldCB1bmxvY2tlZAogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBvcmFyaWx5IGxpbmtzCiAgICAgICAgICAgIG15ICRUZW1wTGlua0xpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgPT4gJ1RlbXBvcmFyeScsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVtcExpbmtMaXN0ICYmIHJlZiAkVGVtcExpbmtMaXN0IGVxICdIQVNIJyAmJiAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0T3JnICggc29ydCBrZXlzICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0eXBlbGlzdAogICAgICAgICAgICAgICAgICAgIG15ICRUeXBlTGlzdCA9ICRUZW1wTGlua0xpc3QtPnskVGFyZ2V0T2JqZWN0T3JnfTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUeXBlICggc29ydCBrZXlzICV7JFR5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRUeXBlTGlzdC0+eyRUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0S2V5T3JnICggc29ydCBrZXlzICV7ICREaXJlY3Rpb25MaXN0LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIHRlbXAgbGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTEgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QyID0+ICRUYXJnZXRPYmplY3RPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTIgICAgPT4gJFRhcmdldEtleU9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNvdXJjZU9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNvdXJjZUtleSAgICA9ICRUYXJnZXRLZXlPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldE9iamVjdCA9ICdUaWNrZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgICAgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERpcmVjdGlvbiBlcSAnVGFyZ2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZU9iamVjdCA9ICdUaWNrZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlS2V5ICAgID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0T2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldEtleSAgICA9ICRUYXJnZXRLZXlPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgcGVybWFuZW50bHkgbGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICRTb3VyY2VPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJFRhcmdldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojIC0tLQogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldFBob25lJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSROZXh0U2NyZWVuO1N1YmFjdGlvbj1DcmVhdGVkO1RpY2tldElEPSRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnR2V0U2VydmljZUluY2lkZW50U3RhdGUnICkgewoKICAgICAgICAjIGdldCB0aGUgc2VsZWN0ZWQgc2VydmljZSBpZAogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJyc7CgogICAgICAgICMgYnVpbGQgZW1wdHkgcmVzcG9uc2UgaGFzaAogICAgICAgIG15ICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAnJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAnJm5ic3AnLAogICAgICAgICk7CgogICAgICAgICMgb25seSBpZiBzZXJ2aWNlIGlkIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3dJbmNpZGVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgICAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkU2VydmljZXtDdXJJbmNpU3RhdGV9KSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZW5jb2RlIHJlc3BvbnNlIHRvIEpTT04KICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKICAgICAgICBteSAkUXVldWVJRCAgICAgICAgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRvcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICBteSAkTmV3VG9zOwoKICAgICAgICBpZiAoJFRvcykgewogICAgICAgICAgICBUT3M6CiAgICAgICAgICAgIGZvciBteSAkS2V5VG8gKCBzb3J0IGtleXMgJXskVG9zfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVE9zIGlmICggJFRvcy0+eyRLZXlUb30gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAkTmV3VG9zLT57IiRLZXlUb3x8JFRvcy0+eyRLZXlUb30ifSA9ICRUb3MtPnskS2V5VG99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8ICcnLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhbmRhcmRUZW1wbGF0ZUlEJyApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cwogICAgICAgICAgICAgICAgICAgID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV3VG9zLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFN0YW5kYXJkVGVtcGxhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gU3ViYWN0aW9uISEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3InLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVOZXh0U3RhdGVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfR2V0VXNlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+R2V0U3Vic2NyaWJlZFVzZXJJRHNCeVF1ZXVlSUQoJVBhcmFtKTsKICAgICAgICBmb3IgbXkgJEtleUdyb3VwTWVtYmVyICggc29ydCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICBteSAkSGl0ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVSUQgKEBVc2VySURzKSB7CiAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJEtleUdyb3VwTWVtYmVyICkgewogICAgICAgICAgICAgICAgICAgICRIaXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRIaXQgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEFsbEdyb3Vwc01lbWJlcnN7JEtleUdyb3VwTWVtYmVyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgYWxsIHN5c3RlbSB1c2VycwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPd25lcicsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15IEBVc2VySURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVNlcnZpY2UgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICAgICAgVGFibGUgPT4gJ3N5c3RlbV9hZGRyZXNzJywKICAgICAgICAgICAgICAgIFdoYXQgID0+ICdxdWV1ZV9pZCwgaWQnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIENsYW1wID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlVG9zICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrUGhvbmVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICApOwoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VXNlclNlbGVjdGVkfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSwKICAgICk7CgogICAgIyBidWlsZCB0byBzdHJpbmcKICAgIG15ICVOZXdUbzsKICAgIGlmICggJFBhcmFte1RvfSApIHsKICAgICAgICBmb3IgbXkgJEtleVRvICggc29ydCBrZXlzICV7ICRQYXJhbXtUb30gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkS2V5VG98fCRQYXJhbXtUb30tPnskS2V5VG99In0gPSAkUGFyYW17VG99LT57JEtleVRvfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtUb1NlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1RvU2VsZWN0ZWR9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17Q3VzdG9tZXJEYXRhfSwKICAgICAgICAgICAgTWF4ICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZU1heFNpemUnKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9CiAgICAgICAgICAgICAgICA9ICcqICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRnJvbSBleHRlcm5hbAogICAgbXkgJFNob3dFcnJvcnMgPSAxOwogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2hvd0Vycm9ycyA9IDA7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0sCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17RnJvbUludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0Zyb21FcnJvclR5cGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0Zyb21TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntGcm9tRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte0Zyb21JbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIGNyZWF0ZSBhIHN0cmluZyB3aXRoIHRoZSBxdW90ZWQgZHluYW1pYyBmaWVsZCBuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkTmFtZXMpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyREeW5hbWljRmllbGROYW1lc30gKSB7CiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGROYW1lc1N0cmd9IC49ICIsJyIgLiAkRmllbGQgLiAiJyI7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNlcnZpY2Ugc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2VNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NMQU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEFNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eUlEfSA9ICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICB9CiMgLS0tCgogICAgIyBjaGVjayBpZiBleGlzdHMgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZQogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlT2JqZWN0fS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewogICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlc30gIHx8IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9LAogICAgICAgIFZhbGlkYXRlICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgQEluZGl2aWR1YWxEeW5hbWljRmllbGRzOwojIC0tLQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewogICAgICAgICAgICBwdXNoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQojIC0tLQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGN5Y2xlIHRyb3VnaCBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNob3duT3B0aW9uc0Jsb2NrOwoKICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGVkaXQgbGluawogICAgbXkgJE9wdGlvbkN1c3RvbWVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIEFjdGlvbiA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgKTsKICAgIGlmICgkT3B0aW9uQ3VzdG9tZXIpIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3B0aW9uQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgbWFrZSBzdXJlIHRvIHNob3cgdGhlIG9wdGlvbnMgYmxvY2sgc28gdGhhdCB0aGUgIkxpbmsgVGlja2V0IiBvcHRpb24gaXMgc2hvd24KICAgICMgZXZlbiBpZiBzcGVsbGNoZWNrZXIgYW5kIE9wdGlvbkN1c3RvbWVyIGlzIHR1cm5lZCBvZmYKICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgIH0KIyAtLS0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBQZXJtaXNzaW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBiZWZvcmUgaW4gUnVuKCkKICAgIGlmICggJFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgIENoYXRJRCA9PiAkUGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGF0QXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlcyA9PiBcQENoYXRNZXNzYWdlcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFBob25lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMKICAgICAgICAgICAgPSBxdyggVHlwZUlEIERlc3QgU2VydmljZUlEIFNMQUlEIE5ld1VzZXJJRCBOZXdSZXNwb25zaWJsZUlEIE5leHRTdGF0ZUlEIFByaW9yaXR5SUQKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIHNldHRpbmdzCiAgICAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpOwoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntKU09OT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkpTT04tPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpbnQiKS0+e0R5bmFtaWNGaWVsZH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKICAgIG15ICRRdWV1ZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRRdWV1ZUlEKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gfHwgISRRdWV1ZUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkQWNjZXNzOwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdGF0ZSAgICAgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgT2JqZWN0UGFyYW1ldGVycyA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBJZ25vcmVMaW5rZWRUaWNrZXRTdGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0eXBlIGxpc3QKICAgIG15ICVMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5UeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgbGluayBkYXRhCiAgICBteSAlTGlua0RhdGE7CiAgICBpZiAoICRMaW5rTGlzdFdpdGhEYXRhICYmIHJlZiAkTGlua0xpc3RXaXRoRGF0YSBlcSAnSEFTSCcgJiYgJXskTGlua0xpc3RXaXRoRGF0YX0gKSB7CiAgICAgICAgJUxpbmtEYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJ1NpbXBsZVJhdycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb250ZW50CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKIyAtLS0KICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgc2V0IGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAnLSc7CiAgICAkVGlja2V0e0ltcGFjdH0gICAgICA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICAgICAgfHwgJy0nOwojIC0tLQogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBjaGVjayBpZiBvbmx5IG9uZSBhcnRpY2xlIG5lZWQgcHJpbnRlZAogICAgaWYgKCRBcnRpY2xlSUQpIHsKCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGUtPntBcnRpY2xlSUR9ID09ICRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICBAQXJ0aWNsZUJveCA9ICgkQXJ0aWNsZSk7CiAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXNvcnQgYXJ0aWNsZSBvcmRlcgogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgQEFydGljbGVCb3ggPSByZXZlcnNlKEBBcnRpY2xlQm94KTsKICAgIH0KCiAgICAjIHNob3cgdG90YWwgYWNjb3VudGVkIHRpbWUgaWYgZmVhdHVyZSBpcyBhY3RpdmU6CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlciA9PiAkVGlja2V0e093bmVyfSwKICAgICk7CgogICAgIyByZXNwb25zaWJsZSBpbmZvCiAgICBteSAlUmVzcG9uc2libGVJbmZvOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICVSZXNwb25zaWJsZUluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gc29tZSBodG1sIHF1b3RpbmcKICAgICRUaWNrZXR7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJFRpY2tldHtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJywKICAgICk7CgogICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICRQcmludGVkQnkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgncHJpbnRlZCBieScpOwogICAgICAgIG15ICRUaW1lICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntUaW1lfTsKICAgICAgICBteSAlUGFnZTsKCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgbXkgJEhlYWRlclJpZ2h0ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSApIHsKICAgICAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ICAgPSAnJzsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICAgID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpdGxlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgInByaW50ZWQgYnkiCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ID0+ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpJwogICAgICAgICAgICAgICAgLiAnLCAnIC4gJFRpbWUsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDksCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0SW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlckRhdGEgICAgICAgID0+IFwlVXNlckluZm8sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRGF0YSA9PiBcJVJlc3BvbnNpYmxlSW5mbywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldER5bmFtaWNGaWVsZHMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgaWYgKCVMaW5rRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgTGlua0RhdGEgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgPT4gXCVMaW5rVHlwZUxpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0Q3VzdG9tZXJJbmZvcygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhcnRpY2xlcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXJ0aWNsZXMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgQXJ0aWNsZURhdGEgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICBteSAkRmlsZW5hbWUgPSAnVGlja2V0XycgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CiAgICAgICAgbXkgJFBERlN0cmluZyA9ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIGh0bWwgb3V0cHV0CiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKCiAgICAgICAgaWYgKCVMaW5rRGF0YSkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBkYXRhCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkTGlua1R5cGVMaW5rRGlyZWN0aW9uICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJUxpbmtEYXRhICkgewoKICAgICAgICAgICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICAgICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUeXBlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGVOYW1lID0+ICRMaW5rVHlwZUxpc3R7ICRMaW5rRGF0YVswXSB9LT57ICRMaW5rRGF0YVsxXSAuICdOYW1lJyB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgICAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkTGlua0RhdGF7JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayB0eXBlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUeXBlUm93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtTdHJnID0+ICRJdGVtLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIE1heCAgPT4gMTAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpY2tldAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9IVE1MTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFydGljbGVCb3ggICAgICA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRGF0YSA9PiBcJVJlc3BvbnNpYmxlSW5mbywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlVXNlckluZm8sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dFRpY2tldEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhIFVzZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVUaWNrZXQgICA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVVzZXJJbmZvID0gJXsgJFBhcmFte1VzZXJEYXRhfSB9OwogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU3RhdGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaWNrZXR7U3RhdGV9ICksCiAgICAgICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIHsKIyAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQcmlvcml0eScpLAojICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaWNrZXR7UHJpb3JpdHl9ICksCiMgICAgICAgIH0sCiMgLS0tCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUXVldWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtRdWV1ZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMb2NrJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e0xvY2t9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lcklEJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPd25lcicpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e093bmVyfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFVzZXJJbmZve1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHJlc3BvbnNpYmxlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlID0gJy0nOwogICAgICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgICRSZXNwb25zaWJsZQogICAgICAgICAgICAgICAgPSAkVGlja2V0e1Jlc3BvbnNpYmxlfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJMYXN0bmFtZX0gLiAnKSc7CiAgICAgICAgfQogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXNwb25zaWJsZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzcG9uc2libGUsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIGFuZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgIG15ICRSb3dTZXJ2aWNlID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NlcnZpY2UnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U2VydmljZSApOwogICAgICAgIG15ICRSb3dTTEEgPSB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU0xBJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U0xBfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U0xBICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgJFRhYmxlTGVmdEV4dGVuZGVkID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcml0aWNhbGl0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e0NyaXRpY2FsaXR5fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW1wYWN0JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7SW1wYWN0fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJpb3JpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtQcmlvcml0eX0pLAogICAgICAgIH0sCiAgICBdOwogICAgcHVzaCBAeyRUYWJsZUxlZnR9LCBAeyRUYWJsZUxlZnRFeHRlbmRlZH07CiMgLS0tCgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FnZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFRpY2tldHtBZ2V9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7Q3JlYXRlZH0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQWNjb3VudGVkIHRpbWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9LAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICAjIG9ubHkgc2hvdyBwZW5kaW5nIHVudGlsIHVubGVzcyBpdCBpcyByZWFsbHkgcGVuZGluZwogICAgaWYgKCAkVGlja2V0e1BlbmRpbmdVbnRpbH0gKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BlbmRpbmcgdGlsbCcpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1BlbmRpbmdVbnRpbH0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIGZpcnN0IHJlc3BvbnNlIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgICAgICAgICAnTm9TZWNvbmRzJywKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdXBkYXRlIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7VXBkYXRlVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVXBkYXRlIFRpbWUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzb2x1dGlvbiB0aW1lIHJvdwogICAgaWYgKCBkZWZpbmVkKCAkVGlja2V0e1NvbHV0aW9uVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU29sdXRpb24gVGltZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgICAgICAgICAnTm9TZWNvbmRzJywKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA3MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE1Ni41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gMTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDcwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTU2LjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIExpbmtEYXRhIExpbmtUeXBlTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJE5lZWRlZCEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJExpbmtUeXBlTmFtZSk7CgogICAgICAgICMgZGVmaW5lIGhlYWRsaW5lCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExpbmtUeXBlTmFtZSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJyc7CgogICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFBhcmFte0xpbmtEYXRhfS0+eyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSB8fD0gJyc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkSXRlbS0+e1RpdGxlfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZSB7CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMaW5rZWQgT2JqZWN0cycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRUaWNrZXREeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHRhYmxlCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICRWYWx1ZSBlcSAiIjsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgJFJvdysrOwogICAgICAgICRPdXRwdXQgPSAxOwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGlja2V0IER5bmFtaWMgRmllbGRzJyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBDdXN0b21lckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lciBJbmZvcm1hdGlvbicpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEFydGljbGVEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRBcnRpY2xlQ291bnRlciA9IDE7CiAgICBmb3IgbXkgJEFydGljbGVUbXAgKCBAeyAkUGFyYW17QXJ0aWNsZURhdGF9IH0gKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUNvdW50ZXIgPT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXJ0aWNsZXMnKSwKICAgICAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgbXkgJEF0dGFjaG1lbnRzOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEF0dGFjaG1lbnRzIC49ICRGaWxle0ZpbGVuYW1lfSAuICcgKCcgLiAkRmlsZXtGaWxlc2l6ZX0gLiAiKVxuIjsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0b3RhbCBhY2NvdW50ZWQgdGltZSBpZiBmZWF0dXJlIGlzIGFjdGl2ZToKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkQXJ0aWNsZXsnQWNjb3VudGVkIHRpbWUnfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXJ0aWNsZSBpbmZvIHRhYmxlCiAgICAgICAgbXkgJVRhYmxlUGFyYW0xOwogICAgICAgIG15ICRSb3cgPSAwOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIGFydGljbGUgbnVtYmVyIHRhZwogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJyAgICAjICcgLiAkQXJ0aWNsZUNvdW50ZXIsCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJ0Zyb20nLCAnVG8nLCAnQ2MnLCAnQWNjb3VudGVkIHRpbWUnLCAnU3ViamVjdCcsICkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRQYXJhbWV0ZXJ9ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFBhcmFtZXRlcikgLiAnOic7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xleyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCcpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgJEFydGljbGV7Q3JlYXRlZH0sCiAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdieScpOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBcnRpY2xle1NlbmRlclR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgdGFibGUKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApCiAgICAgICAgICAgICAgICAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CiAgICAgICAgICAgICRSb3crKzsKICAgICAgICB9CgogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVHlwZScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gKTsKICAgICAgICAkUm93Kys7CgogICAgICAgIGlmICgkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXR0YWNobWVudCcpIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICBjaG9tcCgkQXR0YWNobWVudHMpOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEF0dGFjaG1lbnRzOwogICAgICAgIH0KICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgaW5mb3MpCiAgICAgICAgJFRhYmxlUGFyYW0xe1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTF7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFtMXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBpbmZvcykKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgfHwgJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJyApCiAgICAgICAgewogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57SlNPTk9iamVjdH0tPkRlY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gJEFydGljbGV7Qm9keX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJExpbmVzOwogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEFydGljbGV7Qm9keX0gKSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRBcnRpY2xle0JvZHl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGluZS0+e1N5c3RlbUdlbmVyYXRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5lcyAuPSAnWycgLiAkTGluZS0+e0NyZWF0ZVRpbWV9IC4gJ10gJyAuICRMaW5lLT57TWVzc2FnZVRleHR9IC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJ1snCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMaW5lLT57Q3JlYXRlVGltZX0gLiAnXSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMaW5lLT57Q2hhdHRlck5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMaW5lLT57TWVzc2FnZVRleHR9IC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBib2R5KQogICAgICAgIG15ICVUYWJsZVBhcmFtMjsKICAgICAgICAkVGFibGVQYXJhbTJ7Q2VsbERhdGF9WzBdWzBde0NvbnRlbnR9ID0gJEFydGljbGV7Qm9keX0gfHwgJyAnOwogICAgICAgICRUYWJsZVBhcmFtMntUeXBlfSAgICAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTJ7Qm9yZGVyfSAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udH0gICAgICAgICAgICAgICAgICAgID0gJ01vbm9zcGFjZWQnOwogICAgICAgICRUYWJsZVBhcmFtMntGb250U2l6ZX0gICAgICAgICAgICAgICAgPSA3OwogICAgICAgICRUYWJsZVBhcmFtMntCYWNrZ3JvdW5kQ29sb3J9ICAgICAgICAgPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmd9ICAgICAgICAgICAgICAgICA9IDQ7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdUb3B9ICAgICAgICAgICAgICA9IDg7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdCb3R0b219ICAgICAgICAgICA9IDg7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGJvZHkpCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbTIgPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbTIsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTJ7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZUNvdW50ZXIrKzsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxNYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgcmVzcG9uc2libGUsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgIG15ICRSZXNwb25zaWJsZSA9ICctJzsKICAgICAgICBpZiAoICRQYXJhbXtSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgICRSZXNwb25zaWJsZQogICAgICAgICAgICAgICAgPSAkUGFyYW17UmVzcG9uc2libGV9IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckxhc3RuYW1lfSAuICcpJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IHsgUmVzcG9uc2libGVTdHJpbmcgPT4gJFJlc3BvbnNpYmxlLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdHlwZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZpY2UgYW5kIHNsYSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgICAgICAgICBTTEEgICAgID0+ICRQYXJhbXtTTEF9ICAgICB8fCAnLScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBhY2NvdW50ZWQgdGltZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY2NvdW50ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHBlbmRpbmcgZGF0ZQogICAgaWYgKCAkUGFyYW17UGVuZGluZ1VudGlsfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQZW5kaW5nVW50aWwnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgZmlyc3QgcmVzcG9uc2UgdGltZQogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdXBkYXRlIHRpbWUKICAgIGlmICggZGVmaW5lZCggJFBhcmFte1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzb2x1dGlvbiB0aW1lCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtTb2x1dGlvblRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSBAQXJ0aWNsZUJveCA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfSA9ICcnOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWxle0ZpbGVuYW1lfSApOwogICAgICAgICAgICBteSAkRG93bmxvYWRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkRvd25sb2FkIik7CiAgICAgICAgICAgICRQYXJhbXsnQXJ0aWNsZTo6QVRNJ30KICAgICAgICAgICAgICAgIC49ICc8YSBocmVmPSInIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9IC4gJ0FjdGlvbj1BZ2VudFRpY2tldEF0dGFjaG1lbnQ7JwogICAgICAgICAgICAgICAgLiAiQXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH07RmlsZUlEPSRGaWxlSURcIiB0YXJnZXQ9XCJhdHRhY2htZW50XCIgIgogICAgICAgICAgICAgICAgLiAidGl0bGU9XCIkRG93bmxvYWRUZXh0OiAkRmlsZXtGaWxlbmFtZX1cIj4iCiAgICAgICAgICAgICAgICAuICIkRmlsZXtGaWxlbmFtZX08L2E+ICRGaWxle0ZpbGVzaXplfTxici8+IjsKICAgICAgICB9CgogICAgICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWV4dGVybmFsJyB8fCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtaW50ZXJuYWwnICkKICAgICAgICB7CiAgICAgICAgICAgICRBcnRpY2xle0NoYXRNZXNzYWdlc30gPSAkU2VsZi0+e0pTT05PYmplY3R9LT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZXtJc0NoYXR9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3QgYSBvbmx5IGh0bWwgZW1haWwKICAgICAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICAgICAgICAgJFBhcmFte1RleHROb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSAgID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIE5ld0xpbmUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpLAogICAgICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgVk1heCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRQYXJhbWV0ZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUGFyYW1ldGVyLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskUGFyYW1ldGVyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFjY291bnRlZCBhcnRpY2xlIHRpbWUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21UaW1lRGlzcGxheScpICkgewogICAgICAgICAgICBteSAkQXJ0aWNsZVRpbWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJSb3ciLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAgICAgIyAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAjICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgIyAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzM2MDhiNjA2MjU5YWNlNjFmZWRiYjgyZjk0MjczZDZhYmVmYzY5NzIvS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgUE9TSVggcXcvY2VpbC87CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBTZXNzaW9uT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAjIGdldCBwYXJhbXMKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwogICAgJFNlbGYtPntBcnRpY2xlUGFnZX0gICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlUGFnZScgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZCcgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZFNvcnQnICk7CgogICAgIyBQbGVhc2Ugbm90ZTogWm9vbVRpbWVsaW5lIGlzIGFuIE9UUlNCdXNpbmVzcyBmZWF0dXJlCiAgICAkU2VsZi0+e1pvb21UaW1lbGluZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tVGltZWxpbmUnICk7CiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hyb25pY2FsVmlld0VuYWJsZWQnKSApIHsKICAgICAgICAkU2VsZi0+e1pvb21UaW1lbGluZX0gPSAwOwogICAgfQoKICAgICMgc2F2ZSBsYXN0IHVzZWQgdmlldyB0eXBlIGluIHByZWZlcmVuY2VzCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSB8fCBkZWZpbmVkICRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKCiAgICAgICAgbXkgJExhc3RVc2VkWm9vbVZpZXdUeXBlID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICRTZWxmLT57Wm9vbUV4cGFuZH0gPT0gMSApIHsKICAgICAgICAgICAgJExhc3RVc2VkWm9vbVZpZXdUeXBlID0gJ0V4cGFuZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntab29tVGltZWxpbmV9ICYmICRTZWxmLT57Wm9vbVRpbWVsaW5lfSA9PSAxICkgewogICAgICAgICAgICAkTGFzdFVzZWRab29tVmlld1R5cGUgPSAnVGltZWxpbmUnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFzdFVzZWRab29tVmlld1R5cGUnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJExhc3RVc2VkWm9vbVZpZXdUeXBlLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfQogICAgICAgICAgICAmJiAkVXNlclByZWZlcmVuY2Vze1VzZXJMYXN0VXNlZFpvb21WaWV3VHlwZX0gZXEgJ0V4cGFuZCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmQnKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKAogICAgICAgICFkZWZpbmVkICRTZWxmLT57Wm9vbVRpbWVsaW5lfQogICAgICAgICYmICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfQogICAgICAgICYmICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfSBlcSAnVGltZWxpbmUnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57Wm9vbVRpbWVsaW5lfSA9IDE7CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSApIHsKICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpOwogICAgfQoKICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaWNrZXRBcnRpY2xlRmlsdGVyJyk7CgogICAgIyBkZWZpbmUgaWYgcmljaCB0ZXh0IHNob3VsZCBiZSB1c2VkCiAgICAkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21SaWNoVGV4dEZvcmNlJykKICAgICAgICB8fCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgfHwgMDsKCiAgICAjIHN0cmlwIGh0bWwgYW5kIGFzY2lpIGF0dGFjaG1lbnRzIG9mIGNvbnRlbnQKICAgICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9ID0gMTsKCiAgICAjIGNoZWNrIGlmIHJpY2ggdGV4dCBpcyBlbmFibGVkLCBpZiBub3Qgb25seSBzdHJpcCBhc2NpaSBhdHRhY2htZW50cwogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFNlbGYtPntTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudH0gPSAyOwogICAgfQoKICAgICMgdGlja2V0IGlkIGxvb2t1cAogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0TnVtYmVyJyApICkgewogICAgICAgICRTZWxmLT57VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0pTT05PYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SlNPTi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9ID0gewogICAgICAgICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFpvb20iKS0+e0R5bmFtaWNGaWVsZH0gfHwge30gfSwKICAgICAgICAlewogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIikKICAgICAgICAgICAgICAgIC0+e1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGR9CiAgICAgICAgICAgICAgICB8fCB7fQogICAgICAgIH0sCiAgICB9OwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cyBmb3IgcHJvY2VzcyBtYW5hZ2VtZW50CiAgICAkU2VsZi0+e0FjdGl2aXR5T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHktPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntBY3Rpdml0eURpYWxvZ09iamVjdH0KICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2ctPm5ldyglUGFyYW0pOwoKICAgICRTZWxmLT57VHJhbnNpdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb24tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUcmFuc2l0aW9uQWN0aW9uT2JqZWN0fQogICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uLT5uZXcoJVBhcmFtKTsKCiAgICAkU2VsZi0+e1Byb2Nlc3NPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGl2aXR5T2JqZWN0ICAgICAgICAgPT4gJFNlbGYtPntBY3Rpdml0eU9iamVjdH0sCiAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkU2VsZi0+e0FjdGl2aXR5RGlhbG9nT2JqZWN0fSwKICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRTZWxmLT57VHJhbnNpdGlvbk9iamVjdH0sCiAgICAgICAgVHJhbnNpdGlvbkFjdGlvbk9iamVjdCA9PiAkU2VsZi0+e1RyYW5zaXRpb25BY3Rpb25PYmplY3R9LAogICAgKTsKCiAgICAjIGdldCB6b29tIHNldHRpbmdzIGRlcGVuZGluZyBvbiB0aWNrZXQgdHlwZQogICAgJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpOwoKICAgICMgdGhpcyBpcyBhIG1hcHBpbmcgb2YgaGlzdG9yeSB0eXBlcyB3aGljaCBpcyBiZWluZyB1c2VkCiAgICAjIGZvciB0aGUgY2hyb25pY2FsIHZpZXcgYW5kIGl0cyBldmVudCB0eXBlIGZpbHRlcgogICAgJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9ID0gewogICAgICAgIE5ld1RpY2tldCAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpY2tldCBDcmVhdGVkJywKICAgICAgICBBZGROb3RlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RlIEFkZGVkJywKICAgICAgICBBZGROb3RlQ3VzdG9tZXIgICAgICAgICAgICAgICAgID0+ICdOb3RlIEFkZGVkIChDdXN0b21lciknLAogICAgICAgIEVtYWlsQWdlbnQgICAgICAgICAgICAgICAgICAgICAgPT4gJ091dGdvaW5nIEVtYWlsJywKICAgICAgICBFbWFpbEN1c3RvbWVyICAgICAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBDdXN0b21lciBFbWFpbCcsCiAgICAgICAgVGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlICAgICAgICA9PiAnRHluYW1pYyBGaWVsZCBVcGRhdGVkJywKICAgICAgICBQaG9uZUNhbGxBZ2VudCAgICAgICAgICAgICAgICAgID0+ICdPdXRnb2luZyBQaG9uZSBDYWxsJywKICAgICAgICBQaG9uZUNhbGxDdXN0b21lciAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBQaG9uZSBDYWxsJywKICAgICAgICBTZW5kQW5zd2VyICAgICAgICAgICAgICAgICAgICAgID0+ICdPdXRnb2luZyBBbnN3ZXInLAogICAgICAgIFJlc3BvbnNpYmxlVXBkYXRlICAgICAgICAgICAgICAgPT4gJ05ldyBSZXNwb25zaWJsZScsCiAgICAgICAgT3duZXJVcGRhdGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3IE93bmVyJywKICAgICAgICBTTEFVcGRhdGUgICAgICAgICAgICAgICAgICAgICAgID0+ICdTTEEgVXBkYXRlZCcsCiAgICAgICAgU2VydmljZVVwZGF0ZSAgICAgICAgICAgICAgICAgICA9PiAnU2VydmljZSBVcGRhdGVkJywKICAgICAgICBDdXN0b21lclVwZGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b21lciBVcGRhdGVkJywKICAgICAgICBTdGF0ZVVwZGF0ZSAgICAgICAgICAgICAgICAgICAgID0+ICdTdGF0ZSBVcGRhdGVkJywKICAgICAgICBGb2xsb3dVcCAgICAgICAgICAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBGb2xsb3ctVXAnLAogICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lU3RvcCAgICAgICAgPT4gJ0VzY2FsYXRpb24gVXBkYXRlIFRpbWUgU3RvcHBlZCcsCiAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0b3AgICAgICA9PiAnRXNjYWxhdGlvbiBTb2x1dGlvbiBUaW1lIFN0b3BwZWQnLAogICAgICAgIEVzY2FsYXRpb25GaXJzdFJlc3BvbnNlVGltZVN0b3AgPT4gJ0VzY2FsYXRpb24gRmlyc3QgUmVzcG9uc2UgVGltZSBTdG9wcGVkJywKICAgICAgICBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lU3RvcCAgICAgID0+ICdFc2NhbGF0aW9uIFJlc3BvbnNlIFRpbWUgU3RvcHBlZCcsCiAgICAgICAgVGlja2V0TGlua0FkZCAgICAgICAgICAgICAgICAgICA9PiAnTGluayBBZGRlZCcsCiAgICAgICAgVGlja2V0TGlua0RlbGV0ZSAgICAgICAgICAgICAgICA9PiAnTGluayBEZWxldGVkJywKICAgICAgICBNZXJnZWQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgTWVyZ2VkJywKICAgICAgICBTZXRQZW5kaW5nVGltZSAgICAgICAgICAgICAgICAgID0+ICdQZW5kaW5nIFRpbWUgU2V0JywKICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgTG9ja2VkJywKICAgICAgICBVbmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgVW5sb2NrZWQnLAogICAgICAgIE1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1F1ZXVlIFVwZGF0ZWQnLAogICAgICAgIFByaW9yaXR5VXBkYXRlICAgICAgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5IFVwZGF0ZWQnLAogICAgICAgIFRpdGxlVXBkYXRlICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpdGxlIFVwZGF0ZWQnLAogICAgICAgIFR5cGVVcGRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ1R5cGUgVXBkYXRlZCcsCiAgICAgICAgV2ViUmVxdWVzdEN1c3RvbWVyICAgICAgICAgICAgICA9PiAnSW5jb21pbmcgV2ViIFJlcXVlc3QnLAogICAgICAgIFNlbmRBdXRvRm9sbG93VXAgICAgICAgICAgICAgICAgPT4gJ0F1dG9tYXRpYyBGb2xsb3ctVXAgU2VudCcsCiAgICAgICAgU2VuZEF1dG9SZXBseSAgICAgICAgICAgICAgICAgICA9PiAnQXV0b21hdGljIFJlcGx5IFNlbnQnLAogICAgICAgIFRpbWVBY2NvdW50aW5nICAgICAgICAgICAgICAgICAgPT4gJ1RpbWUgQWNjb3VudGVkJywKICAgICAgICBDaGF0RXh0ZXJuYWwgICAgICAgICAgICAgICAgICAgID0+ICdFeHRlcm5hbCBDaGF0JywKICAgICAgICBDaGF0SW50ZXJuYWwgICAgICAgICAgICAgICAgICAgID0+ICdJbnRlcm5hbCBDaGF0JywKICAgIH07CgogICAgIyBBZGQgY3VzdG9tIGZpbGVzIHRvIHRoZSB6b29tJ3MgZnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBvbiB0aGUgZmx5CiAgICAjICAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1vZHVsZXMuCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hyb25pY2FsVmlld0VuYWJsZWQnKQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaHJvbmljYWxWaWV3RW5hYmxlZCcpID09IDEKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFpvb21Gcm9udGVuZENvbmZpZ3VyYXRpb24KICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRab29tfTsKICAgICAgICBteSBAQ3VzdG9tSlNGaWxlcyA9ICgKICAgICAgICAgICAgJ0NvcmUuQWdlbnQuVGlja2V0Wm9vbS5DaHJvbmljYWxWaWV3LmpzJywKICAgICAgICApOwogICAgICAgIHB1c2goIEB7ICRab29tRnJvbnRlbmRDb25maWd1cmF0aW9uLT57TG9hZGVyfS0+e0phdmFTY3JpcHR9IHx8IFtdIH0sIEBDdXN0b21KU0ZpbGVzICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIG15ICRUcmFuc2xhdGFibGVNZXNzYWdlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICJXZSBhcmUgc29ycnksIHlvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9ucyBhbnltb3JlIHRvIGFjY2VzcyB0aGlzIHRpY2tldCBpbiBpdHMgY3VycmVudCBzdGF0ZS4gIgogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAkVHJhbnNsYXRhYmxlTWVzc2FnZSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBhdHRyaWJ1dGVzCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBnZXQgYWxsIHJlZ2lzdGVyZWQgQWN0aW9ucwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSB9OwoKICAgICAgICAjIG9ubHkgdXNlIHRob3NlIEFjdGlvbnMgdGhhdCBzdGF0cyB3aXRoIEFnZW50CiAgICAgICAgJVBvc3NpYmxlQWN0aW9ucwogICAgICAgICAgICA9IG1hcCB7ICsrJENvdW50ZXIgPT4gJF8gfQogICAgICAgICAgICBncmVwIHsgc3Vic3RyKCAkXywgMCwgbGVuZ3RoICdBZ2VudCcgKSBlcSAnQWdlbnQnIH0KICAgICAgICAgICAgc29ydCBrZXlzICVBY3Rpb25zOwogICAgfQoKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIG1hcmsgc2hvd24gdGlja2V0IGFzIHNlZW4KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUaWNrZXRNYXJrQXNTZWVuJyApIHsKICAgICAgICBteSAkU3VjY2VzcyA9IDE7CgogICAgICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRJdGVtU2VlbiggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTWFya0FzSW1wb3J0YW50JyApIHsKCiAgICAgICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e1VzZXJJRH0gPT0gJFRpY2tldHtPd25lcklEfQogICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1VzZXJJRH0gPT0gJFRpY2tldHtSZXNwb25zaWJsZUlEfQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICAgICAgbXkgJUFydGljbGVGbGFnID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlSXNJbXBvcnRhbnQgPSAkQXJ0aWNsZUZsYWd7SW1wb3J0YW50fTsKICAgICAgICAgICAgaWYgKCRBcnRpY2xlSXNJbXBvcnRhbnQpIHsKCiAgICAgICAgICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0ltcG9ydGFudCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgQWx3YXlzIHVzZSB1c2VyIGlkIDEgYmVjYXVzZSBvdGhlciB1c2VycyBhbHNvIGhhdmUgdG8gc2VlIHRoZSBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ1NldCgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnSW1wb3J0YW50JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JFNlbGYtPntBcnRpY2xlSUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdNYXJrQXNTZWVuJyApIHsKICAgICAgICBteSAkU3VjY2VzcyA9IDE7CgogICAgICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9BcnRpY2xlSXRlbVNlZW4oIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgdXBkYXRlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXJ0aWNsZVVwZGF0ZScgKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ291bnQnICk7CiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtDb3VudH0gPSAkQ291bnQ7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgaW5kZXggKHdpdGhvdXQgYXR0YWNobWVudHMpCiAgICAgICAgbXkgJUF0bUluZGV4ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+ICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9LAogICAgICAgICAgICBBcnRpY2xlICAgICAgICAgICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0F0bXN9ID0gXCVBdG1JbmRleDsKCiAgICAgICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgIFZhbGlkICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0FydGljbGVJdGVtKAogICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICBBY2xBY3Rpb24gICAgICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXMgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0sCiAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tGb3J3YXJkfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ09uTG9hZCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJENvbnRlbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGdldCBmb3IgQXJ0aWNsZUlEICRTZWxmLT57QXJ0aWNsZUlEfSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHdyaXRlIGFydGljbGUgZmlsdGVyIHNldHRpbmdzIHRvIHNlc3Npb24KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcnRpY2xlRmlsdGVyU2V0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgICAgIG15ICRTYXZlRGVmYXVsdHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTYXZlRGVmYXVsdHMnICk7CiAgICAgICAgbXkgQEFydGljbGVUeXBlRmlsdGVySURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnQXJ0aWNsZVR5cGVGaWx0ZXInICk7CiAgICAgICAgbXkgQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzCiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInICk7CgogICAgICAgICMgYnVpbGQgc2Vzc2lvbiBzdHJpbmcKICAgICAgICBteSAkU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIGlmIChAQXJ0aWNsZVR5cGVGaWx0ZXJJRHMpIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJ0FydGljbGVUeXBlRmlsdGVyPCc7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49IGpvaW4gJywnLCBAQXJ0aWNsZVR5cGVGaWx0ZXJJRHM7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICc+JzsKICAgICAgICB9CiAgICAgICAgaWYgKEBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSB0aGUgc2Vzc2lvbgoKICAgICAgICAjIHNhdmUgZGVmYXVsdCBmaWx0ZXIgc2V0dGluZ3MgdG8gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICgkU2F2ZURlZmF1bHRzKSB7CiAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnQXJ0aWNsZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBcnRpY2xlRmlsdGVyRGVmYXVsdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGZpbHRlciBleHBsaWNpdGx5IGZvciB0aGlzIHRpY2tldAogICAgICAgIGlmICggJFNlc3Npb25TdHJpbmcgZXEgJycgKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nID0gJ29mZic7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc2Vzc2lvbgogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAiQXJ0aWNsZUZpbHRlciRUaWNrZXRJRCIsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT04gPSAnJzsKICAgICAgICBpZiAoJFVwZGF0ZSkgewogICAgICAgICAgICAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0FydGljbGUgZmlsdGVyIHNldHRpbmdzIHdlcmUgc2F2ZWQuJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyB3cml0ZSBhcnRpY2xlIGZpbHRlciBzZXR0aW5ncyB0byBzZXNzaW9uCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXZlblR5cGVGaWx0ZXJTZXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICAgICAgbXkgJFNhdmVEZWZhdWx0cyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVEZWZhdWx0cycgKTsKICAgICAgICBteSBARXZlbnRUeXBlRmlsdGVySURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnRXZlbnRUeXBlRmlsdGVyJyApOwoKICAgICAgICAjIGJ1aWxkIHNlc3Npb24gc3RyaW5nCiAgICAgICAgbXkgJFNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICBpZiAoQEV2ZW50VHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnRXZlbnRUeXBlRmlsdGVyPCc7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49IGpvaW4gJywnLCBARXZlbnRUeXBlRmlsdGVySURzOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnPic7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIHRoZSBzZXNzaW9uCgogICAgICAgICMgc2F2ZSBkZWZhdWx0IGZpbHRlciBzZXR0aW5ncyB0byB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCRTYXZlRGVmYXVsdHMpIHsKICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdFdmVudFR5cGVGaWx0ZXJEZWZhdWx0JywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnRXZlbnRUeXBlRmlsdGVyRGVmYXVsdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGZpbHRlciBleHBsaWNpdGx5IGZvciB0aGlzIHRpY2tldAogICAgICAgIGlmICggJFNlc3Npb25TdHJpbmcgZXEgJycgKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nID0gJ29mZic7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc2Vzc2lvbgogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAiRXZlbnRUeXBlRmlsdGVyJFRpY2tldElEIiwKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICcnOwogICAgICAgIGlmICgkVXBkYXRlKSB7CiAgICAgICAgICAgICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXZlbnQgdHlwZSBmaWx0ZXIgc2V0dGluZ3Mgd2VyZSBzYXZlZC4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgZnJvbSBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57ICdBcnRpY2xlRmlsdGVyJyAuICRTZWxmLT57VGlja2V0SUR9IH07CgogICAgICAgICMgc2V0IGFydGljbGUgZmlsdGVyIGZvciB0aGlzIHRpY2tldCBmcm9tIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICEkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57QXJ0aWNsZUZpbHRlckRlZmF1bHR9OwogICAgICAgIH0KCiAgICAgICAgIyBkbyBub3QgdXNlIGRlZmF1bHRzIGZvciB0aGlzIHRpY2tldCBpZiBmaWx0ZXIgd2FzIGV4cGxpY2l0bHkgdHVybmVkIG9mZgogICAgICAgIGVsc2lmICggJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nIGVxICdvZmYnICkgewogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0gPSBcQElEczsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlU2VuZGVyVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVNlbmRlclR5cGVJRH0gPSBcQElEczsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGV2ZW50IHR5cGUgZmlsdGVyIHNldHRpbmdzIGZyb20gc2Vzc2lvbiBzdHJpbmcKICAgICAgICBteSAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57ICdFdmVudFR5cGVGaWx0ZXInIC4gJFNlbGYtPntUaWNrZXRJRH0gfTsKCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmaWx0ZXIgZm9yIHRoaXMgdGlja2V0IGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRFdmVudFR5cGVGaWx0ZXJTZXNzaW9uU3RyaW5nICkgewogICAgICAgICAgICAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGVmYXVsdHMgZm9yIHRoaXMgdGlja2V0IGlmIGZpbHRlciB3YXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmCiAgICAgICAgZWxzaWYgKCAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyBlcSAnb2ZmJyApIHsKICAgICAgICAgICAgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcKICAgICAgICAgICAgJiYgJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcgPX4gbXsgRXZlbnRUeXBlRmlsdGVyIDwgKCBbXjw+XSsgKSA+IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC8sLywgJDE7CiAgICAgICAgICAgICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfS0+e0V2ZW50VHlwZUlEfSA9IFxASURzLAogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBpZiBIVE1MIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIEFydGljbGVJRAogICAgICAgIGlmICggISRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ05lZWQgQXJ0aWNsZUlEIScgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFydGljbGUgZGF0YQogICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBkYXRhIGV4aXN0cwogICAgICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnSW52YWxpZCBBcnRpY2xlSUQhJyApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBhIGh0bWwgZW1haWwsIHJldHVybiBoZXJlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SG9vaycpCiAgICAgICAgICAgICAgICAuICItJEFydGljbGV7VGlja2V0TnVtYmVyfS0kQXJ0aWNsZXtUaWNrZXRJRH0tJEFydGljbGV7QXJ0aWNsZUlEfSIsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiJEFydGljbGV7TWltZVR5cGV9OyBjaGFyc2V0PSRBcnRpY2xle0NoYXJzZXR9IiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5NYXNrQWdlbnRab29tKCBUaWNrZXQgPT4gXCVUaWNrZXQsIEFjbEFjdGlvbiA9PiBcJUFjbEFjdGlvbiApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBNYXNrQWdlbnRab29tIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlQWNsQWN0aW9uID0gJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKCiAgICAjIGVsc2Ugc2hvdyBub3JtYWwgdGlja2V0IHpvb20gdmlldwogICAgIyBmZXRjaCBhbGwgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICk7CgogICAgIyBvd25lciBpbmZvCiAgICBteSAlT3duZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRUaWNrZXR7T3duZXJJRH0sCiAgICApOwoKICAgICMgcmVzcG9uc2libGUgaW5mbwogICAgbXkgJVJlc3BvbnNpYmxlSW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9IHx8IDEsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgc2hvd24gYXJ0aWNsZXMKCiAgICBteSAkTGltaXQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWF4QXJ0aWNsZXNQZXJQYWdlJyk7CgogICAgbXkgJE9yZGVyID0gJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnID8gJ0RFU0MnIDogJ0FTQyc7CiAgICBteSAkUGFnZTsKCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAkUGFnZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVBhZ2UoCiAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJvd3NQZXJQYWdlID0+ICRMaW1pdCwKICAgICAgICAgICAgT3JkZXIgICAgICAgPT4gJE9yZGVyLAogICAgICAgICAgICAleyAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntBcnRpY2xlUGFnZX0gKSB7CiAgICAgICAgJFBhZ2UgPSAkU2VsZi0+e0FydGljbGVQYWdlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYWdlID0gMTsKICAgIH0KCiAgICAjIFdlIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBwYWdpbmF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeS4KICAgICMgVGhlIGVhc2llc3Qgd2F5IHdvdWxkIGJlIGNvdW50IHRoZSBhcnRpY2xlcywgYnV0IHRoYXQgd291bGQgc2xvdwogICAgIyBkb3duIHRoZSBtb3N0IGNvbW1vbiBjYXNlIChmZXdlciBhcnRpY2xlcyB0aGFuICRMaW1pdCBpbiB0aGUgdGlja2V0KS4KICAgICMgU28gaW5zdGVhZCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljazoKICAgICMgMSkgaWYgdGhlICRQYWdlID4gMSwgd2UgbmVlZCBwYWdpbmF0aW9uCiAgICAjIDIpIGlmIG5vdCwgcmVxdWVzdCAkTGltaXQgKyAxIGFydGljbGVzLiBJZiAkTGltaXQgKyAxIGFyZSBhY3R1YWxseQogICAgIyAgICByZXR1cm5lZCwgcGFnaW5hdGlvbiBpcyBuZWNlc3NhcnkKICAgIG15ICRFeHRyYSA9ICRQYWdlID4gMSA/IDAgOiAxOwogICAgbXkgJE5lZWRQYWdpbmF0aW9uOwogICAgbXkgJEFydGljbGVDb3VudDsKCiAgICBteSBAQXJ0aWNsZUNvbnRlbnRBcmdzID0gKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+ICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICA9PiAkTGltaXQgKyAkRXh0cmEsCiAgICAgICAgT3JkZXIgICAgICAgICAgICAgICAgICAgICAgPT4gJE9yZGVyLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwgICAgIyBmZXRjaCBsYXRlciBvbmx5IGZvciB0aGUgYXJ0aWNsZShzKSB0byBkaXNwbGF5CiAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LCAgICAjIGxpbWl0IGJ5IEFydGljbGVTZW5kZXJUeXBlSUQvQXJ0aWNsZVR5cGVJRAoKICAgICk7CgogICAgIyBnZXQgY29udGVudAogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgQEFydGljbGVDb250ZW50QXJncywKICAgICAgICBQYWdlID0+ICRQYWdlLAogICAgKTsKCiAgICBpZiAoICFAQXJ0aWNsZUJveCAmJiAkUGFnZSA+IDEgKSB7CgogICAgICAgICMgaWYgdGhlIHBhZ2UgYXJndW1lbnQgaXMgcGFzdCB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcywKICAgICAgICAjIGFzc3VtZSBwYWdlIDEgaW5zdGVhZC4KICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgbmV3IGFydGljbGUgZmlsdGVyIHdhcyBhZGRlZC4KICAgICAgICAkUGFnZSAgICAgICA9IDE7CiAgICAgICAgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgICAgIEBBcnRpY2xlQ29udGVudEFyZ3MsCiAgICAgICAgICAgIFBhZ2UgPT4gJFBhZ2UsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZUNvdW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ291bnQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAleyAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgICAgICAkTmVlZFBhZ2luYXRpb24gPSAkQXJ0aWNsZUNvdW50ID4gJExpbWl0OwogICAgfQogICAgZWxzaWYgKCBAQXJ0aWNsZUJveCA+ICRMaW1pdCApIHsKICAgICAgICBwb3AgQEFydGljbGVCb3g7CiAgICAgICAgJE5lZWRQYWdpbmF0aW9uID0gMTsKICAgICAgICAkQXJ0aWNsZUNvdW50ICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb3VudCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gLy8ge30gfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFnZSA9PSAxICkgewogICAgICAgICRBcnRpY2xlQ291bnQgICA9IEBBcnRpY2xlQm94OwogICAgICAgICROZWVkUGFnaW5hdGlvbiA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTmVlZFBhZ2luYXRpb24gPSAxOwogICAgICAgICRBcnRpY2xlQ291bnQgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNvdW50KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICB9CgogICAgJFBhZ2UgfHw9IDE7CgogICAgbXkgJFBhZ2VzOwogICAgaWYgKCROZWVkUGFnaW5hdGlvbikgewogICAgICAgICRQYWdlcyA9IGNlaWwoICRBcnRpY2xlQ291bnQgLyAkTGltaXQgKTsKICAgIH0KCiAgICAjIGFkZCBjb3VudGVyCiAgICBteSAkQ291bnQgPSAoICRQYWdlIC0gMSApICogJExpbWl0OwoKICAgICMgaW4gY2FzZSBvZiByZXZlcnNlIHNvcnRpbmcsIGNvdW50IHRvcC1kb3duCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpIGVxICdyZXZlcnNlJyApIHsKICAgICAgICAkQ291bnQgPSAkQXJ0aWNsZUNvdW50IC0gKCAoICRQYWdlIC0gMSApICogJExpbWl0ICkgKyAxOwogICAgfQoKICAgIG15ICRBcnRpY2xlSURGb3VuZCA9IDA7CiAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmRTb3J0JykgZXEgJ3JldmVyc2UnICkgewogICAgICAgICAgICAkQ291bnQtLTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgJEFydGljbGUtPntDb3VudH0gPSAkQ291bnQ7CiAgICAgICAgaWYgKCAkU2VsZi0+e0FydGljbGVJRH0gJiYgJFNlbGYtPntBcnRpY2xlSUR9ID09ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVJREZvdW5kID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUFydGljbGVGbGFncyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdzT2ZUaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIG15ICRBcnRpY2xlSUQ7CiAgICBpZiAoJEFydGljbGVJREZvdW5kKSB7CiAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57QXJ0aWNsZUlEfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbmQgbGF0ZXN0IG5vdCBzZWVuIGFydGljbGUKICAgICAgICBBUlRJQ0xFOgogICAgICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVCb3gpIHsKCiAgICAgICAgICAgICMgaWdub3JlIHN5c3RlbSBzZW5kZXIgdHlwZQogICAgICAgICAgICBuZXh0IEFSVElDTEUKICAgICAgICAgICAgICAgIGlmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGUtPntTZW5kZXJUeXBlfSBlcSAnc3lzdGVtJzsKCiAgICAgICAgICAgIG5leHQgQVJUSUNMRSBpZiAkQXJ0aWNsZUZsYWdzeyAkQXJ0aWNsZS0+e0FydGljbGVJRH0gfS0+e1NlZW59OwogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGUtPntBcnRpY2xlSUR9OwogICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzZWxlY3RlZCBhcnRpY2xlCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZmlyc3QgYXJ0aWNsZSBhcyBkZWZhdWx0IGlmIG5vcm1hbCBzb3J0CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGVCb3hbMF0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBsYXN0IGN1c3RvbWVyIGFydGljbGUgYXMgc2VsZWN0ZWQgYXJ0aWNsZSByZXBsYWNpbmcgbGFzdCBzZXQKICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZVRtcC0+e1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlVG1wLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4cGFuZCB2aWV3IGlzIHVzYWJsZSAob25seSBmb3IgbGVzcyB0aGVuIDQwMCBhcnRpY2xlKQogICAgIyBpZiB5b3UgaGF2ZSBtb3JlIGFydGljbGVzIGlzIGdvaW5nIHRvIGJlIHNsb3cgYW5kIG5vdCB1c2FibGUKICAgIG15ICRBcnRpY2xlTWF4TGltaXQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWF4QXJ0aWNsZXNab29tRXhwYW5kJykKICAgICAgICAvLyA0MDA7CiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZH0gJiYgJCNBcnRpY2xlQm94ID4gJEFydGljbGVNYXhMaW1pdCApIHsKICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gMDsKICAgIH0KCiAgICAjIGdldCBzaG93biBhcnRpY2xlKHMpCiAgICBteSBAQXJ0aWNsZUJveFNob3duOwogICAgaWYgKCAhJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICBBUlRJQ0xFQk9YOgogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFydGljbGVCb3hTaG93biwgJEFydGljbGVUbXA7CiAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVCT1g7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAQXJ0aWNsZUJveFNob3duID0gQEFydGljbGVCb3g7CiAgICB9CgogICAgIyBzZXQgZGlzcGxheSBvcHRpb25zCiAgICAkUGFyYW17V2lkZ2V0VGl0bGV9ID0gJ1RpY2tldCBJbmZvcm1hdGlvbic7CiAgICAkUGFyYW17SG9va30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgICMgY2hlY2sgaWYgdGlja2V0IGlzIG5vcm1hbCBvciBwcm9jZXNzIHRpY2tldAogICAgbXkgJElzUHJvY2Vzc1RpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q2hlY2tGb3JQcm9jZXNzVHlwZSgKICAgICAgICAnVGlja2V0SUQnID0+ICRTZWxmLT57VGlja2V0SUR9CiAgICApOwoKICAgICMgb3ZlcndyaXRlIGRpc3BsYXkgb3B0aW9ucyBmb3IgcHJvY2VzcyB0aWNrZXQKICAgIGlmICgkSXNQcm9jZXNzVGlja2V0KSB7CiAgICAgICAgJFBhcmFte1dpZGdldFRpdGxlfSA9ICRTZWxmLT57RGlzcGxheVNldHRpbmdzfS0+e1Byb2Nlc3NEaXNwbGF5fS0+e1dpZGdldFRpdGxlfTsKICAgIH0KCiAgICAjIG9ubHkgc2hvdyBhcnRpY2xlIHRyZWUgaWYgYXJ0aWNsZXMgYXJlIHByZXNlbnQsCiAgICAjIG9yIGlmIGEgZmlsdGVyIGlzIHNldCAoc28gdGhhdCB0aGUgdXNlciBoYXMgdGhlIG9wdGlvbiB0bwogICAgIyBkaXNhYmxlIHRoZSBmaWx0ZXIpCiAgICBpZiAoIEBBcnRpY2xlQm94IHx8ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gKSB7CgogICAgICAgIG15ICRQYWdpbmF0aW9uOwoKICAgICAgICBpZiAoJE5lZWRQYWdpbmF0aW9uKSB7CiAgICAgICAgICAgICRQYWdpbmF0aW9uID0gewogICAgICAgICAgICAgICAgUGFnZXMgICAgICAgPT4gJFBhZ2VzLAogICAgICAgICAgICAgICAgQ3VycmVudFBhZ2UgPT4gJFBhZ2UsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhcnRpY2xlIHRyZWUKICAgICAgICAkUGFyYW17QXJ0aWNsZVRyZWV9ID0gJFNlbGYtPl9BcnRpY2xlVHJlZSgKICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIEFydGljbGVGbGFncyAgICAgID0+IFwlQXJ0aWNsZUZsYWdzLAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBBcnRpY2xlTWF4TGltaXQgICA9PiAkQXJ0aWNsZU1heExpbWl0LAogICAgICAgICAgICBBcnRpY2xlQm94ICAgICAgICA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgIFBhZ2luYXRpb24gICAgICAgID0+ICRQYWdpbmF0aW9uLAogICAgICAgICAgICBQYWdlICAgICAgICAgICAgICA9PiAkUGFnZSwKICAgICAgICAgICAgQXJ0aWNsZUNvdW50ICAgICAgPT4gc2NhbGFyIEBBcnRpY2xlQm94LAogICAgICAgICAgICBBY2xBY3Rpb24gICAgICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXMgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0sCiAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tGb3J3YXJkfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhcnRpY2xlcyBpdGVtcwogICAgaWYgKCAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAkUGFyYW17QXJ0aWNsZUl0ZW1zfSA9ICcnOwogICAgICAgIEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveFNob3duKSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAgICAgJFNlbGYtPl9BcnRpY2xlSXRlbSgKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlcyA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSwKICAgICAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tGb3J3YXJkfSwKICAgICAgICAgICAgICAgIEFjdHVhbEFydGljbGVJRCAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnU3RhdGljJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVJdGVtc30gLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZH0gJiYgJFRpY2tldHtBcmNoaXZlRmxhZ30gbmUgJ3knICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEl0ZW1NYXJrQXNTZWVuJywKICAgICAgICAgICAgRGF0YSA9PiB7IFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFnZSBkZXNpZ24KICAgICRUaWNrZXR7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoIEFnZSA9PiAkVGlja2V0e0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgbnVtYmVyIG9mIGFydGljbGVzCiAgICAkUGFyYW17QXJ0aWNsZUNvdW50fSA9IHNjYWxhciBAQXJ0aWNsZUJveDsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlVzZUFydGljbGVDb2xvcnMnKSApIHsKICAgICAgICAkUGFyYW17VXNlQXJ0aWNsZUNvbG9yc30gPSAxOwogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSGVhZGVyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICApOwoKICAgICMgcnVuIHRpY2tldCBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBNRU5VOgogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgICAgIEFDTCAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlUgaWYgISRJdGVtOwogICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAiQXNQb3B1cCBQb3B1cFR5cGVfJE1lbnVzeyRNZW51fS0+e1BvcHVwVHlwZX0iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0TWVudScsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJE1vdmVRdWV1ZXN7MH0KICAgICAgICAgICAgPSAnLSAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01vdmUnKSAuICcgLSc7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0UXVldWVJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTW92ZVF1ZXVlcywKICAgICAgICAgICAgQ3VycmVudFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwogICAgfQogICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRNb3ZlfQogICAgICAgICYmICggJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldE1vdmV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1RpY2tldElEfSA9ICRUaWNrZXR7VGlja2V0SUR9OwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1vdmVUeXBlJykgPX4gL15mb3JtJC9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlTGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTW92ZUZvcm0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGNyZWF0ZWQgYnkgaWYgZGlmZmVyZW50IHRoZW4gVXNlciBJRCAxCiAgICBpZiAoICRUaWNrZXR7Q3JlYXRlQnl9ID4gMSApIHsKICAgICAgICAkVGlja2V0e0NyZWF0ZWRCeVVzZXJ9ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlck5hbWUoIFVzZXJJRCA9PiAkVGlja2V0e0NyZWF0ZUJ5fSApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZWRCeScsCiAgICAgICAgICAgIERhdGEgPT4geyVUaWNrZXR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBlcSAneScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJjaGl2ZUZsYWcnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkVGlja2V0e1NlcnZpY2V9ICkgewojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKIyAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAojICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKIyAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+IDEsCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFRpY2tldHtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVNlcnZpY2UsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZXJ2aWNle05hbWV9LAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICRTZXJ2aWNle0N1ckluY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICAlQWNsQWN0aW9uLAogICAgICAgICAgICB9LAogICAgICAgICk7CiMgLS0tCiAgICAgICAgaWYgKCAkVGlja2V0e1NMQX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkVGlja2V0e1VwZGF0ZVRpbWV9ICkgewogICAgICAgICRUaWNrZXR7VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRUaWNrZXR7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0b3RhbCBhY2NvdW50ZWQgdGltZSBpZiBmZWF0dXJlIGlzIGFjdGl2ZToKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCVUaWNrZXQpOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsQWNjb3VudGVkVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcGVuZGluZyB1bnRpbCwgaWYgc2V0OgogICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gKSB7CiAgICAgICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gPCAtMSApIHsKICAgICAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWxDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRUaWNrZXR7VW50aWxUaW1lSHVtYW59ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkVGlja2V0e1VudGlsVGltZX0gKyAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKSwKICAgICAgICApOwogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUGVuZGluZ1VudGlsJywKICAgICAgICAgICAgRGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBvd25lcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVPd25lckluZm8sICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBzaG93IHJlc3BvbnNpYmxlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJVJlc3BvbnNpYmxlSW5mbywgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IG5vIGFydGljbGVzIGJsb2NrIGlmIHRpY2tldCBkb2VzIG5vdCBjb250YWluIGFydGljbGVzCiAgICBpZiAoICFAQXJ0aWNsZUJveCAmJiAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hpbnROb0FydGljbGVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBwcm9jZXNzIHdpZGdldCAgYW5kIGFjdGl2aXR5IGRpYWxvZ3Mgb24gcHJvY2VzcyB0aWNrZXRzCiAgICBpZiAoJElzUHJvY2Vzc1RpY2tldCkgewoKICAgICAgICAjIGdldCB0aGUgREYgd2hlcmUgdGhlIFByb2Nlc3NFbnRpdHlJRCBpcyBzdG9yZWQKICAgICAgICBteSAkUHJvY2Vzc0VudGl0eUlERmllbGQgPSAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQiKTsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBBdGl2aXR5RW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJEFjdGl2aXR5RW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQiKTsKCiAgICAgICAgbXkgJFByb2Nlc3NEYXRhID0gJFNlbGYtPntQcm9jZXNzT2JqZWN0fS0+UHJvY2Vzc0dldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRUaWNrZXR7JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICApOwogICAgICAgIG15ICRBY3Rpdml0eURhdGEgPSAkU2VsZi0+e0FjdGl2aXR5T2JqZWN0fS0+QWN0aXZpdHlHZXQoCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJ0FnZW50SW50ZXJmYWNlJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkVGlja2V0eyRBY3Rpdml0eUVudGl0eUlERmllbGR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHByb2Nlc3MgaW5mb3JtYXRpb24gaW4gdGhlIHNpZGViYXIKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzRGF0YScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUHJvY2VzcyAgPT4gJFByb2Nlc3NEYXRhLT57TmFtZX0gIHx8ICcnLAogICAgICAgICAgICAgICAgQWN0aXZpdHkgPT4gJEFjdGl2aXR5RGF0YS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRoZSBwcm9jZXNzIHdpZGdldCB0aGUgdGhlIG1haW4gc2NyZWVuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgV2lkZ2V0VGl0bGUgPT4gJFBhcmFte1dpZGdldFRpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBuZXh0IGFjdGl2aXR5IGRpYWxvZ3MKICAgICAgICBteSAkTmV4dEFjdGl2aXR5RGlhbG9nczsKICAgICAgICBpZiAoICRUaWNrZXR7JEFjdGl2aXR5RW50aXR5SURGaWVsZH0gKSB7CiAgICAgICAgICAgICROZXh0QWN0aXZpdHlEaWFsb2dzID0gJEFjdGl2aXR5RGF0YTsKICAgICAgICB9CiAgICAgICAgbXkgJEFjdGl2aXR5TmFtZSA9ICRBY3Rpdml0eURhdGEtPntOYW1lfTsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTmV4dEFjdGl2aXR5RGlhbG9ncykgKSB7CgogICAgICAgICAgICAjIHdlIGRvbid0IG5lZWQgdGhlIHdob2xlIEFjdGl2aXR5IGNvbmZpZywKICAgICAgICAgICAgIyBqdXN0IHRoZSBBY3Rpdml0eSBEaWFsb2dzIG9mIHRoZSBjdXJyZW50IEFjdGl2aXR5CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICROZXh0QWN0aXZpdHlEaWFsb2dzLT57QWN0aXZpdHlEaWFsb2d9ICkgKSB7CiAgICAgICAgICAgICAgICAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSA9ICV7ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57QWN0aXZpdHlEaWFsb2d9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmV4dEFjdGl2aXR5RGlhbG9ncyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIG5lZWRlZCBwZXJtaXNzaW9ucyB0byB2aWV3IHRoZQogICAgICAgICAgICAjIGRpZmZlcmVudCBhY3Rpdml0eSBkaWFsb2dzLCBzbyB3ZSBsb29wIG92ZXIgZXZlcnkgYWN0aXZpdHkgZGlhbG9nIGFuZCBjaGVjayBpZiB0aGVyZQogICAgICAgICAgICAjIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkLiBJZiB0aGVyZSBpcyBhIHBlcm1pc3Npb24gY29uZmlndXJlZCB3ZSBjaGVjayB0aGlzCiAgICAgICAgICAgICMgYW5kIGRpc3BsYXkvaGlkZSB0aGUgYWN0aXZpdHkgZGlhbG9nIGxpbmsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25SaWdodHM7CiAgICAgICAgICAgIG15ICVQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0OwogICAgICAgICAgICBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JEluZGV4fTsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2cKICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57QWN0aXZpdHlEaWFsb2dPYmplY3R9LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGFuIGludGVyZmFjZSBsb29rdXAtbGlzdAogICAgICAgICAgICAgICAgbXkgJUludGVyZmFjZUxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57SW50ZXJmYWNlfSB9OwoKICAgICAgICAgICAgICAgIG5leHQgQUNUSVZJVFlESUFMT0dQRVJNSVNTSU9OIGlmICEkSW50ZXJmYWNlTG9va3Vwe0FnZW50SW50ZXJmYWNlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBwZXJmb3JtYW5jZS1ib29zdC9jYWNoZQogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGVybWlzc2lvblJpZ2h0c3sgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3R7JEluZGV4fSA9ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWR1Y2UgbmV4dCBhY3Rpdml0eSBkaWFsb2dzIHRvIHRoZSBvbmVzIHRoYXQgaGF2ZSBwZXJtaXNzaW9ucwogICAgICAgICAgICAkTmV4dEFjdGl2aXR5RGlhbG9ncyA9IFwlUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdDsKCiAgICAgICAgICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3QsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAleyROZXh0QWN0aXZpdHlEaWFsb2dzfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05leHRBY3Rpdml0eURpYWxvZ3MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0FjdGl2aXR5TmFtZScgPT4gJEFjdGl2aXR5TmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCROZXh0QWN0aXZpdHlEaWFsb2dzKSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTmV4dEFjdGl2aXR5RGlhbG9nS2V5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nRGF0YSA9ICRTZWxmLT57QWN0aXZpdHlEaWFsb2dPYmplY3R9LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRUaWNrZXR7JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0FjdGl2aXR5RGlhbG9ncycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICApOwojIC0tLQojIElUU00KIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKCiAgICAjIGxvb2t1cCBoYXNoIGZvciBhbGwgSVRTTSBkeW5hbWljIGZpZWxkcwogICAgbXkgJUlUU01EeW5hbWljRmllbGRzID0gKAogICAgICAgIElUU01Dcml0aWNhbGl0eSAgICAgICA9PiAxLAogICAgICAgIElUU01JbXBhY3QgICAgICAgICAgICA9PiAxLAogICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCAgICA9PiAxLAogICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgIElUU01SZXBhaXJTdGFydFRpbWUgICA9PiAxLAogICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgIElUU01EdWVEYXRlICAgICAgICAgICA9PiAxLAogICAgKTsKIyAtLS0KCiAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcHJvY2VzcyB3aWRnZXQgYW5kIGluIHRoZSBzaWRlYmFyCiAgICBteSAoIEBGaWVsZHNXaWRnZXQsIEBGaWVsZHNTaWRlYmFyICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSBlcSAnJzsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICAgICAgaWYgKCAkSVRTTUR5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICBwdXNoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQojIC0tLQoKICAgICAgICAjIHVzZSB0cmFuc2xhdGlvbiBoZXJlIHRvIGJlIGFibGUgdG8gcmVkdWNlIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIGluIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15ICRMYWJlbAogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJElzUHJvY2Vzc1RpY2tldCAmJgogICAgICAgICAgICAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAoKICAgICAgICAgICAgICAgICMgbm8gVmFsdWVNYXhDaGFycyBoZXJlLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBGaWVsZHNXaWRnZXQsIHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVmFsdWVLZXkKICAgICAgICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgICAgICAgICAgICAgICA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT4KICAgICAgICAgICAgICAgIEdldCgnVGlja2V0OjpGcm9udGVuZDo6RHluYW1pY0ZpZWxkc1pvb21NYXhTaXplU2lkZWJhcicpCiAgICAgICAgICAgICAgICB8fCAxOCwgICAgIyBsaW1pdCBmb3Igc2lkZWJhciBkaXNwbGF5CiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQEZpZWxkc1NpZGViYXIsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoJElzUHJvY2Vzc1RpY2tldCkgewoKICAgICAgICAjIG91dHB1dCBkeW5hbWljIGZpZWxkcyByZWdpc3RlcmVkIGZvciBhIGdyb3VwIGluIHRoZSBwcm9jZXNzIHdpZGdldAogICAgICAgIG15IEBGaWVsZHNJbkFHcm91cDsKICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoCiAgICAgICAgICAgIHNvcnQga2V5cyAleyAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwcycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkR3JvdXBGaWVsZHNTdHJpbmcKICAgICAgICAgICAgICAgID0gJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9LT57UHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3Vwc30tPnskR3JvdXBOYW1lfTsKCiAgICAgICAgICAgICRHcm91cEZpZWxkc1N0cmluZyA9fiBze1xzfXt9eG1zZzsKICAgICAgICAgICAgbXkgQEdyb3VwRmllbGRzID0gc3BsaXQoICcsJywgJEdyb3VwRmllbGRzU3RyaW5nICk7CgogICAgICAgICAgICBpZiAoICQjR3JvdXBGaWVsZHMgKyAxICkgewoKICAgICAgICAgICAgICAgIG15ICRTaG93R3JvdXBUaXRsZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChARmllbGRzV2lkZ2V0KSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRGaWVsZC0+e05hbWV9IH0gQEdyb3VwRmllbGRzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFNob3dHcm91cFRpdGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJEZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICRGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsaWFzIGZvciB0aWNrZXQgdGl0bGUsIFRpdGxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAkRmllbGQtPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkLT57TmFtZX0gPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBGaWVsZHNJbkFHcm91cCwgJEZpZWxkLT57TmFtZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU2hvd0dyb3VwVGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBTZXBhcmF0b3InLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBkeW5hbWljIGZpZWxkcyBub3QgcmVnaXN0ZXJlZCBpbiBhIGdyb3VwIGluIHRoZSBwcm9jZXNzIHdpZGdldAogICAgICAgIG15IEBSZW1haW5pbmdGaWVsZHNXaWRnZXQ7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoQEZpZWxkc1dpZGdldCkgewoKICAgICAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICRGaWVsZC0+e05hbWV9IH0gQEZpZWxkc0luQUdyb3VwICkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVtYWluaW5nRmllbGRzV2lkZ2V0LCAkRmllbGQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cHMnLAogICAgICAgICk7CgogICAgICAgIGlmICggJCNSZW1haW5pbmdGaWVsZHNXaWRnZXQgKyAxICkgewoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cFNlcGFyYXRvcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGaWVsZHMgd2l0aCBubyBncm91cCcpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGaWVsZCAoQFJlbWFpbmluZ0ZpZWxkc1dpZGdldCkgewoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJEZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICRGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlcicsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRGaWVsZC0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCgogICAgICAgICAgICAgICAgICAgICAgICAjIGFsaWFzIGZvciB0aWNrZXQgdGl0bGUsIFRpdGxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAkRmllbGQtPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkLT57TmFtZX0gPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGN5Y2xlIHRyb3VnaCBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjUsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBvdXRwdXQgZHluYW1pYyBmaWVsZHMgaW4gdGhlIHNpZGViYXIKICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHNTaWRlYmFyKSB7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJEZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJEZpZWxkLT57TGlua30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCgogICAgICAgICAgICAgICAgICAgICMgYWxpYXMgZm9yIHRpY2tldCB0aXRsZSwgVGl0bGUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgICAgICAgICAgICAgIFRpY2tldFRpdGxlICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgPT4gJEZpZWxkLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJEZpZWxkLT57TmFtZX0gPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRmllbGQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbScpICkgewoKICAgICAgICAjIGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb21NYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdUaWNrZXQnLAogICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RhdGUgICAgICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIE9iamVjdFBhcmFtZXRlcnMgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgSWdub3JlTGlua2VkVGlja2V0U3RhdGVUeXBlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgc2ltcGxlIGxpbmsgdGFibGUKICAgIGlmICggJExpbmtUYWJsZVN0cmcgJiYgJExpbmtUYWJsZVZpZXdNb2RlIGVxICdTaW1wbGUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZVNpbXBsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHRoZSBjb21wbGV4IGxpbmsgdGFibGUKICAgIGlmICggJExpbmtUYWJsZVN0cmcgJiYgJExpbmtUYWJsZVZpZXdNb2RlIGVxICdDb21wbGV4JyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGVDb21wbGV4JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgIGlmICggJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAgICAgIyBidWlsZCBldmVudCB0eXBlIGxpc3QgZm9yIGZpbHRlciBkaWFsb2cKICAgICAgICAgICAgJFBhcmFte0V2ZW50VHlwZUZpbHRlclN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0V2ZW50VHlwZUZpbHRlcicsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXZlbnRUeXBlRmlsdGVyRGlhbG9nJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgYXJ0aWNsZSB0eXBlcwogICAgICAgICAgICBteSAlQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBhcnRpY2xlIHR5cGUgbGlzdCBmb3IgZmlsdGVyIGRpYWxvZwogICAgICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVGaWx0ZXJTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlQXJ0aWNsZVR5cGVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e0FydGljbGVUeXBlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FydGljbGVUeXBlRmlsdGVyJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHNlbmRlciB0eXBlcwogICAgICAgICAgICBteSAlQXJ0aWNsZVNlbmRlclR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZGVyVHlwZUxpc3QoCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBhcnRpY2xlIHNlbmRlciB0eXBlIGxpc3QgZm9yIGZpbHRlciBkaWFsb2cKICAgICAgICAgICAgJFBhcmFte0FydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJUFydGljbGVTZW5kZXJUeXBlcywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcicsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRpY2tldCBJRAogICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZpbHRlckRpYWxvZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgIyBjaGVjayBpZiB0aWNrZXQgbmVlZCB0byBiZSBtYXJrZWQgYXMgc2VlbgogICAgbXkgJEFydGljbGVBbGxTZWVuID0gMTsKICAgIEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICMgaWdub3JlIHN5c3RlbSBzZW5kZXIgdHlwZQogICAgICAgIG5leHQgQVJUSUNMRQogICAgICAgICAgICBpZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgJiYgJEFydGljbGUtPntTZW5kZXJUeXBlfSBlcSAnc3lzdGVtJzsKCiAgICAgICAgIyBsYXN0IEFSVElDTEUgaWYgYXJ0aWNsZSB3YXMgbm90IHNob3duCiAgICAgICAgaWYgKCAhJEFydGljbGVGbGFnc3sgJEFydGljbGUtPntBcnRpY2xlSUR9IH0tPntTZWVufSApIHsKICAgICAgICAgICAgJEFydGljbGVBbGxTZWVuID0gMDsKICAgICAgICAgICAgbGFzdCBBUlRJQ0xFOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1hcmsgdGlja2V0IGFzIHNlZW4gaWYgYWxsIGFydGljbGUgYXJlIHNob3duCiAgICBpZiAoJEFydGljbGVBbGxTZWVuKSB7CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGbGFnU2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ICAgICAgPT4gJ1NlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQganMKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVGlja2V0Wm9vbUluaXQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICApOwp9CgpzdWIgX0FydGljbGVUcmVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICAgICAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlQXJ0aWNsZUZsYWdzICAgID0gJXsgJFBhcmFte0FydGljbGVGbGFnc30gfTsKICAgIG15IEBBcnRpY2xlQm94ICAgICAgPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKICAgIG15ICRBcnRpY2xlTWF4TGltaXQgPSAkUGFyYW17QXJ0aWNsZU1heExpbWl0fTsKICAgIG15ICRBcnRpY2xlSUQgICAgICAgPSAkUGFyYW17QXJ0aWNsZUlEfTsKICAgIG15ICRUYWJsZUNsYXNzZXM7CgogICAgIyBidWlsZCB0aHJlYWQgc3RyaW5nCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RyZWUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFRhYmxlQ2xhc3NlcyA9PiAkVGFibGVDbGFzc2VzLAogICAgICAgICAgICBab29tVGltZWxpbmUgPT4gJFNlbGYtPntab29tVGltZWxpbmV9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1BhZ2luYXRpb259ICYmICEkU2VsZi0+e1pvb21UaW1lbGluZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVBhZ2VzJywKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17UGFnaW5hdGlvbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4cGFuZC9jb2xsYXBzZSB2aWV3IGlzIHVzYWJsZSAobm90IGF2YWlsYWJsZSBmb3IgdG9vIG1hbnkKICAgICMgYXJ0aWNsZXMpCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZH0gJiYgJCNBcnRpY2xlQm94IDwgJEFydGljbGVNYXhMaW1pdCApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb2xsYXBzZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZFNvcnQgPT4gJFNlbGYtPntab29tRXhwYW5kU29ydH0sCiAgICAgICAgICAgICAgICBQYWdlICAgICAgICAgICA9PiAkUGFyYW17UGFnZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAjIHNob3cgdHJpZ2dlciBmb3IgY2hyb25pY2FsIHZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaHJvbmljYWwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZCAgICAgPT4gJFNlbGYtPntab29tRXhwYW5kfSwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgUGFnZSAgICAgICAgICAgPT4gJFBhcmFte1BhZ2V9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICQjQXJ0aWNsZUJveCA8ICRBcnRpY2xlTWF4TGltaXQgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwYW5kJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgIFBhZ2UgICAgICAgICAgID0+ICRQYXJhbXtQYWdlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZwogICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJBY3RpdmV9ICkgewoKICAgICAgICAjIGRlZmluZSBoaWdobGlnaHQgc3R5bGUgZm9yIGxpbmtzIGlmIGZpbHRlciBpcyBhY3RpdmUKICAgICAgICBteSAkSGlnaGxpZ2h0U3R5bGUgPSAnbWVudSc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICkgewogICAgICAgICAgICAkSGlnaGxpZ2h0U3R5bGUgPSAnUHJpb3JpdHlJRC01JzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgYXJ0aWNsZSBmaWx0ZXIgbGlua3MKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nTGluaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgSGlnaGxpZ2h0U3R5bGUgPT4gJEhpZ2hsaWdodFN0eWxlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYXJ0aWNsZSBmaWx0ZXIgcmVzZXQgbGluayBvbmx5IGlmIGZpbHRlciBpcyBzZXQKICAgICAgICBpZiAoCiAgICAgICAgICAgICggISRTZWxmLT57Wm9vbVRpbWVsaW5lfSAmJiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICkKICAgICAgICAgICAgfHwgKCAkU2VsZi0+e1pvb21UaW1lbGluZX0gJiYgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGaWx0ZXJSZXNldExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFydGljbGUgdHJlZQogICAgaWYgKCAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlTGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGFibGVDbGFzc2VzID0+ICRUYWJsZUNsYXNzZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnIGFuZCB0aGVyZSBhcmUgYXJ0aWNsZXMKICAgICAgICAgICAgIyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyCiAgICAgICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAmJiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2hvd25BcnRpY2xlSURzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3Qgc2hvdyBhcnRpY2xlIGluIHRyZWUgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57ICRBcnRpY2xle0FydGljbGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBUlRJQ0xFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFydGljbGUgZmxhZ3MKICAgICAgICAgICAgbXkgJENsYXNzICAgICAgPSAnJzsKICAgICAgICAgICAgbXkgJENsYXNzUm93ICAgPSAnJzsKICAgICAgICAgICAgbXkgJE5ld0FydGljbGUgPSAwOwoKICAgICAgICAgICAgIyBpZ25vcmUgc3lzdGVtIHNlbmRlciB0eXBlcwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEFydGljbGVGbGFnc3sgJEFydGljbGV7QXJ0aWNsZUlEfSB9LT57U2Vlbn0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6TmV3QXJ0aWNsZUlnbm9yZVN5c3RlbVNlbmRlcicpCiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6TmV3QXJ0aWNsZUlnbm9yZVN5c3RlbVNlbmRlcicpCiAgICAgICAgICAgICAgICAgICAgJiYgJEFydGljbGV7U2VuZGVyVHlwZX0gbmUgJ3N5c3RlbScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJE5ld0FydGljbGUgPSAxOwoKICAgICAgICAgICAgICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKCiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzaG93IGFyY2hpdmVkIHRpY2tldHMgYXMgc2VlbgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzICAgIC49ICcgVW5yZWFkQXJ0aWNsZXMnOwogICAgICAgICAgICAgICAgICAgICRDbGFzc1JvdyAuPSAnIFVucmVhZEFydGljbGVzJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGp1c3Qgc2hvdyB0aWNrZXQgZmxhZ3MgaWYgYWdlbnQgYmVsb25ncyB0byB0aGUgdGlja2V0CiAgICAgICAgICAgICAgICBteSAkU2hvd01ldGE7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVc2VySUR9ID09ICRBcnRpY2xle093bmVySUR9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntVc2VySUR9ID09ICRBcnRpY2xle1Jlc3BvbnNpYmxlSUR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTaG93TWV0YSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkU2hvd01ldGEgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6V2F0Y2hlcicpICkgewogICAgICAgICAgICAgICAgICAgIG15ICVXYXRjaCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0V2F0Y2hHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJFdhdGNoeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNob3dNZXRhID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzaG93IHRpY2tldCBmbGFncwogICAgICAgICAgICAgICAgaWYgKCRTaG93TWV0YSkgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyAuPSAnIFJlbWFya2FibGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzIC49ICcgT3JkaW5hcnknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIHRoaXMgaXMgdGhlIHNob3duIGFydGljbGUgLT0+IHNldCBjbGFzcyB0byBhY3RpdmUKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gJiYgISRTZWxmLT57Wm9vbUV4cGFuZH0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3NSb3cgLj0gJyBBY3RpdmUnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVG1wU3ViamVjdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgYWxzbyBleHBhbmQvY29sbGFwc2UgaWNvbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIENsYXNzUm93ICAgICAgID0+ICRDbGFzc1JvdywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkVG1wU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgZmxhZ3MKICAgICAgICAgICAgIyBBbHdheXMgdXNlIHVzZXIgaWQgMSBiZWNhdXNlIG90aGVyIHVzZXJzIGFsc28gaGF2ZSB0byBzZWUgdGhlIGltcG9ydGFudCBmbGFnCiAgICAgICAgICAgIG15ICVBcnRpY2xlSW1wb3J0YW50RmxhZ3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICBpZiAoICRBcnRpY2xlSW1wb3J0YW50RmxhZ3N7SW1wb3J0YW50fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1JbXBvcnRhbnRBcnRpY2xlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgICAgICAgICAgaWYgKCAkTmV3QXJ0aWNsZSAmJiAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtTmV3QXJ0aWNsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgICAgICMgd2UgYWRkIGFuIGVtcHR5IGVsZW1lbnQgaGVyZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1Ob05ld0FydGljbGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERldGVybWluZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbgogICAgICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvLWludGVybmFsJC9zbXggKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUcmVlSXRlbURpcmVjdGlvbkludGVybmFsJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmcnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUcmVlSXRlbURpcmVjdGlvbk91dGdvaW5nJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYXR0YWNobWVudCBpbmZvCiAgICAgICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgICAgICMgd2UgYWRkIGFuIGVtcHR5IGVsZW1lbnQgaGVyZQogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZXtBdG1zfSB8fCAhJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1Ob0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBteSAkQXR0YWNobWVudHMgPSAkU2VsZi0+X0NvbGxlY3RBcnRpY2xlQXR0YWNobWVudHMoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1BdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gJEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgY2hyb25pY2FsIHZpZXcKICAgIGVsc2UgewoKICAgICAgICAjIGdldCB0aWNrZXQgaGlzdG9yeQogICAgICAgIG15IEBIaXN0b3J5TGluZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkhpc3RvcnlHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZXMgZm9yIGxhdGVyIHVzZQogICAgICAgIG15IEBDaHJvbmljYWxBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAyLAogICAgICAgICk7CgogICAgICAgIG15ICRBcnRpY2xlc0J5QXJ0aWNsZUlEID0ge307CiAgICAgICAgZm9yIG15ICRBcnRpY2xlICggc29ydCBAQ2hyb25pY2FsQXJ0aWNsZUJveCApIHsKCiAgICAgICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgaW5kZXggKHdpdGhvdXQgYXR0YWNobWVudHMpCiAgICAgICAgICAgIG15ICVBdG1JbmRleCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGUtPntBdG1zfSA9IFwlQXRtSW5kZXg7CiAgICAgICAgICAgICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSB9ID0gJEFydGljbGU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCBkaXNwbGF5IHRoZXNlIHR5cGVzCiAgICAgICAgbXkgQFR5cGVzRG9kZ2UgPSBxdygKICAgICAgICAgICAgTWlzYwogICAgICAgICAgICBBcmNoaXZlRmxhZ1VwZGF0ZQogICAgICAgICAgICBMb29wUHJvdGVjdGlvbgogICAgICAgICAgICBSZW1vdmUKICAgICAgICAgICAgU3Vic2NyaWJlCiAgICAgICAgICAgIFVuc3Vic2NyaWJlCiAgICAgICAgICAgIFN5c3RlbVJlcXVlc3QKICAgICAgICAgICAgU2VuZEFnZW50Tm90aWZpY2F0aW9uCiAgICAgICAgICAgIFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbgogICAgICAgICAgICBTZW5kQXV0b1JlamVjdAogICAgICAgICk7CgogICAgICAgICMgc29ydCBvdXQgbm9uLWZpbHRlcmVkIGV2ZW50IHR5cGVzIChpZiBhcHBsaWNhYmxlKQogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9CiAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIG15ICRFdmVudFR5cGUgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEV2ZW50VHlwZSBuZSAnTmV3VGlja2V0JyAmJiAhZ3JlcCB7ICRfIGVxICRFdmVudFR5cGUgfQogICAgICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfS0+e0V2ZW50VHlwZUlEfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFR5cGVzRG9kZ2UsICRFdmVudFR5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHlwZXMgd2hpY2ggY2FuIGJlIGRlc2NyaWJlZCBhcyAnYWN0aW9uIG9uIGEgdGlja2V0JwogICAgICAgIG15IEBUeXBlc1RpY2tldEFjdGlvbiA9IHF3KAogICAgICAgICAgICBTZXJ2aWNlVXBkYXRlCiAgICAgICAgICAgIFNMQVVwZGF0ZQogICAgICAgICAgICBTdGF0ZVVwZGF0ZQogICAgICAgICAgICBTZXRQZW5kaW5nVGltZQogICAgICAgICAgICBVbmxvY2sKICAgICAgICAgICAgTG9jawogICAgICAgICAgICBSZXNwb25zaWJsZVVwZGF0ZQogICAgICAgICAgICBPd25lclVwZGF0ZQogICAgICAgICAgICBDdXN0b21lclVwZGF0ZQogICAgICAgICAgICBOZXdUaWNrZXQKICAgICAgICAgICAgVGlja2V0TGlua0FkZAogICAgICAgICAgICBUaWNrZXRMaW5rRGVsZXRlCiAgICAgICAgICAgIFRpY2tldER5bmFtaWNGaWVsZFVwZGF0ZQogICAgICAgICAgICBNb3ZlCiAgICAgICAgICAgIE1lcmdlZAogICAgICAgICAgICBQcmlvcml0eVVwZGF0ZQogICAgICAgICAgICBUaXRsZVVwZGF0ZQogICAgICAgICAgICBUeXBlVXBkYXRlCiAgICAgICAgICAgIEVzY2FsYXRpb25SZXNwb25zZVRpbWVOb3RpZnlCZWZvcmUKICAgICAgICAgICAgRXNjYWxhdGlvblJlc3BvbnNlVGltZVN0YXJ0CiAgICAgICAgICAgIEVzY2FsYXRpb25SZXNwb25zZVRpbWVTdG9wCiAgICAgICAgICAgIEVzY2FsYXRpb25Tb2x1dGlvblRpbWVOb3RpZnlCZWZvcmUKICAgICAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0YXJ0CiAgICAgICAgICAgIEVzY2FsYXRpb25Tb2x1dGlvblRpbWVTdG9wCiAgICAgICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lTm90aWZ5QmVmb3JlCiAgICAgICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lU3RhcnQKICAgICAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVTdG9wCiAgICAgICAgICAgIFRpbWVBY2NvdW50aW5nCiAgICAgICAgKTsKCiAgICAgICAgIyB0eXBlcyB3aGljaCBhcmUgdXN1YWxseSBiZWluZyBjb25uZWN0ZWQgdG8gc29tZSBraW5kIG9mCiAgICAgICAgIyBhdXRvbWF0aWMgcHJvY2VzcyAoZS5nLiB0cmlnZ2VyZWQgYnkgYW5vdGhlciBhY3Rpb24pCiAgICAgICAgbXkgQFR5cGVzVGlja2V0QXV0b0FjdGlvbiA9IHF3KAogICAgICAgICAgICBTZW5kQXV0b0ZvbGxvd1VwCiAgICAgICAgICAgIFNlbmRBdXRvUmVqZWN0CiAgICAgICAgICAgIFNlbmRBdXRvUmVwbHkKICAgICAgICApOwoKICAgICAgICAjIHR5cGVzIHdoaWNoIGNhbiBiZSBjb25zaWRlcmVkIGFzIGludGVybmFsCiAgICAgICAgbXkgQFR5cGVzSW50ZXJuYWwgPSBxdygKICAgICAgICAgICAgQWRkTm90ZQogICAgICAgICAgICBDaGF0SW50ZXJuYWwKICAgICAgICApOwoKICAgICAgICAjIG91dGdvaW5nIHR5cGVzCiAgICAgICAgbXkgQFR5cGVzT3V0Z29pbmcgPSBxdygKICAgICAgICAgICAgRm9yd2FyZAogICAgICAgICAgICBFbWFpbEFnZW50CiAgICAgICAgICAgIFBob25lQ2FsbEFnZW50CiAgICAgICAgICAgIEJvdW5jZQogICAgICAgICAgICBTZW5kQW5zd2VyCiAgICAgICAgKTsKCiAgICAgICAgIyBpbmNvbWluZyB0eXBlcwogICAgICAgIG15IEBUeXBlc0luY29taW5nID0gcXcoCiAgICAgICAgICAgIE5ld1RpY2tldAogICAgICAgICAgICBFbWFpbEN1c3RvbWVyCiAgICAgICAgICAgIEFkZE5vdGVDdXN0b21lcgogICAgICAgICAgICBQaG9uZUNhbGxDdXN0b21lcgogICAgICAgICAgICBGb2xsb3dVcAogICAgICAgICAgICBXZWJSZXF1ZXN0Q3VzdG9tZXIKICAgICAgICAgICAgQ2hhdEV4dGVybmFsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFR5cGVzTGVmdCA9ICgKICAgICAgICAgICAgQFR5cGVzT3V0Z29pbmcsCiAgICAgICAgICAgIEBUeXBlc0ludGVybmFsLAogICAgICAgICAgICBAVHlwZXNUaWNrZXRBdXRvQWN0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBUeXBlc1JpZ2h0ID0gKAogICAgICAgICAgICBAVHlwZXNJbmNvbWluZywKICAgICAgICAgICAgQFR5cGVzVGlja2V0QWN0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBUeXBlc1dpdGhBcnRpY2xlcyA9ICgKICAgICAgICAgICAgQFR5cGVzT3V0Z29pbmcsCiAgICAgICAgICAgIEBUeXBlc0ludGVybmFsLAogICAgICAgICAgICBAVHlwZXNJbmNvbWluZywKICAgICAgICAgICAgJ1Bob25lQ2FsbEN1c3RvbWVyJywKICAgICAgICAgICAgJ05ld1RpY2tldCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUhpc3RvcnlJdGVtczsKICAgICAgICBteSAkSXRlbUNvdW50ZXIgPSAwOwogICAgICAgIG15ICRMYXN0Q3JlYXRlVGltZTsKICAgICAgICBteSAkTGFzdENyZWF0ZVN5c3RlbVRpbWU7CgogICAgICAgICMgR2V0IG1hcHBpbmcgb2YgaGlzdG9yeSB0eXBlcyB0byByZWFkYWJsZSBzdHJpbmdzCiAgICAgICAgbXkgJUhpc3RvcnlUeXBlczsKICAgICAgICBteSAlSGlzdG9yeVR5cGVDb25maWcKICAgICAgICAgICAgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okhpc3RvcnlUeXBlcycpIC8vIHt9IH07CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIHNvcnQga2V5cyAlSGlzdG9yeVR5cGVDb25maWcgKSB7CiAgICAgICAgICAgICVIaXN0b3J5VHlwZXMgPSAoCiAgICAgICAgICAgICAgICAlSGlzdG9yeVR5cGVzLAogICAgICAgICAgICAgICAgJXsgJEhpc3RvcnlUeXBlQ29uZmlneyRFbnRyeX0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIEhJU1RPUllJVEVNOgogICAgICAgIGZvciBteSAkSXRlbSAoIHJldmVyc2UgQEhpc3RvcnlMaW5lcyApIHsKCiAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzRG9kZ2UgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEhJU1RPUllJVEVNOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSXRlbS0+e0NvdW50ZXJ9ID0gJEl0ZW1Db3VudGVyKys7CgogICAgICAgICAgICAjIGNoZWNrIHdoaWNoIGNvbG9yIHRoZSBpdGVtIHNob3VsZCBoYXZlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ05ld1RpY2tldCcgKSB7CgogICAgICAgICAgIyBpZiB0aGUgJ05ld1RpY2tldCcgaXRlbSBoYXMgYW4gYXJ0aWNsZSwgZGlzcGxheSB0aGlzICJjcmVhdGlvbiBhcnRpY2xlIiBldmVudCBzZXBhcmF0ZWx5CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtJdGVtc30gfSwgewogICAgICAgICAgICAgICAgICAgICAgICAleyRJdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgICAgICAgICAgICA9PiAkSXRlbS0+e0NvdW50ZXJ9KyssCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlUmVhZGFibGUgPT4gJ1RpY2tldCBDcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgT3JpZW50YXRpb24gICAgICAgICA9PiAnUmlnaHQnLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdOZXdUaWNrZXQnOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e05hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNlcnRhaW4gdHlwZXMsIGUuZy4gZXh0ZXJuYWwgbm90ZXMgZnJvbSBjdXN0b21lcnMKICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0FydGljbGVJRH0gJiYgJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ0FkZE5vdGUnICYmIElzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlc0J5QXJ0aWNsZUlELT57JEl0ZW0tPntBcnRpY2xlSUR9fSkgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnskSXRlbS0+e0FydGljbGVJRH19LT57U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJykgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZUluY29taW5nJzsKCiAgICAgICAgICAgICAgICAjIFdlIGZha2UgYSBjdXN0b20gaGlzdG9yeSB0eXBlIGJlY2F1c2UgZXh0ZXJuYWwgbm90ZXMgZnJvbSBjdXN0b21lcnMgc3RpbGwKICAgICAgICAgICAgICAgICMgaGF2ZSB0aGUgaGlzdG9yeSB0eXBlICdBZGROb3RlJyB3aGljaCBkb2VzIG5vdCBhbGxvdyBmb3IgZGlzdGluZ3Vpc2hpbmcuCiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSA9ICdBZGROb3RlQ3VzdG9tZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNlcnRhaW4gdHlwZXMsIGUuZy4gZXh0ZXJuYWwgbm90ZXMgZnJvbSBjdXN0b21lcnMKICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0FydGljbGVJRH0gJiYgSXNIYXNoUmVmV2l0aERhdGEoJEFydGljbGVzQnlBcnRpY2xlSUQtPnskSXRlbS0+e0FydGljbGVJRH19KSAmJiAkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyRJdGVtLT57QXJ0aWNsZUlEfX0tPntBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSA9ICdDaGF0RXh0ZXJuYWwnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZUluY29taW5nJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57QXJ0aWNsZUlEfSAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyRJdGVtLT57QXJ0aWNsZUlEfX0pICYmICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57JEl0ZW0tPntBcnRpY2xlSUR9fS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcpIHsKICAgICAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGV9ID0gJ0NoYXRJbnRlcm5hbCc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlSW50ZXJuYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzVGlja2V0QWN0aW9uICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZVRpY2tldEFjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNUaWNrZXRBdXRvQWN0aW9uICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZVRpY2tldEF1dG9BY3Rpb24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzSW50ZXJuYWwgKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlTm90ZUludGVybmFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc0luY29taW5nICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZUluY29taW5nJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc091dGdvaW5nICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZU91dGdvaW5nJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgYXJ0aWNsZSBpbmZvcm1hdGlvbiBmcm9tIHR5cGVzIHdoaWNoIHNob3VsZCBub3QgZGlzcGxheSBhcnRpY2xlcwogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhcnRpY2xlIChpZiBwcmVzZW50KQogICAgICAgICAgICBpZiAoICRJdGVtLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZURhdGF9ID0gJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH07CgogICAgICAgICAgICAgICAgIyBzZWN1cml0eT0icmVzdHJpY3RlZCIgbWF5IGJyZWFrIFNTTyAtIGRpc2FibGUgdGhpcyBmZWF0dXJlIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGlzYWJsZU1TSUZyYW1lU2VjdXJpdHlSZXN0cmljdGVkJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntNU1NlY3VyaXR5UmVzdHJpY3RlZH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZURhdGF9LT57TVNTZWN1cml0eVJlc3RyaWN0ZWR9ID0gJ3NlY3VyaXR5PSJyZXN0cmljdGVkIic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJUFydGljbGVGbGFncyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdHZXQoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRJdGVtLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntBcnRpY2xlSXNJbXBvcnRhbnR9ID0gJEFydGljbGVGbGFnc3tJbXBvcnRhbnR9OwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcKICAgICAgICAgICAgICAgICAgICB8fCAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntJc0NoYXRBcnRpY2xlfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBvbmx5IHRoZSBmaXJzdCB0aHJlZSAoc2hvcnRlbmVkKSBsaW5lcyBvZiBhIGNoYXJ0IGFydGljbGUKICAgICAgICAgICAgICAgICAgICBteSAkQ2hhdE1lc3NhZ2VzID0gJFNlbGYtPntKU09OT2JqZWN0fS0+RGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLT57QXJ0aWNsZURhdGF9LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJEl0ZW1Db3VudGVyID0gMDsKCiAgICAgICAgICAgICAgICAgICAgQ0hBVElURU06CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlRGF0YSAoc29ydCB7ICRhLT57SUR9IDw9PiAkYi0+e0lEfSB9IEB7JENoYXRNZXNzYWdlc30pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlRGF0YS0+e1N5c3RlbUdlbmVyYXRlZH0gPT0gMSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZURhdGF9LT57Qm9keUNoYXR9IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICc8ZGl2IGNsYXNzPSJDaGF0TWVzc2FnZSI+W1slIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV1dIC0gWyUgRGF0YS5NZXNzYWdlVGV4dCB8IGh0bWwgJV08L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRNZXNzYWdlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntCb2R5Q2hhdH0gLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJzxkaXYgY2xhc3M9IkNoYXRNZXNzYWdlIj5bWyUgRGF0YS5DcmVhdGVUaW1lIHwgaHRtbCAlXV0gLSBbJSBEYXRhLkNoYXR0ZXJOYW1lIHwgaHRtbCAlXTogWyUgRGF0YS5NZXNzYWdlVGV4dCB8IGh0bWwgJV08L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRNZXNzYWdlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW1Db3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQ0hBVElURU0gaWYgJEl0ZW1Db3VudGVyID09IDM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntOYW1lfSAmJiAkSXRlbS0+e05hbWV9ID1+IG0vXiUlL3ggKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntOYW1lfSA9fiBzL14lJS8veGc7CiAgICAgICAgICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUveCwgJEl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TmFtZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlc3sgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQFZhbHVlcywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TmFtZX0gPX4gcy9cJXMvL3hnOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBJRHMKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChcZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cKS8veGc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbWFrZSB0aGUgaGlzdG9yeSB0eXBlIG1vcmUgcmVhZGFibGUgKGlmIGFwcGxpY2FibGUpCiAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGVSZWFkYWJsZX0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9LT57ICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gfHwgJEl0ZW0tPntIaXN0b3J5VHlwZX07CgogICAgICAgICAgICAjIGdyb3VwIGl0ZW1zIHdoaWNoIGhhcHBlbmVkIChuZWFybHkpIGNvaW5jaWRlbnRseSB0b2dldGhlcgogICAgICAgICAgICAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEl0ZW0tPntDcmVhdGVUaW1lfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIHR3byBldmVudHMgdGhhdCBoYXBwZW5lZCAnbmVhcmx5JyB0aGUgc2FtZSB0aW1lLCB0cmVhdAogICAgICAgICAgICAjIHRoZW0gYXMgaWYgdGhleSBoYXBwZW5lZCBleGFjdGx5IG9uIHRoZSBzYW1lIHRpbWUgKHRyZXNob2xkIDUgc2Vjb25kcykKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lCiAgICAgICAgICAgICAgICAmJiAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9IDw9ICRMYXN0Q3JlYXRlU3lzdGVtVGltZQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfSA+PSAoICRMYXN0Q3JlYXRlU3lzdGVtVGltZSAtIDUgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7JExhc3RDcmVhdGVUaW1lfSB9LCAkSXRlbTsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3JlYXRlVGltZX0gPSAkTGFzdENyZWF0ZVRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7ICRJdGVtLT57Q3JlYXRlVGltZX0gfSB9LCAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExhc3RDcmVhdGVUaW1lICAgICAgID0gJEl0ZW0tPntDcmVhdGVUaW1lfTsKICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lID0gJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfTsKICAgICAgICB9CgogICAgICAgIG15ICRTb3J0QnlBcnRpY2xlID0gc3ViIHsKCiAgICAgICAgICAgIG15ICRJc0EgPSBncmVwIHsgJF8gZXEgJGEtPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgIG15ICRJc0IgPSBncmVwIHsgJF8gZXEgJGItPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgICRJc0IgY21wICRJc0E7CiAgICAgICAgfTsKCiAgICAgICAgIyBzb3J0IGhpc3RvcnkgaXRlbXMgYmFzZWQgb24gaXRlbXMgd2l0aCBhcnRpY2xlcwogICAgICAgICMgdGhlc2UgaXRlbXMgc2hvdWxkIGFsd2F5cyBiZSBvbiB0b3Agb2YgYSBsaXN0IG9mIGNvbm5lY3RlZCBpdGVtcwogICAgICAgICRJdGVtQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRJdGVtICggcmV2ZXJzZSBzb3J0IGtleXMgJUhpc3RvcnlJdGVtcyApIHsKCiAgICAgICAgICAgIGZvciBteSAkU3ViSXRlbSAoIHNvcnQgJFNvcnRCeUFydGljbGUgQHsgJEhpc3RvcnlJdGVtc3skSXRlbX0gfSApIHsKICAgICAgICAgICAgICAgICRTdWJJdGVtLT57Q291bnRlcn0gPSAkSXRlbUNvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkU3ViSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc1JpZ2h0ICkgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ1JpZ2h0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ0xlZnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SXRlbXN9IH0sICRTdWJJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaHJvbmljYWxWaWV3JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMganVtcCB0byBzZWxlY3RlZCBhcnRpY2xlCiAgICAgICAgaWYgKCAkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTaG93U2VsZWN0ZWRBcnRpY2xlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgYWN0aW9uIG1lbnUgZm9yIGFsbCBhcnRpY2xlcwogICAgICAgIGZvciBteSAkQXJ0aWNsZUlEICggc29ydCBrZXlzICV7JEFydGljbGVzQnlBcnRpY2xlSUR9ICkgewoKICAgICAgICAgICAgbXkgQE1lbnVJdGVtcyA9ICRTZWxmLT5fQXJ0aWNsZU1lbnUoCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0fSwKICAgICAgICAgICAgICAgIEFjbEFjdGlvbiAgICAgICAgID0+ICRQYXJhbXtBY2xBY3Rpb259LAogICAgICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gJEFydGljbGVzQnlBcnRpY2xlSUQtPnskQXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30sCiAgICAgICAgICAgICAgICBTdGFuZGFyZEZvcndhcmRzICA9PiAkUGFyYW17U3RhbmRhcmRGb3J3YXJkc30sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnU3RhdGljJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaHJvbmljYWxWaWV3VGlja2V0QWN0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW1zID0+IFxATWVudUl0ZW1zLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBhdHRhY2htZW50cyBib3gKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnskQXJ0aWNsZUlEfS0+e0F0bXN9ICkgKSB7CgogICAgICAgICAgICAgICAgbXkgJEFydGljbGVBdHRhY2htZW50cyA9ICRTZWxmLT5fQ29sbGVjdEFydGljbGVBdHRhY2htZW50cygKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+ICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57JEFydGljbGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hyb25pY2FsVmlld0FydGljbGVBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+ICRBcnRpY2xlQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICk7Cn0KCnN1YiBfVGlja2V0SXRlbVNlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAQXJ0aWNsZUlEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUluZGV4KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwoKICAgIGZvciBteSAkQXJ0aWNsZUlEIChAQXJ0aWNsZUlEcykgewogICAgICAgICRTZWxmLT5fQXJ0aWNsZUl0ZW1TZWVuKAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FydGljbGVJdGVtU2VlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdTZXQoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnU2VlbicsCiAgICAgICAgVmFsdWUgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXJ0aWNsZUl0ZW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGlja2V0ICAgID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVBcnRpY2xlICAgPSAleyAkUGFyYW17QXJ0aWNsZX0gfTsKICAgIG15ICVBY2xBY3Rpb24gPSAleyAkUGFyYW17QWNsQWN0aW9ufSB9OwoKICAgICMgY2xlYW51cCBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICBTaXplICAgICAgICAgPT4gMCwKICAgICk7CgogICAgIyBzaG93IGFydGljbGUgYWN0aW9ucwogICAgbXkgQE1lbnVJdGVtcyA9ICRTZWxmLT5fQXJ0aWNsZU1lbnUoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FydGljbGVJdGVtJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwgTWVudUl0ZW1zID0+IFxATWVudUl0ZW1zIH0sCiAgICApOwoKICAgICMgc2hvdyBjcmVhdGVkIGJ5IGlmIGRpZmZlcmVudCBmcm9tIFVzZXIgSUQgMQogICAgaWYgKCAkQXJ0aWNsZXtDcmVhdGVkQnl9ID4gMSApIHsKICAgICAgICAkQXJ0aWNsZXtDcmVhdGVkQnlVc2VyfSA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJOYW1lKCBVc2VySUQgPT4gJEFydGljbGV7Q3JlYXRlZEJ5fSApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVDcmVhdGVkQnknLAogICAgICAgICAgICBEYXRhID0+IHslQXJ0aWNsZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFsd2F5cyBzaG93IGFyY2hpdmVkIHRpY2tldHMgYXMgc2VlbgogICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CgogICAgICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSBlcSAnT25Mb2FkJyApIHsKICAgICAgICAgICAgJFNlbGYtPl9BcnRpY2xlSXRlbVNlZW4oIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJFNlbGYtPntab29tRXhwYW5kfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17QWN0dWFsQXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdHVhbEFydGljbGVJRH0gPT0gJEFydGljbGV7QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVJdGVtTWFya0FzU2VlbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkbyBzb21lIHN0cmlwcyAmJiBxdW90aW5nCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoRnJvbSBUbyBDYykpIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJEFydGljbGV7JEtleX07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93UmVjaXBpZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEFydGljbGV7JEtleX0sCiAgICAgICAgICAgICAgICBSZWFsbmFtZSA9PiAkQXJ0aWNsZXsgJEtleSAuICdSZWFsbmFtZScgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Wm9vbVRpbWVEaXNwbGF5JykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQXJ0aWNsZVRpbWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUFjY291bnRlZFRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgYXJ0aWNsZSBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgJyc7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPgogICAgICAgICAgICAgICAgR2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEeW5hbWljRmllbGRzWm9vbU1heFNpemVBcnRpY2xlJykKICAgICAgICAgICAgICAgIHx8IDE2MCwgICAgIyBsaW1pdCBmb3IgYXJ0aWNsZSBkaXNwbGF5CiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBlbGVtZW50CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlVGlja2V0LAoKICAgICAgICAgICAgICAgICAgICAjIGFsaWFzIGZvciB0aWNrZXQgdGl0bGUsIFRpdGxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaXRsZSAgICAgICAgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dHB1dCBub24gbGluayBlbGVtZW50CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGVsZW1lbnQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgICAgICAgICAgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgbm9uIGxpbmsgZWxlbWVudAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSB2aWV3IG1vZHVsZXMKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVZpZXdNb2R1bGUnKTsKICAgIGlmICggcmVmICRDb25maWcgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXskQ29uZmlnfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjayggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVUaWNrZXQsIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnTm90aWNlJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkV2FybmluZyAoIEB7ICREYXRhUmVmLT57V2FybmluZ3N9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFdhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVUaWNrZXQsIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCgKICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgKTsKCiAgICAjIGdldCBhdHRhY2htZW50IGluZGV4ICh3aXRob3V0IGF0dGFjaG1lbnRzKQogICAgbXkgJUF0bUluZGV4ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gJFNlbGYtPntTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudH0sCiAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgICAgICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkQXJ0aWNsZXtBdG1zfSA9IFwlQXRtSW5kZXg7CgogICAgIyBhZGQgYmxvY2sgZm9yIGF0dGFjaG1lbnRzCiAgICBpZiAoICRBcnRpY2xle0F0bXN9ICYmICV7ICRBcnRpY2xle0F0bXN9IH0gKSB7CiAgICAgICAgbXkgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQXR0YWNobWVudE1vZHVsZScpOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUZpbGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBhcnRpY2xlIGF0dGFjaG1lbnQgbW9kdWxlcwogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgcmVmICRDb25maWcgbmUgJ0hBU0gnOwogICAgICAgICAgICBteSAlSm9icyA9ICV7JENvbmZpZ307CiAgICAgICAgICAgIEpPQjoKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgRmlsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEZpbGVJRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgZmlsZXNpemUKICAgICAgICAgICAgICAgIGlmICggJEpvYiBlcSAnMi1IVE1MLVZpZXdlcicgJiYgISVEYXRhICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0RhdGFGaWxlU2l6ZX0gPSAiLCAiIC4gJEZpbGV7RmlsZXNpemV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkSm9iIGVxICcyLUhUTUwtVmlld2VyJyAmJiAlRGF0YSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtEYXRhRmlsZVNpemV9ID0gIiwgIiAuICREYXRhe0ZpbGVzaXplfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRGF0YXtCbG9ja30gfHwgJ0FydGljbGVBdHRhY2htZW50Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFNwZWNpYWwgdHJlYXRtZW50IGZvciBjaGF0IGFydGljbGVzCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgfHwgJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJyApIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQm9keUNoYXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlcyA9PiAkU2VsZi0+e0pTT05PYmplY3R9LT5EZWNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBzaG93IGJvZHkgYXMgaHRtbCBvciBwbGFpbiB0ZXh0CiAgICBteSAkVmlld01vZGUgPSAnQm9keUhUTUwnOwoKICAgICMgaW4gY2FzZSBzaG93IHBsYWluIGFydGljbGUgYm9keSAoaWYgbm8gaHRtbCBib2R5IGFzIGF0dGFjaG1lbnQgZXhpc3RzIG9mIGlmIHJpY2gKICAgICMgdGV4dCBpcyBub3QgZW5hYmxlZCkKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9IHx8ICEkQXJ0aWNsZXtBdHRhY2htZW50SURPZkhUTUxCb2R5fSApIHsKICAgICAgICAkVmlld01vZGUgPSAnQm9keVBsYWluJzsKCiAgICAgICAgIyByZW1lbWJlciBwbGFpbiBib2R5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgQXJ0aWNsZVZpZXdNb2R1bGVzCiAgICAgICAgJEFydGljbGV7Qm9keVBsYWlufSA9ICRBcnRpY2xle0JvZHl9OwoKICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlY3VyaXR5PSJyZXN0cmljdGVkIiBtYXkgYnJlYWsgU1NPIC0gZGlzYWJsZSB0aGlzIGZlYXR1cmUgaWYgcmVxdWVzdGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEaXNhYmxlTVNJRnJhbWVTZWN1cml0eVJlc3RyaWN0ZWQnKSApIHsKICAgICAgICAkQXJ0aWNsZXtNU1NlY3VyaXR5UmVzdHJpY3RlZH0gPSAnJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRBcnRpY2xle01TU2VjdXJpdHlSZXN0cmljdGVkfSA9ICdzZWN1cml0eT0icmVzdHJpY3RlZCInOwogICAgfQoKICAgICMgc2hvdyBib2R5CiAgICAjIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhbiBhbm9ueW1vdXMgY29weSBvZiAlQXJ0aWNsZSBhbmQgcGFzcyBpdCB0bwogICAgIyB0aGUgTGF5b3V0T2JqZWN0LCBiZWNhdXNlICVBcnRpY2xlIG1heSBiZSBtb2RpZmllZCBhZnRlcndhcmRzLgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRWaWV3TW9kZSwKICAgICAgICBEYXRhID0+IHslQXJ0aWNsZX0sCiAgICApOwoKICAgICMgcmVzdG9yZSBwbGFpbiBib2R5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgQXJ0aWNsZVZpZXdNb2R1bGVzCiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSB8fCAhJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkQXJ0aWNsZXtCb2R5UGxhaW59OwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FydGljbGVNZW51IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUaWNrZXQgICAgPSAleyAkUGFyYW17VGlja2V0fSB9OwogICAgbXkgJUFydGljbGUgICA9ICV7ICRQYXJhbXtBcnRpY2xlfSB9OwogICAgbXkgJUFjbEFjdGlvbiA9ICV7ICRQYXJhbXtBY2xBY3Rpb259IH07CgogICAgbXkgQE1lbnVJdGVtczsKCiAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICMgc2VsZWN0IHRoZSBvdXRwdXQgdGVtcGxhdGUKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICF+IC9eKG5vdGV8ZW1haWwtbm90aXxjaGF0KS9pICkgewoKICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgICAgICYmICggJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldENvbXBvc2V9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlJyk7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJExvY2tlZCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAgICAgICAgICMgZ2V0IFN0YW5kYXJkUmVzcG9uc2VzU3RyZwogICAgICAgICAgICAgICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzfSB8fCB7fSB9OwoKICAgICAgICAgICAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZUhhc2ggYmVjYXVzZSB3ZSBuZWVkIHRvIHNvcnQgYnkgVmFsdWVzCiAgICAgICAgICAgICAgIyBmcm9tICVSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2ggd2UgZ2V0IHZhbHVlIG9mIEtleSBieSAlU3RhbmRhcmRSZXNwb25zZUhhc2ggVmFsdWUKICAgICAgICAgICAgICAjIGFuZCBAU3RhbmRhcmRSZXNwb25zZUFycmF5IGlzIGNyZWF0ZWQgYXMgYXJyYXkgb2YgaGFzaGVzIHdpdGggZWxlbWVudHMgS2V5IGFuZCBWYWx1ZQoKICAgICAgICAgICAgICAgIG15ICVSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2ggPSByZXZlcnNlICVTdGFuZGFyZFJlc3BvbnNlSGFzaDsKICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkgICAgICAgPSBtYXAgewogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaHskX30sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBzb3J0IHZhbHVlcyAlU3RhbmRhcmRSZXNwb25zZUhhc2g7CgogICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXBseScpIC4gJyAtJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgaHRtbCBzdHJpbmcKICAgICAgICAgICAgICAgIG15ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseScgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXBseSBhbGwgaXMgbmVlZGVkCiAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50cyA9ICcnOwogICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xleyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkQXJ0aWNsZXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkRW1haWxQYXJzZXIgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgPT4gJ1N0YW5kYWxvbmUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgICAgICAgICAgICAgIEFERFJFU1M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgISRFbWFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRJc0xvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRSZWNpcGllbnRDb3VudCA+IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzfS0+ezB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXBseSBBbGwnKSAuICcgLSc7CgogICAgICAgICAgICAgICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgICAgICBEcm9wZG93blR5cGUgICAgICAgICAgPT4gJ1JlcGx5JywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHkgQWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnIC4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJREFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBmb3J3YXJkIGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgIyAob25seSBzaG93IGZvcndhcmQgb24gZW1haWwtZXh0ZXJuYWwsIGVtYWlsLWludGVybmFsLCBwaG9uZSwgd2VicmVxdWVzdCBhbmQgZmF4CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRGb3J3YXJkfQogICAgICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRGb3J3YXJkfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Rm9yd2FyZH0gKQogICAgICAgICAgICAmJiAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gL14oZW1haWwtZXh0ZXJuYWx8ZW1haWwtaW50ZXJuYWx8cGhvbmV8d2VicmVxdWVzdHxmYXgpJC9pCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Rm9yd2FyZCcpOwogICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0gKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17U3RhbmRhcmRGb3J3YXJkc30gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgU3RhbmRhcmRGb3J3YXJkc1N0cmcKICAgICAgICAgICAgICAgICAgICBteSAlU3RhbmRhcmRGb3J3YXJkSGFzaCA9ICV7ICRQYXJhbXtTdGFuZGFyZEZvcndhcmRzfSB9OwoKICAgICAgICAgICAgICAgIyBnZXQgcmV2ZXJzIEBTdGFuZGFyZEZvcndhcmRIYXNoIGJlY2F1c2Ugd2UgbmVlZCB0byBzb3J0IGJ5IFZhbHVlcwogICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyRm9yd2FyZCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZEZvcndhcmRIYXNoIFZhbHVlCiAgICAgICAgICAgICAgICMgYW5kIEBTdGFuZGFyZEZvcndhcmRBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKICAgICAgICAgICAgICAgICAgICBteSAlUmV2ZXJzZVN0YW5kYXJGb3J3YXJkID0gcmV2ZXJzZSAlU3RhbmRhcmRGb3J3YXJkSGFzaDsKICAgICAgICAgICAgICAgICAgICBteSBAU3RhbmRhcmRGb3J3YXJkQXJyYXkgID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJldmVyc2VTdGFuZGFyRm9yd2FyZHskX30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBzb3J0IHZhbHVlcyAlU3RhbmRhcmRGb3J3YXJkSGFzaDsKCiAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkRm9yd2FyZEFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRm9yd2FyZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYnVpbGQgaHRtbCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICBteSAkU3RhbmRhcmRGb3J3YXJkc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdGb3J3YXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQFN0YW5kYXJkRm9yd2FyZEFycmF5LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgICAgICBEcm9wZG93blR5cGUgICAgICAgICA9PiAnRm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHNTdHJnID0+ICRTdGFuZGFyZEZvcndhcmRzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgPT4gJ0ZvcndhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Rm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgID0+ICdGb3J3YXJkJyAuICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcndhcmRFbGVtZW50SUQgICAgID0+ICdGb3J3YXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBNZW51SXRlbXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRm9yd2FyZCBhcnRpY2xlIHZpYSBtYWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ZvcndhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudFRpY2tldEZvcndhcmQ7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0iCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBib3VuY2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAjIChvbmx5IHNob3cgZm9yd2FyZCBvbiBlbWFpbC1leHRlcm5hbCBhbmQgZW1haWwtaW50ZXJuYWwKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEJvdW5jZX0KICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSApCiAgICAgICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvXihlbWFpbC1leHRlcm5hbHxlbWFpbC1pbnRlcm5hbCkkL2kKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRCb3VuY2UnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9ICkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdCb3VuY2UgQXJ0aWNsZSB0byBhIGRpZmZlcmVudCBtYWlsIGFkZHJlc3MnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdCb3VuY2UnLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudFRpY2tldEJvdW5jZTtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfSIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBzcGxpdCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lfQogICAgICAgICYmICggJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldFBob25lfSApCiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ICF+IC9eKGNoYXQtZXh0ZXJuYWx8Y2hhdC1pbnRlcm5hbCkkL2kKICAgICAgICApCiAgICB7CgogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTcGxpdCB0aGlzIGFydGljbGUnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU3BsaXQnLAogICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0UGhvbmU7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH07TGlua1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9IgogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBwcmludCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFByaW50fQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFByaW50fSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UHJpbnR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRPSykgewoKICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUHJpbnQgdGhpcyBhcnRpY2xlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmludCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0UHJpbnQ7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0iCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGxhaW4gbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQbGFpbn0KICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGxhaW5WaWV3JykKICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQbGFpbn0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBsYWlufSApCiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9lbWFpbC9pCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkT0spIHsKCiAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1ZpZXcgdGhlIHNvdXJjZSBmb3IgdGhpcyBBcnRpY2xlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQbGFpbiBGb3JtYXQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudFRpY2tldFBsYWluO1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7T3duZXJJRH0KICAgICAgICB8fCAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAgICAgJiYgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7UmVzcG9uc2libGVJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICBteSAlQXJ0aWNsZUZsYWdzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRBcnRpY2xlSXNJbXBvcnRhbnQgPSAkQXJ0aWNsZUZsYWdze0ltcG9ydGFudH07CgogICAgICAgIG15ICRMaW5rCiAgICAgICAgICAgID0gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207U3ViYWN0aW9uPU1hcmtBc0ltcG9ydGFudDtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfSI7CiAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJ01hcmsnOwogICAgICAgIGlmICgkQXJ0aWNsZUlzSW1wb3J0YW50KSB7CiAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICdVbm1hcmsnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW1wb3J0YW50IG1lbnUgaXRlbQogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgaW50ZXJuYWwgcmVwbHkgbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXROb3RlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldE5vdGV9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXROb3RlfSApCiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9ebm90ZS0oaW50ZXJuYWx8ZXh0ZXJuYWwpJC9pCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkTGluawogICAgICAgICAgICA9ICJBY3Rpb249QWdlbnRUaWNrZXROb3RlO1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O1JlcGx5VG9BcnRpY2xlPSRBcnRpY2xle0FydGljbGVJRH0iOwogICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICdSZXBseSB0byBub3RlJzsKCiAgICAgICAgIyBzZXQgaW1wb3J0YW50IG1lbnUgaXRlbQogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQE1lbnVJdGVtczsKfQoKc3ViIF9Db2xsZWN0QXJ0aWNsZUF0dGFjaG1lbnRzIHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBcnRpY2xlID0gJXsgJFBhcmFte0FydGljbGV9IH07CgogICAgbXkgJUF0dGFjaG1lbnRzOwoKICAgICMgZG93bmxvYWQgdHlwZQogICAgbXkgJFR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKCiAgICAkQXJ0aWNsZXtBdG1Db3VudH0gPSBzY2FsYXIga2V5cyAleyAkQXJ0aWNsZXtBdG1zfSAvLyB7fSB9OwoKICAgICMgaWYgYXR0YWNobWVudCB3aWxsIGJlIGZvcmNlZCB0byBkb3dubG9hZCwgZG9uJ3Qgb3BlbiBhIG5ldyBkb3dubG9hZCB3aW5kb3chCiAgICBteSAkVGFyZ2V0ID0gJ3RhcmdldD0iQXR0YWNobWVudFdpbmRvdyIgJzsKICAgIGlmICggJFR5cGUgPX4gL2lubGluZS9pICkgewogICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgfQoKICAgICRBdHRhY2htZW50c3tab29tQXR0YWNobWVudERpc3BsYXlDb3VudH0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50Jyk7CgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICV7ICRBcnRpY2xle0F0bXN9IH0gKSB7CiAgICAgICAgcHVzaCBAeyAkQXR0YWNobWVudHN7RmlsZXN9IH0sIHsKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JEZpbGVJRH0gfSwKICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQsCiAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlQXR0YWNobWVudHM7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCB0aGUgY29uZmlndXJhdGlvbiB0byBjaGVjayBmb3IgcHJpbnRhYmxlIG9iamVjdHMKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20iKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFByaW50IiktPntEeW5hbWljRmllbGR9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkUXVldWVJRDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQogICAgJFF1ZXVlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAojIC0tLQogICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBzZXQgY3JpdGljYWxpdHkgYW5kIGltcGFjdAogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICctJzsKICAgICRUaWNrZXR7SW1wYWN0fSAgICAgID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCiAgICBteSBAQ3VzdG9tZXJBcnRpY2xlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggVHlwZSA9PiAnQ3VzdG9tZXInICk7CiAgICBteSBAQXJ0aWNsZUJveCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNvbnRlbnRJbmRleCgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlVHlwZSAgICAgICAgICAgICAgICA9PiBcQEN1c3RvbWVyQXJ0aWNsZVR5cGVzLAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVGlja2V0e0N1c3RvbWVySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gc29tZSBodG1sIHF1b3RpbmcKICAgICRUaWNrZXR7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoIEFnZSA9PiAkVGlja2V0e0FnZX0sIFNwYWNlID0+ICcgJyApOwogICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICctJzsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICRQcmludGVkQnkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgncHJpbnRlZCBieScpOwogICAgICAgIG15ICRUaW1lICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntUaW1lfTsKICAgICAgICBteSAlUGFnZTsKCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgbXkgJEhlYWRlclJpZ2h0ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSApIHsKICAgICAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gPSAkSGVhZGxpbmVMZWZ0OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9CiAgICAgICAgICAgID0gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRUaW1lOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJyc7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgdHlwZSBvZiBwcmludCB0YWcKICAgICAgICBteSAkUHJpbnRUYWcgPSAnJzsKCiAgICAgICAgJFByaW50VGFnID0gKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGlja2V0JykgKSAuICcgJyAuCiAgICAgICAgICAgICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ByaW50JykgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRQcmludFRhZywKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gOSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkJywKICAgICAgICAgICAgQWxpZ24gICAgPT4gJ3JpZ2h0JywKICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0SW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcygKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dEN1c3RvbWVySW5mb3MoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXJ0aWNsZXMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEFydGljbGVzKAogICAgICAgICAgICBQYWdlRGF0YSAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIEFydGljbGVEYXRhID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJ1RpY2tldF8nIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwogICAgICAgIG15ICRQREZTdHJpbmcgPSAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vcGRmIiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIE1heCAgPT4gMTAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpY2tldAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9IVE1MTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQXJ0aWNsZUJveCA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0SW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gW107CgogICAgIyBhZGQgdGlja2V0IGRhdGEsIHJlc3BlY3RpbmcgQXR0cmlidXRlc1ZpZXcgY29uZmlndXJhdGlvbgojIC0tLQojIElUU00KIyAtLS0KIyAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoU3RhdGUgUHJpb3JpdHkgUXVldWUgT3duZXIpKSB7CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoU3RhdGUgUXVldWUgT3duZXIpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRBdHRyaWJ1dGUpIC4gJzonLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaWNrZXR7JEF0dHJpYnV0ZX0gKQogICAgICAgICAgICAgICAgICAgIHx8ICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdGlja2V0IHJlc3BvbnNpYmxlCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICYmCiAgICAgICAgJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57UmVzcG9uc2libGV9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXNwb25zaWJsZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCB0eXBlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntUeXBlfSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVHlwZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1R5cGV9LAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHNlcnZpY2Ugcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntTZXJ2aWNlfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgIH0KCiAgICAjIGFkZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NMQX0gKQogICAgewogICAgICAgIG15ICRSb3dTTEEgPSB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U0xBfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U0xBICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgJFRhYmxlTGVmdEV4dGVuZGVkID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcml0aWNhbGl0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e0NyaXRpY2FsaXR5fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW1wYWN0JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7SW1wYWN0fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJpb3JpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtQcmlvcml0eX0pLAogICAgICAgIH0sCiAgICBdOwogICAgcHVzaCBAeyRUYWJsZUxlZnR9LCBAeyRUYWJsZUxlZnRFeHRlbmRlZH07CiMgLS0tCgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbWVySUQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FnZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFRpY2tldHtBZ2V9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7Q3JlYXRlZH0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJE5lZWRlZCEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ID0gMDsKICAgIG15ICVUaWNrZXQgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVQYWdlICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGR5bmFtaWMgZmllbGQgaWYgaXMgbm90IGRlc2luZ2VkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgJFJvdysrOwogICAgICAgICRPdXRwdXQgPSAxOwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGlja2V0IER5bmFtaWMgRmllbGRzJyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBDdXN0b21lckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lciBJbmZvcm1hdGlvbicpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEFydGljbGVEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRBcnRpY2xlQ291bnRlciA9IDE7CiAgICBmb3IgbXkgJEFydGljbGVUbXAgKCBAeyAkUGFyYW17QXJ0aWNsZURhdGF9IH0gKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUNvdW50ZXIgPT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXJ0aWNsZXMnKSwKICAgICAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgbXkgJEF0dGFjaG1lbnRzOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEF0dGFjaG1lbnRzIC49ICRGaWxle0ZpbGVuYW1lfSAuICcgKCcgLiAkRmlsZXtGaWxlc2l6ZX0gLiAiKVxuIjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXJ0aWNsZSBpbmZvIHRhYmxlCiAgICAgICAgbXkgJVRhYmxlUGFyYW0xOwogICAgICAgIG15ICRSb3cgPSAwOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIGFydGljbGUgbnVtYmVyIHRhZwogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJyAgICAjICcgLiAkQXJ0aWNsZUNvdW50ZXIsCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkUGFyYW1ldGVyKSAuICc6JzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7JFBhcmFtZXRlcn07CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAkQXJ0aWNsZXtDcmVhdGVkfSwKICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICApLAogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdieScpOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBcnRpY2xle1NlbmRlclR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgdGFibGUKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBza2lwIHRoZSBkeW5hbWljIGZpZWxkIGlmIGlzIG5vdCBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICRWYWx1ZSBlcSAiIjsKCiAgICAgICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAgICAgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVmFsdWVTdHJnLT57VmFsdWV9OwogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgfQoKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICBpZiAoJEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0F0dGFjaG1lbnQnKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgY2hvbXAoJEF0dGFjaG1lbnRzKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBdHRhY2htZW50czsKICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGluZm9zKQogICAgICAgICRUYWJsZVBhcmFtMXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbTF7QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgaW5mb3MpCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbTEgPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbTEsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTF7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnIHx8ICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcgKQogICAgICAgIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRMaW5lczsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRBcnRpY2xle0JvZHl9ICkgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmUgKCBAeyAkQXJ0aWNsZXtCb2R5fSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJExpbmUtPntTeXN0ZW1HZW5lcmF0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGluZXMgLj0gJ1snIC4gJExpbmUtPntDcmVhdGVUaW1lfSAuICddICcgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTGluZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICdbJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e0NyZWF0ZVRpbWV9IC4gJ10gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e0NoYXR0ZXJOYW1lfSAuICcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJExpbmVzOwogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA4OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA4OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0yID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0yLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0ye1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEFydGljbGVDb3VudGVyKys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVE1MTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3V0cHV0IHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1N0YXRlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0UHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgcXVldWUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57UXVldWV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFF1ZXVlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHR5cGUsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2aWNlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntTZXJ2aWNlfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzbGEsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57U0xBfSApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTTEEgPT4gJFBhcmFte1NMQX0gfHwgJy0nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgb3duZXIKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57T3duZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE93bmVyJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHJlc3BvbnNpYmxlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgIyBmbGFnIHRvIGNvbnRyb2wgdGhlIGhlYWRlciBwcmludAogICAgbXkgJEhlYWRlckZsYWcgPSAwOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgc2tpcCB0aGUgZHluYW1pYyBmaWVsZCBpZiBpcyBub3QgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MT3V0cHV0ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgaGVhZGVyIG9ubHkgb25jZQogICAgICAgIGlmICggISRIZWFkZXJGbGFnICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkSGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRIZWFkZXJGbGFnID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSBAQXJ0aWNsZUJveCA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfSA9ICcnOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWxle0ZpbGVuYW1lfSApOwogICAgICAgICAgICBteSAkRG93bmxvYWRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkRvd25sb2FkIik7CiAgICAgICAgICAgICRQYXJhbXsnQXJ0aWNsZTo6QVRNJ30KICAgICAgICAgICAgICAgIC49ICc8YSBocmVmPSInCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgLiAnQWN0aW9uPUN1c3RvbWVyVGlja2V0QXR0YWNobWVudDsnCiAgICAgICAgICAgICAgICAuICJBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfTtGaWxlSUQ9JEZpbGVJRFwiIHRhcmdldD1cImF0dGFjaG1lbnRcIiAiCiAgICAgICAgICAgICAgICAuICJ0aXRsZT1cIiREb3dubG9hZFRleHQ6ICRGaWxle0ZpbGVuYW1lfVwiPiIKICAgICAgICAgICAgICAgIC4gIiRGaWxle0ZpbGVuYW1lfTwvYT4gJEZpbGV7RmlsZXNpemV9PGJyLz4iOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDaGF0TWVzc2FnZXN9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXJ0aWNsZXtCb2R5fQogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZXtJc0NoYXR9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3QgYSBvbmx5IGh0bWwgZW1haWwKICAgICAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gICA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFZNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBzb21lIHN0cmlwcyAmJiBxdW90aW5nCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7JFBhcmFtZXRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdFR5cGUgID0+IFsnQXJ0aWNsZSddLAogICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGUgZHluYW1pYyBmaWVsZCBpZiBpcyBub3QgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAgICAgIyAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAjICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgIyAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEFBQUlUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnR0IC0gJFRleHQgdmFyaWFibGUgZmlsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgQ29tbW9uClslIFRyYW5zbGF0ZSgiQWRkIGRlY2lzaW9uIHRvIHRpY2tldCIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkRlY2lzaW9uIERhdGUiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJEZWNpc2lvbiBSZXN1bHQiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJEdWUgRGF0ZSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJlYXNvbiIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJlY292ZXJ5IFN0YXJ0IFRpbWUiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJSZXBhaXIgU3RhcnQgVGltZSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJldmlldyBSZXF1aXJlZCIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoImNsb3NlZCB3aXRoIHdvcmthcm91bmQiKSB8IGh0bWwgJV0K
IyAtLQojIEFnZW50VGlja2V0QWN0aW9uQ29tbW9uLnR0IC0gcHJvdmlkZXMgY29tbW9uIEhUTUwgZm9ybSBmb3Igc2V2ZXJhbCBtYXNrcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEFjdGlvbkNvbW1vbi50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvcGVydGllcyIpICVdCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IkNvbXBvc2UiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXBseVRvQXJ0aWNsZSIgdmFsdWU9IlslIERhdGEuUmVwbHlUb0FydGljbGUgfCBodG1sICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIGlkPSJFeHBhbmQiIHZhbHVlPSIiLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgojIC0tLQojIElUU00KIyAtLS0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJJbXBhY3RSQyIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUHJpb3JpdHlSQyIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRGcmVlVGV4dCIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIEZyZWUgVGV4dCBvZiBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldEZyZWVUZXh0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRPd25lciIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIE93bmVyIG9mIFRpY2tldCIpIHwgaHRtbCAlXToKWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0T3duZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldENsb3NlIikgJV0KWyUgVHJhbnNsYXRlKCJDbG9zZSBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldENsb3NlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXROb3RlIikgJV0KWyUgVHJhbnNsYXRlKCJBZGQgTm90ZSB0byBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldE5vdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFBlbmRpbmciKSAlXQpbJSBUcmFuc2xhdGUoIlNldCBQZW5kaW5nIikgfCBodG1sICVdOgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXRQZW5kaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRQcmlvcml0eSIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIFByaW9yaXR5IG9mIFRpY2tldCIpIHwgaHRtbCAlXToKWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0UHJpb3JpdHkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFJlc3BvbnNpYmxlIikgJV0KWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUmVzcG9uc2libGUgb2YgVGlja2V0IikgfCBodG1sICVdOgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXRSZXNwb25zaWJsZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldERlY2lzaW9uIikgJV0KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCIpIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXREZWNpc2lvbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQiKSAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0IikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIikgJV0KIyAtLS0KWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gLSBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICA8L2gxPgogICAgICAgICAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEJhY2siKSAlXQogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIHdpbmRvdyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QmFjayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb3BlcnRpZXNMb2NrIikgJV0KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoZSB0aWNrZXQgaGFzIGJlZW4gbG9ja2VkIikgfCBodG1sICVdLgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlVuZG9DbG9zZVBvcHVwIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRMb2NrO1N1YmFjdGlvbj1VbmxvY2s7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVW5kbyAmIGNsb3NlIHdpbmRvdyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3A+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9wZXJ0aWVzTG9jayIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiV2lkZ2V0VGlja2V0QWN0aW9ucyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlRpY2tldCBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaXRsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpdGxlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUaXRsZSIgbmFtZT0iVGl0bGUiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuVGl0bGVJbnZhbGlkIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGl0bGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNUeXBlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ1R5cGVJRCcsIFsgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbICdUeXBlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgfSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFRpY2tldElEOiBbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSwKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU2VydmljZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbICdUeXBlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgfSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFRpY2tldElEOiBbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSwKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQU1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNMQUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbICdUeXBlSUQnLCAnU2VydmljZUlEJywgJ05ld093bmVySUQnLCAnT2xkT3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTTEFNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUXVldWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdRdWV1ZUlEIj5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV3UXVldWVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdRdWV1ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05ld1F1ZXVlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdOZXdRdWV1ZUlEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlF1ZXVlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3T3duZXJJRCI+WyUgVHJhbnNsYXRlKCJOZXcgT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciIHRpdGxlPSJTZWxlY3QgbmV3IG93bmVyIiBbJSBEYXRhLml0ZW0oIk5ld093bmVyVHlwZTo6TmV3IikgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3duZXJTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdPd25lcklEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT2xkT3duZXJJRCI+WyUgVHJhbnNsYXRlKCJQcmV2aW91cyBPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgdGl0bGU9IlNlbGVjdCBvbGQgb3duZXIiIFslIERhdGEuaXRlbSgiTmV3T3duZXJUeXBlOjpPbGQiKSAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PbGRPd25lclN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik9sZE93bmVySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCBhIG5ldyBvd25lciEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV3T3duZXJJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ05ld093bmVySUQnLCBbICdUeXBlSUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLlNlbGVjdFJhZGlvQnV0dG9uKCdOZXcnLCdOZXdPd25lclR5cGUnKTsKICAgIH0pOwogICAgJCgnI09sZE93bmVySUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdPbGRPd25lcklEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5TZWxlY3RSYWRpb0J1dHRvbignT2xkJywnTmV3T3duZXJUeXBlJyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXNwb25zaWJsZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UmVzcG9uc2libGVJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1N0YXRlSUQiPlslIFRyYW5zbGF0ZSgiTmV4dCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3U3RhdGVJRCcsIFsnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXRlUGVuZGluZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBlbmRpbmcgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5EYXRlU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlUGVuZGluZyIpICVdClslIFJlbmRlckJsb2NrRW5kKCJTdGF0ZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KIyAtLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdQcmlvcml0eUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UHJpb3JpdHlJRCcsIFsnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV2lkZ2V0VGlja2V0QWN0aW9ucyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXREeW5hbWljRmllbGRzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRHluYW1pYyBGaWVsZHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV2lkZ2V0RHluYW1pY0ZpZWxkcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXRBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBbJSBEYXRhLldpZGdldFN0YXR1cyB8IGh0bWwgJV0iIGlkPSJXaWRnZXRBcnRpY2xlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBZGQgQXJ0aWNsZSIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KWyUgSUYgRGF0YS5XaWRnZXRTdGF0dXMgPT0gJ0V4cGFuZGVkJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNyZWF0ZUFydGljbGUiIG5hbWU9IkNyZWF0ZUFydGljbGUiIHZhbHVlPSIxIiAvPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDcmVhdGVBcnRpY2xlIj5bJSBUcmFuc2xhdGUoIkNyZWF0ZSBhbiBBcnRpY2xlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQ3JlYXRlQXJ0aWNsZSIgbmFtZT0iQ3JlYXRlQXJ0aWNsZSIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN1YmplY3RMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0Ij5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmplY3RMYWJlbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN1YmplY3RMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3ViamVjdExhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlN1YmplY3QiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMgVmFsaWRhdGUgWyUgRGF0YS5TdWJqZWN0SW52YWxpZCAlXSBbJSBEYXRhLlN1YmplY3RSZXF1aXJlZCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPcHRpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zQmVnaW4gLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTcGVsbENoZWNrIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uU3BlbGxDaGVjayI+WyBbJSBUcmFuc2xhdGUoIlNwZWxsIGNoZWNrIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJTcGVsbENoZWNrIikgJV0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zRW5kIC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0T3B0aW9ucyIpICVdCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfTm9UaWNrZXRPcHRpb25zRmFsbGJhY2sgLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU3RhbmRhcmRUZW1wbGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJywgWydSaWNoVGV4dEZpZWxkJ10pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHRMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSaWNoVGV4dCI+WyUgVHJhbnNsYXRlKCJUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dExhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHRMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0TGFiZWxNYW5kYXRvcnkiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RmllbGQiIGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiUmljaFRleHRFZGl0b3IudHQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmljaFRleHQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBWYWxpZGF0ZSBbJSBEYXRhLkJvZHlJbnZhbGlkICVdIFslIERhdGEuQm9keVJlcXVpcmVkICVdIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlNwYWNpbmdMZWZ0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgICQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykudmFsKDEpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0udHJpZ2dlcignc3VibWl0Jyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkZpbGVVcGxvYWQiIGlkPSJGaWxlVXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXJ0aWNsZVR5cGVJRCI+WyUgVHJhbnNsYXRlKCJOb3RlIHR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXJ0aWNsZVR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVUeXBlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0c0xhYmVsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IlslIERhdGEuVGltZVVuaXRzIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1RpbWVVbml0cyBbJSBEYXRhLlRpbWVVbml0c1JlcXVpcmVkIHwgaHRtbCAlXSBbJSBEYXRhLlRpbWVVbml0c0ludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvcm1BZGRpdGlvbmFsQWdlbnRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkluZm9ybVVzZXJJRCI+WyUgVHJhbnNsYXRlKCJJbmZvcm0gQWdlbnQiKSB8IGh0bWwgJV06IChbJSBUcmFuc2xhdGUoIk9wdGlvbmFsIikgfCBodG1sICVdKTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb3JtQWdlbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZvbHZlZEFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikludm9sdmVkVXNlcklEIj5bJSBUcmFuc2xhdGUoIkluZm9ybSBpbnZvbHZlZCBBZ2VudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW52b2x2ZWRBZ2VudFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52b2x2ZWRBZ2VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiBzZWxlY3QgYWRkaXRpb25hbCBhZ2VudHMgd2hpY2ggc2hvdWxkIHJlY2VpdmUgYSBub3RpZmljYXRpb24gcmVnYXJkaW5nIHRoZSBuZXcgYXJ0aWNsZS4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb3JtQWRkaXRpb25hbEFnZW50cyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldpZGdldEFydGljbGUiKSAlXQoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb3BlcnRpZXMiKSAlXQoKI0xheWVycwpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Db25maWcuU2V0KCdMb2NhbGl6YXRpb24uRGVsZXRlJywgJ1slIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdJyk7CiAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Jbml0KCk7CiMgLS0tCiMgSVRTTQojIC0tLQovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlICh0aGlzIHBhcnQgaGVyZSBpcyBpbXBvcnRhbnQgaWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgZHVlIHRvIGUuZy4gYXR0YWNobWVudCB1cGxvYWQpCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFRpY2tldElEOiBbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSwKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGZyZWUgdGV4dCBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgSW5zZXJ0VGVtcGxhdGUoIkFnZW50VGlja2V0QWN0aW9uQ29tbW9uLnR0IikgJV0K
IyAtLQojIEFnZW50VGlja2V0RGVjaXNpb24udHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGRlY2lzaW9uIG1hc2sKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXROb3RlLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBJbnNlcnRUZW1wbGF0ZSgiQWdlbnRUaWNrZXRBY3Rpb25Db21tb24udHQiKSAlXQo=
IyAtLQojIEFnZW50VGlja2V0RW1haWwudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGFnZW50IGVtYWlsCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzM2MDhiNjA2MjU5YWNlNjFmZWRiYjgyZjk0MjczZDZhYmVmYzY5NzIvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0FnZW50VGlja2V0RW1haWwudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudEN1c3RvbWVyU2VhcmNoLnR0IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiI+CgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIE5ldyBFbWFpbCBUaWNrZXQiKSB8IGh0bWwgJV08L2gxPgogICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KCiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lckluZm8iIGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3VzdG9tZXJUYWJsZSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJUYWJsZSIpICVdCiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik5ld0VtYWlsVGlja2V0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIGlkPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgaWQ9Ik93bmVyQWxsIiB2YWx1ZT0iWyUgRGF0YS5Pd25lckFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSJbJSBEYXRhLlJlc3BvbnNpYmxlQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJVc2VyIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWyAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiRnJvbSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gcm9tU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI0Rlc3QnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBTaWduYXR1cmVVUkwgPSAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKHRoaXMpLnZhbCgpOwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ0Rlc3QnLCBbJ1NpZ25hdHVyZScsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgaWYgKCFDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRENvb2tpZScpKSB7CiAgICAgICAgU2lnbmF0dXJlVVJMICs9ICc7JyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKSArICc9JyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbklEJyk7CiAgICB9CiAgICAkKCcjU2lnbmF0dXJlJykuYXR0cignc3JjJywgU2lnbmF0dXJlVVJMKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcuQ3VzdG9tZXJUaWNrZXRSYWRpbycpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ3VzdG9tZXJLZXk7CiAgICAgICAgaWYgKCAkKHRoaXMpLmF0dHIoJ2NoZWNrZWQnKSApewoKICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPSAkKCAnI0N1c3RvbWVyS2V5XycgKyQodGhpcykudmFsKCkgKS52YWwoKTsKICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZWxvYWRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcuQ3VzdG9tZXJUaWNrZXRSZW1vdmUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLlJlbW92ZUN1c3RvbWVyVGlja2V0KCAkKHRoaXMpICk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRnJvbUV4dGVybmFsQ3VzdG9tZXIiKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5BZGRUaWNrZXRDdXN0b21lciggJ1RvQ3VzdG9tZXInLCAiWyUgRGF0YS5FbWFpbCB8IGh0bWwgJV0iLCAiWyUgRGF0YS5DdXN0b21lciB8IGh0bWwgJV0iLCB0cnVlICk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbUV4dGVybmFsQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUb0N1c3RvbWVyIiBjbGFzcz0iTWFuZGF0b3J5Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVG8gY3VzdG9tZXIgdXNlciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJUb0N1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJUb0N1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5Ub0ludmFsaWQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVG9DdXN0b21lclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRvU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgdXNlciBmb3IgdGhlIHRpY2tldC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJUb1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkN1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVUb0N1c3RvbWVyIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXkiIGlkPSJDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUbyBjdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudFRvQ3VzdG9tZXIiIGNsYXNzPSJDdXN0b21lckNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQm94TGFiZWwiPlslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIFslIERhdGEuQ3VzdG9tZXJTZWxlY3RlZCB8IGh0bWwgJV0gIFslIERhdGEuQ3VzdG9tZXJEaXNhYmxlZCB8IGh0bWwgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlclRvQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2NDdXN0b21lciI+WyUgVHJhbnNsYXRlKCJDYyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDY0N1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJDY0N1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5DY0ludmFsaWQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQ2NDdXN0b21lckhpZGRlbkNvbnRhaW5lciB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDdXN0b21lclRpY2tldFRlbXBsYXRlQ2NDdXN0b21lciBTcGFjaW5nVG9wU21hbGwgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDY0N1c3RvbWVyS2V5IiBpZD0iQ2NDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYyIpIHwgaHRtbCAlXSIgbmFtZT0iQ2NDdXN0b21lclRpY2tldFRleHQiIGlkPSJDY0N1c3RvbWVyVGlja2V0VGV4dCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkNjUmVtb3ZlQ3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBDYyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaWNrZXRDdXN0b21lckNvbnRlbnRDY0N1c3RvbWVyIiBjbGFzcz0iQ2NDdXN0b21lckNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQm94TGFiZWwiPlslIFRyYW5zbGF0ZSgiQ2MiKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNjTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDY0N1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBpZD0iQ2NDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIG5hbWU9IkNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIGlkPSJDY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckVsZW1lbnQgfCBodG1sICVdIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkNjUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgQ2MiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NDdXN0b21lckVycm9yRXhwbGFudGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NDdXN0b21lckVycm9yRXhwbGFudGlvbiIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgZmFpbGVkIE1YIGNoZWNrLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0ludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiRE5TIHByb2JsZW0sIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBlcnJvciBsb2cuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjTXVsdGlwbGVDdXN0b21lciIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyIiBpZD0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkJjY0N1c3RvbWVyIj5bJSBUcmFuc2xhdGUoIkJjYyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJCY2NDdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iQmNjQ3VzdG9tZXIiIHZhbHVlPSIiIGNsYXNzPSJDdXN0b21lckF1dG9Db21wbGV0ZSBXNzVwYyBbJSBEYXRhLkJjY0ludmFsaWQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZUJjY0N1c3RvbWVyIFNwYWNpbmdUb3BTbWFsbCBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkJjY0N1c3RvbWVyS2V5IiBpZD0iQmNjQ3VzdG9tZXJLZXkiIGNsYXNzPSJDdXN0b21lcktleSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGV4dCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQmNjIikgfCBodG1sICVdIiBuYW1lPSJCY2NDdXN0b21lclRpY2tldFRleHQiIGlkPSJCY2NDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJCY2NSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIEJjYyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaWNrZXRDdXN0b21lckNvbnRlbnRCY2NDdXN0b21lciIgY2xhc3M9IkJjY0N1c3RvbWVyQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJCb3hMYWJlbCI+WyUgVHJhbnNsYXRlKCJCY2MiKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY011bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQmNjQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJCY2NDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIG5hbWU9IkJjY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQmNjQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iQmNjUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgQmNjIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRXhwbGFuYXRpb24gRXJyb3IiPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHJlbW92ZSB0aGlzIGVudHJ5IGFuZCBlbnRlciBhIG5ldyBvbmUgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZS4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NDdXN0b21lckVycm9yRXhwbGFudGlvbiIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkJjY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgZmFpbGVkIE1YIGNoZWNrLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjSW52YWxpZEROU1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJETlMgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGVycm9yIGxvZy4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoZSBzeW50YXggb2YgdGhpcyBlbWFpbCBhZGRyZXNzIGlzIGluY29ycmVjdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NNdWx0aXBsZUN1c3RvbWVyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyQ291bnRlciB8IGh0bWwgJV0iLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkN1c3RvbWVySUQiPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkN1c3RvbWVySUQiIGlkPSJDdXN0b21lcklEIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VydmljZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwojIC0tLQojIElUU00KIyAtLS0KIyAgICB9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U2VydmljZU1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU2VydmljZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VydmljZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwojIC0tLQojIElUU00KIyAtLS0KIyAgICB9KTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2VNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U0xBIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ1NlcnZpY2VJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNMQU1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU0xBSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNMQU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPd25lclNlbGVjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3VXNlcklEIj5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik93bmVyU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVmcmVzaCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNPd25lclNlbGVjdGlvbkdldEFsbCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAkKCcjT3duZXJBbGwnKS52YWwoJzEnKTsgLy8gTmVlZGVkPyBXaHk/CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnT3duZXJBbGwnLCBbJ05ld1VzZXJJRCddLCBmdW5jdGlvbigpIHsKICAgICAgICAkKCcjTmV3VXNlcklEJykuZm9jdXMoKTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCiQoJyNOZXdVc2VySUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXdVc2VySUQnLCBbICdUeXBlSUQnLCAnRGVzdCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lclNlbGVjdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZVNlbGVjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UmVzcG9uc2libGVJRCI+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXNwb25zaWJsZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVmcmVzaCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNSZXNwb25zaWJsZVNlbGVjdGlvbkdldEFsbCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAkKCcjUmVzcG9uc2libGVBbGwnKS52YWwoJzEnKTsgLy8gTmVlZGVkPyBXaHk/CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ05ld1Jlc3BvbnNpYmxlSUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI05ld1Jlc3BvbnNpYmxlSUQnKS5mb2N1cygpOwogICAgfSk7CiAgICByZXR1cm4gZmFsc2U7Cn0pOwoKJCgnI05ld1Jlc3BvbnNpYmxlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXdSZXNwb25zaWJsZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZVNlbGVjdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbHVlICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIERhdGEuSW52YWxpZCB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3B0aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU3ViamVjdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdEludmFsaWQgfCBodG1sICVdIFc3NXBjICIgbmFtZT0iU3ViamVjdCIgaWQ9IlN1YmplY3QiIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0T3B0aW9ucyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3B0aW9ucyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zQmVnaW4gLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTcGVsbENoZWNrIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvblNwZWxsQ2hlY2siPlsgWyUgVHJhbnNsYXRlKCJTcGVsbCBjaGVjayIpIHwgaHRtbCAlXSBdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3BlbGxDaGVjayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFkZHJlc3NCb29rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvbkFkZHJlc3NCb29rIj5bIFslIFRyYW5zbGF0ZSgiQWRkcmVzcyBib29rIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJBZGRyZXNzQm9vayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk9wdGlvbkN1c3RvbWVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvbkN1c3RvbWVyIj5bIFslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpIHwgaHRtbCAlXSBdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3B0aW9uQ3VzdG9tZXIiKSAlXQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50TGlua09iamVjdDtNb2RlPVRlbXBvcmFyeTtTb3VyY2VPYmplY3Q9VGlja2V0O1NvdXJjZUtleT1bJSBEYXRhLkZvcm1JRCB8IHVyaSAlXTtUYXJnZXRJZGVudGlmaWVyPUlUU01Db25maWdJdGVtIiBpZD0iT3B0aW9uTGlua1RpY2tldCIgY2xhc3M9IkFzUG9wdXAiPlsgWyUgVHJhbnNsYXRlKCJMaW5rIHRpY2tldCIpIHwgaHRtbCAlXSBdPC9hPgojIC0tLQoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNFbmQgLS0+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldE9wdGlvbnMiKSAlXQoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX05vVGlja2V0T3B0aW9uc0ZhbGxiYWNrIC0tPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhbmRhcmRUZW1wbGF0ZUlEIj5bJSBUcmFuc2xhdGUoIlRleHQgVGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRUZW1wbGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiU2V0dGluZyBhIHRlbXBsYXRlIHdpbGwgb3ZlcndyaXRlIGFueSB0ZXh0IG9yIGF0dGFjaG1lbnQuIikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTdGFuZGFyZFRlbXBsYXRlSUQnLCBbJ1JpY2hUZXh0RmllbGQnXSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEZpZWxkIiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Cb2R5SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHRpdGxlPSJNZXNzYWdlIGJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhRW1haWwiKSAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNpZ25hdHVyZSI+WyUgVHJhbnNsYXRlKCJTaWduYXR1cmUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2lnbmF0dXJlIiB2YWx1ZT0iWyUgRGF0YS5TaWduYXR1cmUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgaGVpZ2h0PSIxNDAiIHdpZHRoPSI2MjAiIGZyYW1lYm9yZGVyPSIwIiBpZD0iU2lnbmF0dXJlIiBjbGFzcz0iU2lnbmF0dXJlIiBzcmM9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1TaWduYXR1cmU7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgfCBodG1sICVdIj48L2lmcmFtZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlNwYWNpbmdMZWZ0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiAvPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICAkKCcjQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLnZhbCgxKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLnRyaWdnZXIoJ3N1Ym1pdCcpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkZpbGVVcGxvYWQiIG5hbWU9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNGaWxlVXBsb2FkJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgdmFyICRGb3JtID0gJCgnI0ZpbGVVcGxvYWQnKS5jbG9zZXN0KCdmb3JtJyk7CiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV4dFN0YXRlSUQiPlslIFRyYW5zbGF0ZSgiTmV4dCB0aWNrZXQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmV4dFN0YXRlc1N0cmcgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXh0U3RhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXh0U3RhdGVJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsJ05ld1Jlc3BvbnNpYmxlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBlbmRpbmcgRGF0ZSIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCJmb3IgcGVuZGluZyogc3RhdGVzIikgfCBodG1sICVdKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QZW5kaW5nRGF0ZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1ByaW9yaXR5SUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUHJpb3JpdHlJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpbWVVbml0cyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfVGltZVVuaXRzIFslIERhdGEuVGltZVVuaXRzUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuVGltZVVuaXRzSW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IlslIERhdGEuVGltZVVuaXRzIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZW5kIG1haWwiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNlbmQgbWFpbCIpIHwgaHRtbCAlXSIgPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1lbnZlbG9wZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU2VuZCBtYWlsIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJDdXN0b21lclRpY2tldHMiPjwvZGl2Pgo8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKQ29yZS5Db25maWcuU2V0KCdMb2NhbGl6YXRpb24uRGVsZXRlJywgWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IEpTT04gJV0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7IENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCAkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOyByZXR1cm4gZmFsc2U7IH0gKTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgKHRoaXMgcGFydCBoZXJlIGlzIGltcG9ydGFudCBpZiB0aGUgcGFnZSBpcyByZWxvYWRlZCBkdWUgdG8gZS5nLiBhdHRhY2htZW50IHVwbG9hZCkKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgojIGV4YW1wbGUgdGVtcGxhdGUgZm9ybSBmb3IgY3VzdG9taXphdGlvbnMKIzxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iVGVtcGxhdGUxIj4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIyIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IkV4YW1wbGUgU3ViamVjdCIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSJOYW1lOgojUHJvZHVjdDoKI0NvbW1lbnQ6Ii8+CiM8L2Zvcm0+Cg==
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0udHQgLSBwcm92aWRlcyBIVE1MIFRpY2tldCBPdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93IikgJV0KPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dCdWxrIikgJV0KICAgIDxsaSBjbGFzcz0iQWx3YXlzUHJlc2VudCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFsbCIpIHwgaHRtbCAlXSIgaWQ9IlNlbGVjdEFsbFRpY2tldHMiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9IkludmlzaWJsZVRleHQiIGZvcj0iU2VsZWN0QWxsVGlja2V0cyI+WyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICA8L3NwYW4+CiAgICA8L2xpPgogICAgPGxpIGlkPSJCdWxrQWN0aW9uIiBjbGFzcz0iQWx3YXlzUHJlc2VudCBJbmFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQogICAgPGxpPjxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQogICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQo8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRIZWFkZXIiKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuSW5pdCgpOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KPHVsIGlkPSJUaWNrZXRPdmVydmlld01lZGl1bSIgY2xhc3M9Ik92ZXJ2aWV3IE92ZXJ2aWV3TWVkaXVtIj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGlja2V0Rm91bmQiKSAlXQogICAgPGxpIGlkPSJFbXB0eU1lc3NhZ2VNZWRpdW0iPgogICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gdGlja2V0IGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9UaWNrZXRGb3VuZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudENvbnRlbnQiKSAlXQogICAgPGxpIGlkPSJUaWNrZXRJRF9bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvdyIpICVdCiAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyBJbmxpbmVBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8bGk+PGEgaWQ9IlslIERhdGEuSUQgfCBodG1sICVdWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IEludGVycG9sYXRlIHwgaHRtbCAlXSI+WyUgRGF0YS5OYW1lIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbUhUTUwiKSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGNsaWNrIG9uIGEgcGFydCBvZiB0aGUgSW5saWVuQWN0aW9uUm93IHdpdGhvdXQgYSBsaW5rCiAgICAvLyBPdGhlcndpc2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBsaS13aWRlIGxpbmsgdG8gdGhlIHRpY2tldHpvb20KICAgICQoJ3VsLklubGluZUFjdGlvbnMnKS5jbGljayhmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgIGlmIChFdmVudC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQnVsayIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUaWNrZXRJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgdGlja2V0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJ1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUljb24iKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ2xhc3NTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9lbT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSWNvbiIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhIikgJV0KICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gJm5kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iSW5mb3MiPgogICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRnJvbSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5BZ2UgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPlslIElGIERhdGEuQ3VzdG9tZXJJRCAlXTxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT5bJSBFTkQgJV0KI1slIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUlciKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJPIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdCiNbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz48ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWUKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJGaXJzdCBSZXNwb25zZSBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBkYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRvIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlRvIHwgaHRtbCAlXSI+WyUgRGF0YS5Ub1JlYWxuYW1lIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMkxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlVwZGF0ZSBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlVwZGF0ZVRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIlVwZGF0ZVRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSI+WyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV0gKFslIERhdGEuT3duZXIgfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTG9jayIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU2VydmljZSB8IGh0bWwgJV0iPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+WyUgRGF0YS5TTEEgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTwvbGFiZWw+PGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUk8iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+PGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdIj5bJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQzIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWUKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDNMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQzTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQzUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDNQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTb2x1dGlvbiBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJTb2x1dGlvblRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIgRHluYW1pY0ZpZWxkU2VwYXJhdG9yIj48L2Rpdj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZSIpICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2xpPgoKWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+Cgo8Zm9ybSBuYW1lPSJidWxrIiBhY3Rpb249IiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+Cgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ibWF0cml4Ij4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0QnVsayIvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Rm9vdGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCjxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUiKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8bGFiZWwgZm9yPSJEZXN0UXVldWVJRCIgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIHF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgWyUgRGF0YS5Nb3ZlUXVldWVzU3RyZyAlXQogICAgPC9mb3JtPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLklubGluZUFjdGlvbnMsIC5PdmVydmlld0FjdGlvbnMnKS5vbignY2hhbmdlJywgJ3NlbGVjdFtuYW1lPURlc3RRdWV1ZUlEXScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCIpICVdClslIEZPUkVBQ0ggTWVudUVsZW1lbnQgSU4gRGF0YS5EYXRhICVdCiAgICBbJSBNZW51RWxlbWVudC5OYW1lID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTmFtZSkgJV0KICAgIFslIE1lbnVFbGVtZW50LkxpbmsgPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5MaW5rKSAlXQogICAgWyUgTWVudUVsZW1lbnQuRGVzY3JpcHRpb24gPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5EZXNjcmlwdGlvbikgJV0KWyUgRU5EICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0nKSwgWyUgSlNPTihEYXRhLkRhdGEpICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudFJlYWR5U3RhcnQiKSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuSW5pdENoZWNrYm94U2VsZWN0aW9uKCQoJ2Rpdi5DaGVja2JveCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKICAgICAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZExpbmsnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gb25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5CiAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgIGlmIChFdmVudC5jdHJsS2V5IHx8IEV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRSZWFkeVN0YXJ0IikgJV0KWyUgRU5EICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnYS5Bc1BvcHVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgTWF0Y2hlcywKICAgICAgICAgICAgUG9wdXBUeXBlID0gJ1RpY2tldEFjdGlvbic7CgogICAgICAgIE1hdGNoZXMgPSAkKHRoaXMpLmF0dHIoJ2NsYXNzJykubWF0Y2goL1BvcHVwVHlwZV8oXHcrKS8pOwogICAgICAgIGlmIChNYXRjaGVzKSB7CiAgICAgICAgICAgIFBvcHVwVHlwZSA9IE1hdGNoZXNbMV07CiAgICAgICAgfQoKICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgUG9wdXBUeXBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3LnR0IC0gcHJvdmlkZXMgSFRNTCBUaWNrZXQgT3ZlcnZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQo8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQogICAgPGxpIGNsYXNzPSJBbHdheXNQcmVzZW50Ij4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdIiBpZD0iU2VsZWN0QWxsVGlja2V0cyIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iSW52aXNpYmxlVGV4dCIgZm9yPSJTZWxlY3RBbGxUaWNrZXRzIj5bJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgIDwvc3Bhbj4KICAgIDwvbGk+CiAgICA8bGkgaWQ9IkJ1bGtBY3Rpb24iIGNsYXNzPSJBbHdheXNQcmVzZW50IEluYWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93QnVsayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdCiAgICA8bGk+PGEgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCiAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCjwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvdyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEhlYWRlciIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkFjdGlvblJvdy5Jbml0KCk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TGFyZ2UiIGNsYXNzPSJPdmVydmlldyBPdmVydmlld0xhcmdlIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGlja2V0Rm91bmQiKSAlXQogICAgPGxpIGlkPSJFbXB0eU1lc3NhZ2VMYXJnZSI+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJObyB0aWNrZXQgZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RpY2tldEZvdW5kIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50Q29udGVudCIpICVdCiAgICA8bGkgaWQ9IlRpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IFslIERhdGEuQWRkaXRpb25hbENsYXNzZXMgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93IikgJV0KICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIElubGluZUFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KICAgICAgICAgICAgICAgIDxsaT48YSBpZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLkRlc2NyaXB0aW9uIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIj5bJSBEYXRhLk5hbWUgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW1IVE1MIikgJV0KICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIC8vIFN0b3AgcHJvcGFnYXRpb24gb24gY2xpY2sgb24gYSBwYXJ0IG9mIHRoZSBJbmxpZW5BY3Rpb25Sb3cgd2l0aG91dCBhIGxpbmsKICAgIC8vIE90aGVyd2lzZSB0aGF0IHdvdWxkIHRyaWdnZXIgdGhlIGxpLXdpZGUgbGluayB0byB0aGUgdGlja2V0em9vbQogICAgJCgndWwuSW5saW5lQWN0aW9ucycpLmNsaWNrKGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICAgICAgaWYgKEV2ZW50LnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB9CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCdWxrIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2hlY2tib3giPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDaGVja2JveCIgdHlwZT0iY2hlY2tib3giIG5hbWU9IlRpY2tldElEIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyB0aWNrZXQiKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQnVsayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSWNvbiIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DbGFzc1NwYW4gfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPGVtPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2VtPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFJY29uIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj5bJSBDb25maWcoIlRpY2tldDo6SG9vayIpICVdOiBbJSBEYXRhLlRpY2tldE51bWJlciAlXSAmbmRhc2g7IFslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rICVdIiBbJSBEYXRhLkxpbmtQYXJhbSAlXSBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkFnZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgdHJ1bmNhdGUoMjYpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU2VydmljZSB8IGh0bWwgJV0iPlslIERhdGEuU2VydmljZSB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+WyUgRGF0YS5TTEEgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuVXNlckZpcnN0bmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCBodG1sICVdIChbJSBEYXRhLk93bmVyIHwgaHRtbCAlXSkiPlslIERhdGEuVXNlckZpcnN0bmFtZSB8IHRydW5jYXRlKDE1KSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCB0cnVuY2F0ZSgxNSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxvY2siKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1pZGRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSI+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJOYW1lIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuVXBkYXRlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuVXBkYXRlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5VcGRhdGVUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU29sdXRpb25UaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlNvbHV0aW9uVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWlkZGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5Dcml0aWNhbGl0eSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkltcGFjdCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IlslIERhdGEuQ2xhc3MgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvdyIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojICAgICAgICAgICAgICAgICAgICA8dHI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICAgICAgPHRyPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvdHI+CgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVzUHJldmlld0FyZWEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcmV2aWV3Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlUHJldmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBEYXRhLkZyb20gfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCB0cnVuY2F0ZSg1MCkgfCBodG1sICVdICZuZGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlN1YmplY3QiPlslIERhdGEuU3ViamVjdCB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEYXRlVGltZSI+WyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDbGVhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIaWRkZW5CbG9jayI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQcmV2aWV3QWN0aW9uUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3dJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFydGljbGVJRCIgdmFsdWU9IlslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcGx5QWxsIiB2YWx1ZT0iWyUgRGF0YS5SZXBseUFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNwb25zZUlEWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFJlc3BvbnNlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgVVJMOwoKICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA+IDApIHsKICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICQodGhpcykucGFyZW50cygpLnNlcmlhbGl6ZSgpOwogICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cChVUkwsICdUaWNrZXRBY3Rpb24nKTsKICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdwogICAgICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgICAgIH0KICAgIH0pOwogICAgLy8gbWFrZSBzdXJlIHRoaXMgY2xpY2sgZXZlbnQgZG9lcyBub3QgYnViYmxlIHVwIHRvIHRoZSB0YWJsZSByb3cgYW5kIGV4ZWN1dGUgaXRzIGNsaWNrIGhhbmRsZXIKICAgICQoJyNbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlUHJldmlld0FjdGlvblJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IEFydGljbGVCb2R5Ij4KWyUgRGF0YS5Cb2R5Tm90ZSAlXQpbJSBEYXRhLkJvZHkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlc1ByZXZpZXdBcmVhIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+CgoKPGZvcm0gbmFtZT0iYnVsayIgYWN0aW9uPSIiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPC9mb3JtPgoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im1hdHJpeCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldEJ1bGsiLz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudE1lbnVJdGVtTW92ZUZvcm0iKSAlXQo8bGkgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUgdGlja2V0IHRvIGEgZGlmZmVyZW50IHF1ZXVlIikgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8bGFiZWwgZm9yPSJEZXN0UXVldWVJRCIgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIHF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgWyUgRGF0YS5Nb3ZlUXVldWVzU3RyZyAlXQogICAgPC9mb3JtPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLklubGluZUFjdGlvbnMsIC5PdmVydmlld0FjdGlvbnMnKS5vbignY2hhbmdlJywgJ3NlbGVjdFtuYW1lPURlc3RRdWV1ZUlEXScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCIpICVdClslIEZPUkVBQ0ggTWVudUVsZW1lbnQgSU4gRGF0YS5EYXRhICVdCiAgICBbJSBNZW51RWxlbWVudC5OYW1lID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTmFtZSkgJV0KICAgIFslIE1lbnVFbGVtZW50LkxpbmsgPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5MaW5rKSAlXQogICAgWyUgTWVudUVsZW1lbnQuRGVzY3JpcHRpb24gPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5EZXNjcmlwdGlvbikgJV0KWyUgRU5EICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0nKSwgWyUgSlNPTihEYXRhLkRhdGEpICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudFJlYWR5U3RhcnQiKSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuSW5pdENoZWNrYm94U2VsZWN0aW9uKCQoJ2Rpdi5DaGVja2JveCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKCiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHNlbGVjdCB0ZXh0IGZyb20gYW4gYXJ0aWNsZSwgTWFzdGVyQWN0aW9uIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKICAgICAgICBpZiAodHlwZW9mIEV2ZW50LnRhcmdldCA9PT0gJ29iamVjdCcgJiYgKCQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnQXJ0aWNsZUJvZHknKSB8fCAkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0FjdGlvblJvdycpKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZExpbmsnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICBpZiAoRXZlbnQuY3RybEtleSB8fCBFdmVudC5tZXRhS2V5KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9KTsKICAgIENvcmUuVUkuQWNjb3JkaW9uLkluaXQoJCgnLlByZXZpZXcgPiB1bCcpLCAnbGkgaDMgYScsICcuSGlkZGVuQmxvY2snKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlTdGFydCIpICVdClslIEVORCAlXQoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIE1hdGNoZXMsCiAgICAgICAgICAgIFBvcHVwVHlwZSA9ICdUaWNrZXRBY3Rpb24nOwoKICAgICAgICBNYXRjaGVzID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLm1hdGNoKC9Qb3B1cFR5cGVfKFx3KykvKTsKICAgICAgICBpZiAoTWF0Y2hlcykgewogICAgICAgICAgICBQb3B1cFR5cGUgPSBNYXRjaGVzWzFdOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksIFBvcHVwVHlwZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIEFnZW50VGlja2V0UGhvbmUudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHBob25lCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzM2MDhiNjA2MjU5YWNlNjFmZWRiYjgyZjk0MjczZDZhYmVmYzY5NzIvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0FnZW50VGlja2V0UGhvbmUudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudEN1c3RvbWVyU2VhcmNoLnR0IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiI+CgogICAgWyUgSUYgRGF0YS5UaWNrZXRJRCAlXQogICAgPGgxPlslIFRyYW5zbGF0ZSgiU3BsaXQgSW50byBOZXcgUGhvbmUgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIFslIEVMU0lGIERhdGEuRnJvbUNoYXRJRCAlXQogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2F2ZSBDaGF0IEludG8gTmV3IFBob25lIFRpY2tldCIpIHwgaHRtbCAlXTwvaDE+CiAgICBbJSBFTFNFICVdCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgTmV3IFBob25lIFRpY2tldCIpIHwgaHRtbCAlXTwvaDE+CiAgICBbJSBFTkQgJV0KCiAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJUYWJsZSIpICVdCiAgICAgICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVySW5mbyIgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVyIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DdXN0b21lclRhYmxlICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iTmV3UGhvbmVUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgaWQ9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjAiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgaWQ9Ik93bmVyQWxsIiB2YWx1ZT0iWyUgRGF0YS5Pd25lckFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSJbJSBEYXRhLlJlc3BvbnNpYmxlQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJVc2VyIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGlua1RpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5MaW5rVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGcm9tQ2hhdElEIiB2YWx1ZT0iWyUgRGF0YS5Gcm9tQ2hhdElEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1R5cGVJRCcsIFsnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkZyb21DdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iRnJvbUN1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5Gcm9tSW52YWxpZCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgZm9yIHRoZSB0aWNrZXQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbVNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkN1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXkiIGlkPSJDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwgIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIFslIERhdGEuQ3VzdG9tZXJTZWxlY3RlZCB8IGh0bWwgJV0gIFslIERhdGEuQ3VzdG9tZXJEaXNhYmxlZCB8IGh0bWwgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIEN1c3RvbWVyS2V5OwogICAgICAgIGlmICggJCh0aGlzKS5hdHRyKCdjaGVja2VkJykgKXsKCiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gJCggJyNDdXN0b21lcktleV8nICskKHRoaXMpLnZhbCgpICkudmFsKCk7CiAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLkN1c3RvbWVyVGlja2V0UmVtb3ZlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZW1vdmVDdXN0b21lclRpY2tldCggJCh0aGlzKSApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoICdGcm9tQ3VzdG9tZXInLCAiWyUgRGF0YS5FbWFpbCB8IGh0bWwgJV0iLCAiWyUgRGF0YS5DdXN0b21lciB8IGh0bWwgJV0iLCB0cnVlICk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbUV4dGVybmFsQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVzdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUbyBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ub1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdEZXN0JywgWydUeXBlSUQnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNMQUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnU2VydmljZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEEiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U0xBTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ1NlcnZpY2VJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdVc2VySUQiPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3duZXJTZWxlY3Rpb25HZXRBbGwiIGNsYXNzPSJHZXRBbGxBSkFYIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1yZWZyZXNoIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNPd25lclNlbGVjdGlvbkdldEFsbCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgJCgnI093bmVyQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdPd25lckFsbCcsIFsnTmV3VXNlcklEJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjTmV3VXNlcklEJykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcjTmV3VXNlcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05ld1VzZXJJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lclNlbGVjdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZVNlbGVjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UmVzcG9uc2libGVJRCI+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXNwb25zaWJsZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVmcmVzaCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNSZXNwb25zaWJsZUFsbCcpLnZhbCgnMScpOyAvLyBOZWVkZWQ/IFdoeT8KICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ05ld1Jlc3BvbnNpYmxlSUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcjTmV3UmVzcG9uc2libGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXdSZXNwb25zaWJsZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGVTZWxlY3Rpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iVzc1cGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5TdWJqZWN0SW52YWxpZCB8IGh0bWwgJV0iIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE9wdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0JlZ2luIC0tPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3BlbGxDaGVjayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bIFslIFRyYW5zbGF0ZSgiU3BlbGwgY2hlY2siKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNwZWxsQ2hlY2siKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uQ3VzdG9tZXIiPlsgWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJPcHRpb25DdXN0b21lciIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRMaW5rT2JqZWN0O01vZGU9VGVtcG9yYXJ5O1NvdXJjZU9iamVjdD1UaWNrZXQ7U291cmNlS2V5PVslIERhdGEuRm9ybUlEIHwgdXJpICVdO1RhcmdldElkZW50aWZpZXI9SVRTTUNvbmZpZ0l0ZW0iIGlkPSJPcHRpb25MaW5rVGlja2V0IiBjbGFzcz0iQXNQb3B1cCI+WyBbJSBUcmFuc2xhdGUoIkxpbmsgdGlja2V0IikgfCBodG1sICVdIF08L2E+CiMgLS0tCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0VuZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0T3B0aW9ucyIpICVdCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfTm9UaWNrZXRPcHRpb25zRmFsbGJhY2sgLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFuZGFyZFRlbXBsYXRlSUQiPlslIFRyYW5zbGF0ZSgiVGV4dCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4iKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU3RhbmRhcmRUZW1wbGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcsIFsnUmljaFRleHRGaWVsZCddKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RmllbGQiIGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJpY2hUZXh0IikgJV0KWyUgSW5zZXJ0VGVtcGxhdGUoIlJpY2hUZXh0RWRpdG9yLnR0IikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iQm9keSIgdGl0bGU9Ik1lc3NhZ2UgYm9keSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlNwYWNpbmdMZWZ0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiAvPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICAkKCcjQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLnZhbCgxKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLnRyaWdnZXIoJ3N1Ym1pdCcpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmlsZVVwbG9hZCIgbmFtZT0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNGaWxlVXBsb2FkJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGF0QXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNoYXQgcHJvdG9jb2wiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoYXRQcm90b2NvbCI+ClslIElOQ0xVREUgIkNoYXREaXNwbGF5LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgnVGhlIGNoYXQgd2lsbCBiZSBhcHBlbmRlZCBhcyBhIHNlcGFyYXRlIGFydGljbGUuJykgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGF0QXJ0aWNsZVByZXZpZXciKSAlXQoKCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5leHRTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05leHRTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05leHRTdGF0ZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGVuZGluZyBEYXRlIikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoImZvciBwZW5kaW5nKiBzdGF0ZXMiKSB8IGh0bWwgJV0pOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QZW5kaW5nRGF0ZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQojIC0tLQoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUHJpb3JpdHlJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdQcmlvcml0eUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaW1lVW5pdHMiPlslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1RpbWVVbml0cyBbJSBEYXRhLlRpbWVVbml0c1JlcXVpcmVkIHwgaHRtbCAlXSBbJSBEYXRhLlRpbWVVbml0c0ludmFsaWQgfCBodG1sICVdIiBuYW1lPSJUaW1lVW5pdHMiIGlkPSJUaW1lVW5pdHMiIHZhbHVlPSJbJSBEYXRhLlRpbWVVbml0cyB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRzIj48L2Rpdj4KICAgIDwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKICAgIENvcmUuQ29uZmlnLlNldCgnTG9jYWxpemF0aW9uLkRlbGV0ZScsIFslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBKU09OICVdKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgeyBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOyByZXR1cm4gZmFsc2U7fSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlICh0aGlzIHBhcnQgaGVyZSBpcyBpbXBvcnRhbnQgaWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgZHVlIHRvIGUuZy4gYXR0YWNobWVudCB1cGxvYWQpCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKIyBleGFtcGxlIHRlbXBsYXRlIGZvcm0gZm9yIGN1c3RvbWl6YXRpb25zCiM8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgaWQ9IlRlbXBsYXRlMSI+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMSIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJFeGFtcGxlIFN1YmplY3QiLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iTmFtZToKI1Byb2R1Y3Q6CiNDb21tZW50OiIvPgojPC9mb3JtPgo=
IyAtLQojIEFnZW50VGlja2V0UHJpbnQudHQgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXRQcmludC50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIC8gWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGlja2V0LUluZm8iKSB8IGh0bWwgJV06CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iNjAlIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJMb2NrIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5Pd25lciB8IGh0bWwgJV0gKFslIERhdGEuVXNlckZpcnN0bmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCBodG1sICVdKTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuUmVzcG9uc2libGVTdHJpbmcgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuVHlwZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Dcml0aWNhbGl0eSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5JbXBhY3QpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPlslIERhdGEuQWdlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJBY2NvdW50ZWQgdGltZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlRpY2tldFRpbWVVbml0cyB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjY291bnRlZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQZW5kaW5nVW50aWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQZW5kaW5nIHRpbGwiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5QZW5kaW5nVW50aWwgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJQZW5kaW5nVW50aWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyIikgJV0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGluayIpICVdCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJMaW5rZWQtT2JqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1R5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPlslIFRyYW5zbGF0ZShEYXRhLkxpbmtUeXBlTmFtZSkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVHlwZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1N0cmcgJV08YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1R5cGVSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1R5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGluayIpICVdCiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvIikgfCBodG1sICVdOgogICAgICAgICAgICBbJSBEYXRhLkN1c3RvbWVyVGFibGUgJV0KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBzdGFydCB0aWNrZXQgWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gLS0+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGUiKSAlXQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogICAgPHRyPgogICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyBGcm9tOiwgVG86LCBDYzoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSB8IHRydW5jYXRlKDE2MCkgfCBodG1sICVdPC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXSBbJSBUcmFuc2xhdGUoImJ5IikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLlNlbmRlclR5cGUpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgRHluYW1pYyBGaWVsZHMgZm9yIGVhY2ggQXJ0aWNsZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IFslIFRyYW5zbGF0ZShEYXRhLkFydGljbGVUeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gWyUgRGF0YS5pdGVtKCJBcnRpY2xlOjpBVE0iKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgpbJSBEYXRhLlRleHROb3RlICVdClslIElGIERhdGEuSXNDaGF0ID09IDEgJV0KWyUgSU5DTFVERSAiQ2hhdERpc3BsYXkudHQiICVdClslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZT4KWyUgRGF0YS5Cb2R5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZSIpICVdCg==
IyAtLQojIEFnZW50VGlja2V0Wm9vbS50dCAtIHByb3ZpZGVzIEhUTUwgZm9yIEFnZW50VGlja2V0Wm9vbS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWx0ZXJEaWFsb2ciKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NldEFydGljbGVGaWx0ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCQoJyNBcnRpY2xlRmlsdGVyRGlhbG9nJyksIFslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBmaWx0ZXIiKSB8IEpTT04gJV0sICcyMHB4JywgJ0NlbnRlcicsIHRydWUsIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGFiZWw6IFslIFRyYW5zbGF0ZSgiQXBwbHkiKSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gQ29yZS5BSkFYLlNlcmlhbGl6ZUZvcm0oJCgnI0FydGljbGVGaWx0ZXJEaWFsb2dGb3JtJykpOwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9LCAndGV4dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMYWJlbDogWyUgVHJhbnNsYXRlKCJSZXNldCIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI0FydGljbGVUeXBlRmlsdGVyJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAkKCcjQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInKS52YWwoJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICAkKCcjUmVzZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAgICAgICAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAgICAnQXJ0aWNsZUZpbHRlclNldCcsCiAgICAgICAgICAgIFRpY2tldElEOiAgICAgIlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiwKICAgICAgICAgICAgU2F2ZURlZmF1bHRzOiAxCiAgICAgICAgfTsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksIERhdGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCjxkaXYgaWQ9IkFydGljbGVGaWx0ZXJEaWFsb2ciIGNsYXNzPSJIaWRkZW4iPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJBcnRpY2xlRmlsdGVyRGlhbG9nRm9ybSIgbmFtZT0iQXJ0aWNsZUZpbHRlckRpYWxvZ0Zvcm0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBZ2VudFRpY2tldFpvb20iIG5hbWU9IkFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBcnRpY2xlRmlsdGVyU2V0IiBuYW1lPSJTdWJhY3Rpb24iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIG5hbWU9IlRpY2tldElEIi8+CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlVHlwZUZpbHRlciI+WyUgVHJhbnNsYXRlKCJBcnRpY2xlIFR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BcnRpY2xlVHlwZUZpbHRlclN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlU2VuZGVyVHlwZUZpbHRlciI+WyUgVHJhbnNsYXRlKCJTZW5kZXIgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkFydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNhdmVEZWZhdWx0cyI+WyUgVHJhbnNsYXRlKCJTYXZlIGZpbHRlciBzZXR0aW5ncyBhcyBkZWZhdWx0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNhdmVEZWZhdWx0cyIgbmFtZT0iU2F2ZURlZmF1bHRzIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgIDwvZm9ybT4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRmlsdGVyRGlhbG9nIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV2ZW50VHlwZUZpbHRlckRpYWxvZyIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2V0QXJ0aWNsZUZpbHRlcicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJCgnI0V2ZW50VHlwZUZpbHRlckRpYWxvZycpLCBbJSBUcmFuc2xhdGUoIkV2ZW50IFR5cGUgRmlsdGVyIikgfCBKU09OICVdLCAnMjBweCcsICdDZW50ZXInLCB0cnVlLCBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIkFwcGx5IikgfCBKU09OICVdLAogICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IENvcmUuQUpBWC5TZXJpYWxpemVGb3JtKCQoJyNFdmVudFR5cGVGaWx0ZXJEaWFsb2dGb3JtJykpOwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9LCAndGV4dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMYWJlbDogWyUgVHJhbnNsYXRlKCJSZXNldCIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI0V2ZW50VHlwZUZpbHRlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICAgICQoJyNSZXNldEFydGljbGVGaWx0ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246ICAgICAgICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICBTdWJhY3Rpb246ICAgICdFdmVuVHlwZUZpbHRlclNldCcsCiAgICAgICAgICAgIFRpY2tldElEOiAgICAgIlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiwKICAgICAgICAgICAgU2F2ZURlZmF1bHRzOiAxCiAgICAgICAgfTsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksIERhdGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCjxkaXYgaWQ9IkV2ZW50VHlwZUZpbHRlckRpYWxvZyIgY2xhc3M9IkhpZGRlbiI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IkV2ZW50VHlwZUZpbHRlckRpYWxvZ0Zvcm0iIG5hbWU9IkV2ZW50VHlwZUZpbHRlckRpYWxvZ0Zvcm0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBZ2VudFRpY2tldFpvb20iIG5hbWU9IkFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJFdmVuVHlwZUZpbHRlclNldCIgbmFtZT0iU3ViYWN0aW9uIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBuYW1lPSJUaWNrZXRJRCIvPgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXJ0aWNsZVR5cGVGaWx0ZXIiPlslIFRyYW5zbGF0ZSgiRXZlbnQgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkV2ZW50VHlwZUZpbHRlclN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJTYXZlRGVmYXVsdHMiPlslIFRyYW5zbGF0ZSgiU2F2ZSBhcyBkZWZhdWx0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNhdmVEZWZhdWx0cyIgbmFtZT0iU2F2ZURlZmF1bHRzIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgIDwvZm9ybT4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFdmVudFR5cGVGaWx0ZXJEaWFsb2ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyIikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gWyUgSUYgRGF0YS5Vc2VBcnRpY2xlQ29sb3JzICVdVXNlQXJ0aWNsZUNvbG9yc1slIEVORCAlXSI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj48c3BhbiBjbGFzcz0iUHJpb3JpdHlJRC1bJSBEYXRhLlByaW9yaXR5SUQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9zcGFuPjwvZGl2PgogICAgICAgIDxoMSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJab29tIikgfCBodG1sICVdIFslIERhdGEuSG9vayAlXVslIERhdGEuVGlja2V0TnVtYmVyICVdICZuZGFzaDsgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICBbJSBEYXRhLkhvb2sgJV1bJSBEYXRhLlRpY2tldE51bWJlciAlXSA8c3Bhbj4mbWRhc2g7PC9zcGFuPiBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICA8L2Rpdj4KCiMgSWZyYW1lIHVzZWQgZm9yIGZpeGluZyBidWcjODU0NTogQXR0YWNobWVudCBkb3dubG9hZCBub3QgcG9zc2libGUgaWYgcG9wIHVwIG9mIGFub3RoZXIgYWN0aW9uIGlzIG9wZW4KIyBBbGwgZG93bmxvYWRzIChlLmcuIGF0dGFjaG1lbnRzKSBoYXZlIHRoaXMgaWZyYW1lIGFzIHRhcmdldC4gVGhpcyBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHNlbmRpbmcKIyBhbiBodHRwIHJlcXVlc3QgdG8gdGhlIFRpY2tldFpvb20gd2luZG93LiBJdCBzZW5kcyB0aGUgZG93bmxvYWQgcmVxdWVzdCB0byB0aGlzIGlmcmFtZSBpbnN0ZWFkLgojIFNlbmRpbmcgdGhlIGRvd25sb2FkIHJlcXVlc3QgdG8gdGhlIG1haW4gd2luZG93IHdvdWxkIGxlYWQgdG8gYW4gYWxlcnQgbWVzc2FnZSBhYm91dCBsZWF2aW5nIHRoZSBwYWdlCiMgaWYgYXQgdGhlIHNhbWUgdGltZSBhIHBvcHVwIHdpbmRvdyAoZS5nLiBmb3IgYSB0aWNrZXQgYW5zd2VyKSBpcyBvcGVuZWQuCiAgICA8aWZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIG5hbWU9IkF0dGFjaG1lbnRXaW5kb3ciIGlkPSJBdHRhY2htZW50V2luZG93Ij48L2lmcmFtZT4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuV2lkZ2V0VGl0bGUpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcmNoaXZlRmxhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFyY2hpdmUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoIlRoaXMgdGlja2V0IGlzIGFyY2hpdmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJjaGl2ZUZsYWciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLkFnZSAlXSI+WyUgRGF0YS5BZ2UgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdIj5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNyZWF0ZWRCeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DcmVhdGVkQnlVc2VyICVdIj5bJSBEYXRhLkNyZWF0ZWRCeVVzZXIgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNyZWF0ZWRCeSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NrZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgfCByZXBsYWNlKCc6OicsICc8d2JyPjo6PHdicj4nKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdIChbJSBEYXRhLlVzZXJMb2dpbiB8IGh0bWwgJV0pIj5bJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXSAoWyUgRGF0YS5Vc2VyTG9naW4gfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KIyAtLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+WyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb207U2VydmljZUlEPVslIERhdGEuU2VydmljZUlEIHwgdXJpICVdOyIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+WyUgRGF0YS5TTEEgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlNMQSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTVNMQVpvb207U0xBSUQ9WyUgRGF0YS5TTEFJRCB8IHVyaSAlXTsiIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlNMQSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJGaXJzdCBSZXNwb25zZSBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVIdW1hbiB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVXBkYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlVwZGF0ZSBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5VcGRhdGVUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5VcGRhdGVUaW1lQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlVwZGF0ZVRpbWVIdW1hbiB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBkYXRlVGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU29sdXRpb25UaW1lQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNvbHV0aW9uVGltZUh1bWFuIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eV9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5IikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01JbXBhY3RfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUltcGFjdCIpICVdCgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBUaWdodCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWRfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWRfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uUmVzdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHRfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHRfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdCIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvbkRhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlX0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvbkRhdGUiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZV9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lIikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVjb3ZlcnlTdGFydFRpbWVfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVjb3ZlcnlTdGFydFRpbWVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZSIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EdWVEYXRlX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIC0tLQoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpIHwgSW50ZXJwb2xhdGUgJV0iIGNsYXNzPSJbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rQ2xhc3MiKSAlXSIgWyUgQ29uZmlnKCJDdXN0b21lckRCTGlua1RhcmdldCIpICVdPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb3RhbEFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY2NvdW50ZWQgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuVGlja2V0VGltZVVuaXRzICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja0VuZCgiVG90YWxBY2NvdW50ZWRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGVuZGluZ1VudGlsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGVuZGluZyB0aWxsIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSBbJSBEYXRhLlBlbmRpbmdVbnRpbENsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlBlbmRpbmdVbnRpbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVW50aWxUaW1lSHVtYW4gfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQZW5kaW5nVW50aWwiKSAlXQojIC0tLQojIElUU00KIyAtLS0KI1slIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdIChbJSBEYXRhLlVzZXJMb2dpbiB8IGh0bWwgJV0pIj5bJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdPC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiNbJSBSZW5kZXJCbG9ja0VuZCgiT3duZXIiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLk91dE9mT2ZmaWNlTWVzc2FnZSB8IGh0bWwgJV0gKFslIERhdGEuVXNlckxvZ2luIHwgaHRtbCAlXSkiPlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLk91dE9mT2ZmaWNlTWVzc2FnZSB8IGh0bWwgJV08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMKI1slIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NEYXRhIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlByb2Nlc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0aXZpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQWN0aXZpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQWN0aXZpdHkpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzRGF0YSIpICVdCgojIHNob3cgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDFfTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxX1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiMgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDJfTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDJfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgojIHNob3cgY3VzdG9tZXIgaW5mbyB0YWJsZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkN1c3RvbWVyVGFibGUgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyVGFibGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVTaW1wbGUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRG9udFByaW50Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlua2VkIE9iamVjdHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0TWVudSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgWyUgRGF0YS5MaW5rUGFyYW0gJV0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRNZW51IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0TWVudVBob25lQXNEcm9wZG93biIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSIgYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9ImdldCIgaWQ9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuUGhvbmVFbGVtZW50SUQgfCBodG1sICVdIiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRSZXBseVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0gc2VsZWN0W25hbWU9WyUgRGF0YS5QaG9uZUVsZW1lbnRJRCB8IGh0bWwgJV1dJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgVVJMOwoKICAgIGlmICgkKHRoaXMpLnZhbCgpID4gMCkgewogICAgICAgIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICQodGhpcykucGFyZW50cygpLnNlcmlhbGl6ZSgpOwogICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKFVSTCwgJ1RpY2tldEFjdGlvbicpOwogICAgICAgIC8vIHJlc2V0IHRoZSBzZWxlY3QgYm94IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4gZnJvbSB0aGUgc2FtZSB3aW5kb3cKICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgfQp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0TWVudVBob25lQXNEcm9wZG93biIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1vdmVMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUgdGlja2V0IHRvIGEgZGlmZmVyZW50IHF1ZXVlIikgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0TW92ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc3RRdWV1ZUlEIiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk1vdmVRdWV1ZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0Rlc3RRdWV1ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTW92ZUxpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb3ZlRm9ybSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0TW92ZTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdOyIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2hhbmdlIFF1ZXVlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vdmVGb3JtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldCIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCnZhciBXaWRnZXRXaWR0aCAgID0gcGFyc2VJbnQoJCgnI0R5bmFtaWNGaWVsZHNXaWRnZXQnKS5pbm5lcldpZHRoKCkgLSAxNSwgMTApLAogICAgRmllbGRzUGVyUm93ICA9IDQsCiAgICBGaWVsZE1hcmdpbiAgID0gcGFyc2VJbnQoJCgnLkR5bmFtaWNGaWVsZEF1dG9SZXNpemUnKS5jc3MoJ21hcmdpbi1yaWdodCcpLCAxMCkgKyAyLAogICAgRmllbGRXaWR0aCAgICA9IDA7CgovLyBkZWZpbmUgYW1vdW50IG9mIGZpZWxkcyBwZXIgcm93IGRlcGVuZGluZyBvbiBkaXNwbGF5IHJlc29sdXRpb24KaWYgKCBXaWRnZXRXaWR0aCA8IDEwMDAgKSB7CiAgICBGaWVsZHNQZXJSb3cgPSAzOwp9CmlmICggV2lkZ2V0V2lkdGggPCA2MDAgKSB7CiAgICBGaWVsZHNQZXJSb3cgPSAyOwp9CmlmICggV2lkZ2V0V2lkdGggPCA0MDAgKSB7CiAgICBGaWVsZHNQZXJSb3cgPSAxOwp9CgovLyBkZXRlcm1pbmUgdGhlIG5lZWRlZCBmaWVsZCB3aWR0aCBhbmQgcmVzaXplIHRoZSBmaWVsZHMKRmllbGRXaWR0aCA9IHBhcnNlSW50KFdpZGdldFdpZHRoIC8gRmllbGRzUGVyUm93IC0gRmllbGRNYXJnaW4gLSAxLCAxMCk7CiQoJy5EeW5hbWljRmllbGRBdXRvUmVzaXplJykud2lkdGgoRmllbGRXaWR0aCk7CgokKCcuU2hvd0ZpZWxkSW5mb092ZXJsYXknKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgewoKICAgIHZhciBPdmVybGF5VGl0bGUgID0gJCh0aGlzKS5jbG9zZXN0KCdsYWJlbCcpLmF0dHIoJ3RpdGxlJyksCiAgICAgICAgT3ZlcmxheUhUTUwgICA9ICQodGhpcykuY2xvc2VzdCgnLkZpZWxkQ29udGFpbmVyJykuZmluZCgnLlZhbHVlJykuaHRtbCgpOwoKICAgIE92ZXJsYXlIVE1MID0gJzxkaXYgY2xhc3M9IkZpZWxkT3ZlcmxheSI+JyArIE92ZXJsYXlIVE1MICsgJzwvZGl2Pic7CgogICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgVGl0bGU6IE92ZXJsYXlUaXRsZSwKICAgICAgICBIVE1MOiBPdmVybGF5SFRNTCwKICAgICAgICBQb3NpdGlvblRvcDogJzEwMHB4JywKICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgTGFiZWw6IFslIFRyYW5zbGF0ZSgiQ2xvc2UiKSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgIENvcmUuRm9ybS5FbmFibGVGb3JtKCQoJ2Zvcm1bbmFtZT0iY29tcG9zZSJdJykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBFeHBhbmRlZCIgaWQ9IkR5bmFtaWNGaWVsZHNXaWRnZXQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5XaWRnZXRUaXRsZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOZXh0QWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxpZ2h0Um93IEJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+WyUgRGF0YS5BY3Rpdml0eU5hbWUgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiRGlhbG9ncyIpIHwgaHRtbCAlXTo8L3N0cm9uZz48L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRQcm9jZXNzO1N1YmFjdGlvbj1EaXNwbGF5QWN0aXZpdHlEaWFsb2c7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtQcm9jZXNzRW50aXR5SUQ9WyUgRGF0YS5Qcm9jZXNzRW50aXR5SUQgfCB1cmkgJV07QWN0aXZpdHlEaWFsb2dFbnRpdHlJRD1bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9BY3Rpdml0eURpYWxvZ3MiKSAlXQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJBY3Rpb25NZXNzYWdlIj5bJSBUcmFuc2xhdGUoIlRoZXJlIGFyZSBubyBkaWFsb2dzIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50IGluIHRoZSBwcm9jZXNzLiIpIHwgaHRtbCAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vQWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5leHRBY3Rpdml0eURpYWxvZ3MiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBQcm9jZXNzSW5mbyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvY2Vzc0luZm9ybWF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwU2VwYXJhdG9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0iRmllbGRTZXRTZXBhcmF0b3IiPlslIERhdGEuTmFtZSAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBTZXBhcmF0b3IiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ29udGFpbmVyIER5bmFtaWNGaWVsZEF1dG9SZXNpemUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJTaG93RmllbGRJbmZvT3ZlcmxheSI+KzwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRWYWx1ZU92ZXJsYXlUcmlnZ2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSBDdXRWYWx1ZSBEeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lICVdIj4KPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1dpZGdldER5bmFtaWNGaWVsZEJlZ2luIC0tPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWUgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbiIpICVdCjwhLS0gT3V0cHV0RmlsdGVySG9va19XaWRnZXREeW5hbWljRmllbGRFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZUxvbmciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWx1ZSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFZhbHVlTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXQiKSAlXQoKICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZVRyZWUiPgpbJSBEYXRhLkFydGljbGVUcmVlICVdCiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGludE5vQXJ0aWNsZXMiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhpbnROb0FydGljbGVzIikgJV0KCiAgICAgICAgICAgIDxkaXYgaWQ9IkFydGljbGVJdGVtcyI+ClslIERhdGEuQXJ0aWNsZUl0ZW1zICVdCiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1RhYmxlQ29tcGxleCIpICVdCiAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlQ29tcGxleCIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgoKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZSIpICVdCjxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPgogICAgICAgICAgICA8L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGgyPgogICAgICAgIFslIElGIERhdGEuWm9vbVRpbWVsaW5lICVdCiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0KICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBPdmVydmlldyIpIHwgaHRtbCAlXSAtIFslIERhdGEuQXJ0aWNsZUNvdW50IHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIkFydGljbGUocykiKSB8IGh0bWwgJV0KICAgICAgICBbJSBFTkQgJV0KICAgICAgICA8L2gyPgogICAgICAgIDxkaXYgY2xhc3M9IkFkZGl0aW9uYWxJbmZvcm1hdGlvbiBDb250cm9sUm93Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQYWdlcyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVQYWdlcyBJY29ucyI+CiAgICAgICAgWyUgRk9SRUFDSCBwYWdlIElOIFsxIC4uIERhdGEuUGFnZXNdOyAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVQYWdlPVslIHBhZ2UgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ1BhZ2UnKSAlXSBbJSBwYWdlICVdIiBkYXRhLXBhZ2U9IlslIHBhZ2UgJV0iIFslIElGIHBhZ2UgPT0gRGF0YS5DdXJyZW50UGFnZSAlXWNsYXNzPSJBY3RpdmUiWyUgRU5EICVdPlslIHBhZ2UgJV08L2E+CiAgICAgICAgWyUgRU5EOyAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVQYWdlcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWx0ZXJEaWFsb2dMaW5rIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUZpbHRlciBJY29ucyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBcnRpY2xlIEZpbHRlciIpIHwgaHRtbCAlXTo8L3NwYW4+CiMgT25seSBzaG93IG9uZTogU2V0IG9yIFJlc2V0LgojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUZpbHRlclNldExpbmsiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlNldEFydGljbGVGaWx0ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBGaWx0ZXIiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1maWx0ZXIiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNldCIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpbHRlclNldExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRmlsdGVyUmVzZXRMaW5rIikgJV0KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZXNldEFydGljbGVGaWx0ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlc2V0IEZpbHRlciIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc2V0IikgfCBodG1sICVdPC9zcGFuPjwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVGaWx0ZXJSZXNldExpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVGaWx0ZXJEaWFsb2dMaW5rIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZVZpZXcgSWNvbnMiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIlZpZXciKSB8IGh0bWwgJV06PC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFeHBhbmQiKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUFydGljbGUgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21FeHBhbmQ9MDtBcnRpY2xlUGFnZT1bJSBEYXRhLlBhZ2UgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0xO0FydGljbGVQYWdlPVslIERhdGEuUGFnZSB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgIFslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2hyb25pY2FsIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJFeHBhbmQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb2xsYXBzZSIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21FeHBhbmQ9MSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgIFslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2hyb25pY2FsIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDb2xsYXBzZSIpICVdClslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNocm9uaWNhbCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0xIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWJhcnMiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNob3cgYWxsIGFydGljbGVzIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDaHJvbmljYWwgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbCIpICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVMaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRMaXN0Ij4KICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZVRhYmxlQm9keSIgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY3JvbGxlciI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGlkPSJBcnRpY2xlVGFibGUiIGNsYXNzPSJEYXRhVGFibGUgWyUgRGF0YS5UYWJsZUNsYXNzZXMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlVucmVhZCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJObyBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJOby4iKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlR5cGUgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRGlyZWN0aW9uIFNvcnRhYmxlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEaXJlY3Rpb24iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1leGNoYW5nZSI+PC9pPjwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRnJvbSBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJGcm9tIikgfCBodG1sICVdPC9hPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJTdWJqZWN0IFNvcnRhYmxlIj48YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNyZWF0ZWQgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQXR0YWNobWVudHMgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iWyUgRGF0YS5TZW5kZXJUeXBlIHwgaHRtbCAlXS1bJSBEYXRhLkFydGljbGVUeXBlIHwgaHRtbCAlXSBbJSBEYXRhLkNsYXNzUm93IHwgaHRtbCAlXSIgaWQ9IlJvd1slIERhdGEuQ291bnQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0gVW5yZWFkQXJ0aWNsZXMgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUltcG9ydGFudEFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW1wb3J0YW50QXJ0aWNsZXMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXTwvZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtSW1wb3J0YW50QXJ0aWNsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVW5yZWFkIEFydGljbGUhIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5ld0FydGljbGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbU5vTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJOb0NvbnRlbnQiPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtTm9OZXdBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iTm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvdW50IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iQXJ0aWNsZUluZm8iIG5hbWU9IkxpbmtbJSBEYXRhLkNvdW50IHwgdXJpICVdIiB2YWx1ZT0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtTdWJhY3Rpb249QXJ0aWNsZVVwZGF0ZTtDb3VudD1bJSBEYXRhLkNvdW50IHwgdXJpICVdO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJUeXBlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5TZW5kZXJUeXBlKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBUcmFuc2xhdGUoRGF0YS5BcnRpY2xlVHlwZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIFRyYW5zbGF0ZShEYXRhLlNlbmRlclR5cGUpIHwgaHRtbCAlXSAmbmRhc2g7IFslIFRyYW5zbGF0ZShEYXRhLkFydGljbGVUeXBlKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkRpcmVjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGlyZWN0aW9uIEluY29taW5nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbWluZyBtZXNzYWdlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1sb25nLWFycm93LWxlZnQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjAiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbkluY29taW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gT3V0Z29pbmciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk91dGdvaW5nIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWxvbmctYXJyb3ctcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjEiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbk91dGdvaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25JbnRlcm5hbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gSW50ZXJuYWwiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkludGVybmFsIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iMiIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtRGlyZWN0aW9uSW50ZXJuYWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJGcm9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCB0cnVuY2F0ZSgzNCkgfCBodG1sICVdPC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iU29ydERhdGEiIHZhbHVlPSJbJSBEYXRhLkZyb20gfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJTdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5TdWJqZWN0IHwgdHJ1bmNhdGUoMzYpIHwgaHRtbCAlXTwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ3JlYXRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvYT4KIyBJbmNsdWRlIGN1c3RvbSBzb3J0aW5nIGluZm9ybWF0aW9uOiBkYXRlIGluIElTTyBmb3JtYXQuCiMgT3RoZXIgZGF0ZSBmb3JtYXRzIGNhbm5vdCBiZSBzb3J0ZWQgcmVsaWFibHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ3JlYXRlZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkF0dGFjaG1lbnRzIEF0dGFjaG1lbnQgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUF0dGFjaG1lbnQiKSAlXQpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJlZUl0ZW1BdHRhY2htZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1Ob0F0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTm9Db250ZW50Ij48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5vQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGFuZGxlIHVpLXJlc2l6YWJsZS1oYW5kbGUgdWktcmVzaXphYmxlLXMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiUmVzaXplIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hyb25pY2FsVmlldyIpICVdCgogICAgICAgIDxkaXYgY2xhc3M9IkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIEhpZGRlbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iVGlja2V0QWN0aW9ucyBBcnRpY2xlSURfWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIj4KWyUgUFJPQ0VTUyBBcnRpY2xlQWN0aW9uTWVudS50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ2hyb25pY2FsVmlld0FydGljbGVBdHRhY2htZW50cyBIaWRkZW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaHJvbmljYWxWaWV3QXJ0aWNsZUF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUF0dGFjaG1lbnRzIEFydGljbGVJRF9bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iPgpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbFZpZXdBcnRpY2xlQXR0YWNobWVudHMiKSAlXQogICAgICAgIDwvZGl2PgoKICAgICAgICA8dWwgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxsaSBpZD0iVGVtcGxhdGVMaXN0SXRlbSI+CiAgICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbXBvcnRhbnQiKSB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8ZW0+PC9lbT4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJUeXBlIj48L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj48c3Bhbj48L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJTaG93RnVsbEFydGljbGVUZXh0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IEZ1bGwgVGV4dCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zZWFyY2gtcGx1cyI+PC9pPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KCiAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVBcnRpY2xlRGF0YSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic3ViamVjdCI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06IDwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZnJvbSI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIkZyb20iKSB8IGh0bWwgJV06IDwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0idG8iPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+WyUgVHJhbnNsYXRlKCJUbyIpIHwgaHRtbCAlXTogPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjYyI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIkNjIikgfCBodG1sICVdOiA8L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImJjYyI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIkJjYyIpIHwgaHRtbCAlXTogPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIaWRkZW4gRnVsbEFydGljbGVQbGFpblRleHQiIGRhdGEtdGl0bGU9IlslIFRyYW5zbGF0ZSgiRnVsbCBBcnRpY2xlIFRleHQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2hyb25pY2FsUGxhaW5UZXh0Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJQbGFpblRleHQiPjwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIEFydGljbGVJRnJhbWUiIGRhdGEtdGl0bGU9IlslIFRyYW5zbGF0ZSgiRnVsbCBBcnRpY2xlIFRleHQiKSB8IGh0bWwgJV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJDaHJvbmljYWxWaWV3IFslIElGIERhdGEuVXNlQXJ0aWNsZUNvbG9ycyAlXVVzZUFydGljbGVDb2xvcnNbJSBFTkQgJV0iPgogICAgICAgICAgICA8dWwgY2xhc3M9Ikxpc3RMZWZ0Ij4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTm9FdmVudHMiPlslIFRyYW5zbGF0ZSgiTm8gbW9yZSBldmVudHMgZm91bmQuIFBsZWFzZSB0cnkgY2hhbmdpbmcgdGhlIGZpbHRlciBzZXR0aW5ncy4iKSB8IGh0bWwgJV08L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8dWwgY2xhc3M9Ikxpc3RSaWdodCI+PC91bD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+PC9zcGFuPgogICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKWyUgSUYgQ29uZmlnKCJDaHJvbmljYWxWaWV3RW5hYmxlZCIpID09IDEgJV0KCnZhciBMaXN0T2JqZWN0cyA9IFsKWyUgRk9SRUFDSCBJdGVtIElOIERhdGEuSXRlbXMgJV0KICAgIHsKICAgICAgICAnb3JpZW50YXRpb24nICAgOiBbJSBJdGVtLk9yaWVudGF0aW9uIHwgSlNPTiAlXSwKICAgICAgICAnb3JkZXInICAgICAgICAgOiBbJSBJdGVtLkNvdW50ZXIgfCBKU09OICVdLAogICAgICAgICdpZCcgICAgICAgICAgICA6ICJbJSBJRiBJdGVtLkFydGljbGVJRCAlXUFydGljbGVJRF9bJSBJdGVtLkFydGljbGVJRCAlXVslIEVORCAlXSIsCiAgICAgICAgJ2NsYXNzJyAgICAgICAgIDogWyUgSXRlbS5DbGFzcyB8IEpTT04gJV0sCiAgICAgICAgJ3RpbWUnICAgICAgICAgIDogWyUgSXRlbS5DcmVhdGVUaW1lIHwgSlNPTiAlXSwKICAgICAgICAndGltZV9sb25nJyAgICAgOiBbJSBJdGVtLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSB8IEpTT04gJV0sCiAgICAgICAgJ3R5cGUnICAgICAgICAgIDogWyUgSXRlbS5IaXN0b3J5VHlwZSB8IEpTT04gJV0sCiAgICAgICAgJ3R5cGVfcmVhZGFibGUnIDogWyUgSXRlbS5IaXN0b3J5VHlwZVJlYWRhYmxlIHwgSlNPTiAlXSwKICAgICAgICAnbmFtZScgICAgICAgICAgOiBbJSBJdGVtLk5hbWUgfCBKU09OICVdLAogICAgICAgICdhcnRpY2xlX2lkJyAgICA6IFslIEl0ZW0uQXJ0aWNsZUlEIHwgSlNPTiAlXSwKICAgICAgICAnaXNfY2hhdCcgICAgICAgOiBbJSBJdGVtLklzQ2hhdEFydGljbGUgfCBKU09OICVdLAogICAgICAgICdhcnRpY2xlX2RhdGEnICA6IHsKICAgICAgICBbJSBJRiBJdGVtLkFydGljbGVJRCAlXQogICAgICAgICAgICAnc3ViamVjdCc6IFslIEl0ZW0uQXJ0aWNsZURhdGEuU3ViamVjdCB8IHRydW5jYXRlKDc1KSB8IEpTT04gJV0sCiAgICAgICAgICAgICdmcm9tJyAgIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5Gcm9tIHwgdHJ1bmNhdGUoNzUpIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3RvJyAgICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLlRvIHwgdHJ1bmNhdGUoNzUpIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2NjJyAgICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLkNjIHwgdHJ1bmNhdGUoNzUpIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2JjYycgICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLkJjYyB8IHRydW5jYXRlKDc1KSB8IEpTT04gJV0sCiAgICAgICAgICAgICdpc19pbXBvcnRhbnQnIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5BcnRpY2xlSXNJbXBvcnRhbnQgfCBKU09OICVdLAogICAgICAgICAgICAndGV4dCcgICA6IFslIElGIEl0ZW0uSXNDaGF0QXJ0aWNsZSAlXVslIEl0ZW0uQXJ0aWNsZURhdGEuQm9keUNoYXQgfCBKU09OICVdWyUgRUxTRSAlXVslIEl0ZW0uQXJ0aWNsZURhdGEuQm9keSB8IHRydW5jYXRlKDIwMCkgfCBKU09OICVdWyUgRU5EICVdLAogICAgICAgICAgICAndGV4dF9sb25nJyA6IFslIElGIEl0ZW0uSXNDaGF0QXJ0aWNsZSAlXVslIEl0ZW0uQXJ0aWNsZURhdGEuQm9keSAlXVslIEVMU0UgJV1bJSBJRiAhSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5ICVdWyUgSXRlbS5BcnRpY2xlRGF0YS5Cb2R5IHwgSlNPTiAlXVslIEVMU0UgJV0iIlslIEVORCAlXVslIEVORCAlXSwKICAgICAgICAgICAgJ2F0dGFjaG1lbnRfaWQnIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2lmcmFtZV9odG1sJyA6ICc8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyIgZGF0YS11cmw9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O0FydGljbGVJRD1bJSBJdGVtLkFydGljbGVJRCB8IGh0bWwgJV07RmlsZUlEPVslIEl0ZW0uQXJ0aWNsZURhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSB8IGh0bWwgJV07WyUgRW52KCJTZXNzaW9uTmFtZSIpIHwgaHRtbCAlXT1bJSBFbnYoIlNlc3Npb25JRCIpIHwgaHRtbCAlXSIgWyUgRGF0YS5NU1NlY3VyaXR5UmVzdHJpY3RlZCAlXSB3aWR0aD0iMTAwJSIgZnJhbWVib3JkZXI9IjAiIGlkPSJJZnJhbWVbJSBJdGVtLkFydGljbGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJDaHJvbmljYWxBcnRpY2xlaUZyYW1lIiBzcmM9IiI+PC9pZnJhbWU+JwogICAgICAgIFslIEVORCAlXQogICAgICAgIH0KICAgIH1bJSBJRiAhbG9vcC5sYXN0ICVdLFslIEVORCAlXQpbJSBFTkQgJV0KXTsKCkNvcmUuQWdlbnQuVGlja2V0Wm9vbS5DaHJvbmljYWxWaWV3LkluaXQoTGlzdE9iamVjdHMpOwoKWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93U2VsZWN0ZWRBcnRpY2xlIikgJV0KaWYgKCQoJyNBcnRpY2xlX1slIERhdGEuQXJ0aWNsZUlEICVdJykubGVuZ3RoKSB7CiAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogKCQoJyNBcnRpY2xlX1slIERhdGEuQXJ0aWNsZUlEICVdJykub2Zmc2V0KCkudG9wKX0sIDApOwp9ClslIFJlbmRlckJsb2NrRW5kKCJTaG93U2VsZWN0ZWRBcnRpY2xlIikgJV0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hyb25pY2FsVmlldyIpICVdCgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHJlZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlSXRlbSIpICVdCjxkaXY+CiAgICA8YSBuYW1lPSJBcnRpY2xlWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIj48L2E+CiAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRXhwYW5kZWQgWyUgRGF0YS5TZW5kZXJUeXBlIHwgaHRtbCAlXS1bJSBEYXRhLkFydGljbGVUeXBlIHwgaHRtbCAlXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSIpIHwgaHRtbCAlXSAjWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbEluZm9ybWF0aW9uIFNwYWNpbmdMb2FkZXIiPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOiBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUNyZWF0ZWRCeSIpICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoImJ5IikgfCBodG1sICVdIFslIERhdGEuQ3JlYXRlZEJ5VXNlciB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVDcmVhdGVkQnkiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KClslIFBST0NFU1MgQXJ0aWNsZUFjdGlvbk1lbnUudHQgJV0KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVNYWlsSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd1JlY2lwaWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuUmVhbG5hbWUgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd1JlY2lwaWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0RhdGEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVmFsdWUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dEYXRhIikgJV0KCiMgc2hvdyBhcnRpY2xlIGR5bmFtaWMgZmllbGRzClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDFMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGQxTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvcD4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMkxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMkxpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQyIikgJV0KCiMgc2hvdyBhcnRpY2xlIG9wdGlvbnMgbGlrZSBzaWduZWQsIGNyeXB0ZWQsIC4uLgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlT3B0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXSBWYWx1ZSI+WyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlT3B0aW9uIikgJV0KCiMgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5jbHVkZSB0aGUgZnVsbCBzdWJqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIGNvcGllZC4gVGhlIG9uZSBpbiB0aGUgdGl0bGUgYmFyIGlzIHNob3J0ZW5lZC4gLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIHNob3cgYXJ0aWNsZSBhY2NvdW50ZWQgdGltZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlZhbHVlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQWNjb3VudGVkVGltZSIpICVdCgojIHNob3cgYXR0YWNobWVudHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50Um93TGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiBbJSBEYXRhLlRhcmdldCAlXSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQWN0aW9uKSB8IGh0bWwgJV0iPlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdPC9hPiBbJSBEYXRhLkRhdGFGaWxlU2l6ZSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93TGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0sIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZU1haWxDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQm9keVBsYWluIikgJV0KWyUgRGF0YS5Cb2R5Tm90ZSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUJvZHkiPgpbJSBEYXRhLkJvZHkgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keVBsYWluIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQm9keUhUTUwiKSAlXQogICAgICAgICAgICAgICAgPGRpdj4KIyBleGVjdXRlIElGcmFtZSBKUyBhc3luY2hyb25vdXNseS4gT3RoZXJ3aXNlIGl0IGNvdWxkIGhhcHBlbiBiZWZvcmUgb3VyIEFQSSB3YXMgbG9hZGVkCiMgVXNlIHRoZSBIVE1MNSBzYW5kYm94IGF0dHJpYnV0ZSB0byBwcmV2ZW50IHBsdWdpbnMgYW5kIHNjcmlwdHMgZnJvbSBiZWluZyBleGVjdXRlZCBpbiB0aGUgYnJvd3Nlci4KIyBVc2UgSUUncyAobm9uLXN0YW5kYXJkKSBzZWN1cml0eSBhdHRyaWJ1dGUgdG8gYWNoaWV2ZSBzb21ldGhpbmcgc2ltaWxhciBpbiBvbGRlciBJRSBicm93c2Vycy4gQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwogICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzIiBbJSBEYXRhLk1TU2VjdXJpdHlSZXN0cmljdGVkICVdIHdpZHRoPSIxMDAlIiBmcmFtZWJvcmRlcj0iMCIgaWQ9IklmcmFtZVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSIgb25sb2FkPSJ3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCl7IGlmICh0eXBlb2YgQ29yZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIENvcmUuQWdlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBDb3JlLkFnZW50LlRpY2tldFpvb20gPT09ICdvYmplY3QnKSB7IENvcmUuQWdlbnQuVGlja2V0Wm9vbS5JZnJhbWVBdXRvSGVpZ2h0KCQoJyNJZnJhbWVbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0nKSk7IH0gfSwgNTAwKTsiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXTtGaWxlSUQ9WyUgRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUhUTUwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5Q2hhdCIpICVdClslIElOQ0xVREUgIkNoYXREaXNwbGF5LnR0IiAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUNoYXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUl0ZW1NYXJrQXNTZWVuIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5NYXJrQXNTZWVuKFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdLCBbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVJdGVtTWFya0FzU2VlbiIpICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlSXRlbSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRJdGVtTWFya0FzU2VlbiIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLkFnZW50LlRpY2tldFpvb20uTWFya1RpY2tldEFzU2VlbihbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0SXRlbU1hcmtBc1NlZW4iKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0Wm9vbUluaXQiKSAlXQoKWyUgSU5DTFVERSAiQ2hhdFN0YXJ0Rm9ybS50dCIgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLkFnZW50LlRpY2tldFpvb20uSW5pdCh7IEFydGljbGVUYWJsZUhlaWdodDogcGFyc2VJbnQoJ1slIEVudigiVXNlclRpY2tldFpvb21BcnRpY2xlVGFibGVIZWlnaHQiKSAlXScsIDEwKX0pOwogICAgQ29yZS5Db25maWcuU2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodERlZmF1bHQnLCBwYXJzZUludCgiWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodERlZmF1bHQiKSAlXSIgfHwgMCwgMTApKTsKICAgIENvcmUuQ29uZmlnLlNldCgnVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHRNYXgnLCBwYXJzZUludCgiWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodE1heCIpICVdIiB8fCAwLCAxMCkpOwogICAgQ29yZS5Db25maWcuU2V0KCdMYW5ndWFnZS5BdHRhY2htZW50Vmlld01lc3NhZ2UnLCAnWyUgVHJhbnNsYXRlKCdBcnRpY2xlIGNvdWxkIG5vdCBiZSBvcGVuZWQhIFBlcmhhcHMgaXQgaXMgb24gYW5vdGhlciBhcnRpY2xlIHBhZ2U/JykgJV0nKTsKCiAgICAkKCdhLkNyZWF0ZUNoYXRSZXF1ZXN0JykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgVXNlcklEID0gJCh0aGlzKS5kYXRhKCd1c2VyLWlkJyksCiAgICAgICAgICAgICREaWFsb2cgPSAkKCcjRGFzaGJvYXJkVXNlck9ubGluZUNoYXRTdGFydERpYWxvZycpLmNsb25lKCk7CgogICAgICAgICREaWFsb2cuZmluZCgnaW5wdXRbbmFtZT1DaGF0U3RhcnRVc2VySURdJykudmFsKCQodGhpcykuZGF0YSgndXNlci1pZCcpKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJ2lucHV0W25hbWU9Q2hhdFN0YXJ0VXNlclR5cGVdJykudmFsKCQodGhpcykuZGF0YSgndXNlci10eXBlJykpOwogICAgICAgICREaWFsb2cuZmluZCgnaW5wdXRbbmFtZT1DaGF0U3RhcnRVc2VyRnVsbG5hbWVdJykudmFsKCQodGhpcykuZGF0YSgndXNlci1mdWxsbmFtZScpKTsKCiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJERpYWxvZy5odG1sKCksIFslIFRyYW5zbGF0ZSgnU3RhcnQgY2hhdCcpIHwgSlNPTiAlXSwgJzEwMHB4JywgJ0NlbnRlcicsIHRydWUpOwoKICAgICAgICAvLyBPbmx5IGVuYWJsZSBidXR0b24gaWYgdGhlcmUgaXMgYSBtZXNzYWdlCiAgICAgICAgJCgnLkRpYWxvZyBpbnB1dFtuYW1lPSJDaGF0U3RhcnRGaXJzdE1lc3NhZ2UiXScpLm9uKCdrZXl1cCcsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICQoJy5EaWFsb2cgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCAkKHRoaXMpLnZhbCgpLmxlbmd0aCA/IGZhbHNlIDogdHJ1ZSApOwogICAgICAgIH0pOwoKICAgICAgICAkKCcuRGlhbG9nIGZvcm0nKS5vbignc3VibWl0JywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYgKCEkKCcuRGlhbG9nIGlucHV0W25hbWU9Q2hhdFN0YXJ0Rmlyc3RNZXNzYWdlXScpLnZhbCgpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsb3NlIGFmdGVyIHN1Ym1pdAogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZycpKTsKICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFpvb21Jbml0IikgJV0K
IyAtLQojIEN1c3RvbWVyVGlja2V0UHJpbnQudHQgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQ3VzdG9tZXJUaWNrZXRQcmludC50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIC8gWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48c21hbGw+WyUgVHJhbnNsYXRlKCJUaWNrZXQgUHJpbnQiKSB8IGh0bWwgJV08L3NtYWxsPjwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjYwJSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U3RhdGUiKSAlXQojIC0tLQojIElUU00KIyAtLS0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFByaW9yaXR5IikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRQcmlvcml0eSIpICVdCiMgLS0tClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFF1ZXVlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFF1ZXVlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJTTEEiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5TTEEgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPd25lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuT3duZXIgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRPd25lciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5SZXNwb25zaWJsZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFJlc3BvbnNpYmxlIikgJV0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkNyaXRpY2FsaXR5IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPlslIERhdGEuQWdlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjxiPjxpPlslIFRyYW5zbGF0ZSgiVGlja2V0IER5bmFtaWMgRmllbGRzIikgfCBodG1sICVdPC9pPjwvYj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZEhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgSW5mbyIpIHwgaHRtbCAlXToKICAgICAgICAgICAgWyUgRGF0YS5DdXN0b21lclRhYmxlICVdCiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gc3RhcnQgdGlja2V0IFslIERhdGEuVGlja2V0TnVtYmVyICVdIC0tPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlIikgJV0KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjMDAwMDAwIiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDx0cj4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEiIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTAwJSIgY2xhc3M9InNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgfCB0cnVuY2F0ZSgxNjApIHwgaHRtbCAlXTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0gWyUgVHJhbnNsYXRlKCJieSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5TZW5kZXJUeXBlKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyBzaG93IER5bmFtaWMgRmllbGRzIGZvciBlYWNoIEFydGljbGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiBbJSBUcmFuc2xhdGUoRGF0YS5BcnRpY2xlVHlwZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IFslIERhdGEuaXRlbSgiQXJ0aWNsZTo6QVRNIikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KWyUgSUYgRGF0YS5Jc0NoYXQgPT0gMSAlXQpbJSBJTkNMVURFICJDaGF0RGlzcGxheS50dCIgJV0KWyUgRUxTRSAlXQpbJSBEYXRhLlRleHROb3RlICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+ClslIERhdGEuQm9keSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZW5kIHRpY2tldCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGUiKSAlXQo=
IyAtLQojIEN1c3RvbWVyVGlja2V0Wm9vbS50dCAtIHByb3ZpZGVzIEhUTUwgVGlja2V0Wm9vbSBmb3IgQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzM2MDhiNjA2MjU5YWNlNjFmZWRiYjgyZjk0MjczZDZhYmVmYzY5NzIvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0N1c3RvbWVyVGlja2V0Wm9vbS50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8ZGl2IGlkPSJNYWluQm94IiBjbGFzcz0iVGlja2V0Wm9vbSBBUklBUm9sZU1haW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYWNrIikgJV0KICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXVslIEVudigiTGFzdFNjcmVlbk92ZXJ2aWV3IikgJV0iPiZsYXJyOyBbJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQmFjayIpICVdCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRIZWFkZXIiPgogICAgICAgICAgICA8aDIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJpb3JpdHlGbGFnIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj48c3BhbiBjbGFzcz0iUHJpb3JpdHlJRC1bJSBEYXRhLlByaW9yaXR5SUQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHlGbGFnIikgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgIDx1bCBpZD0iVGlja2V0T3B0aW9ucyI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmludCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0UHJpbnQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXSIgY2xhc3M9IlByaW50IEFzUG9wdXAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlByaW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXByaW50Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiUHJpbnQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByaW50IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cGFuZCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO1pvb21FeHBhbmQ9WyUgRGF0YS5ab29tRXhwYW5kIHwgdXJpICVdIiBjbGFzcz0iWm9vbUV4cGFuZCBFeHBhbmRbJSBEYXRhLkV4cGFuZE9wdGlvbiAlXSJ9IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5FeHBhbmRUZXh0KSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtYmFycyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuRXhwYW5kVGV4dCkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJab29tRXhwYW5kIiBpZD0iWm9vbUV4cGFuZCIgdmFsdWU9IlslIERhdGEuWm9vbUV4cGFuZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwYW5kIikgJV0KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSNGb2xsb3dVcCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iUmVwbHlDdXN0b21lclRpY2tldCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPHVsIGlkPSJNZXNzYWdlcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLlNlbmRlclR5cGUgfCBodG1sICVdLVslIERhdGEuQXJ0aWNsZVR5cGUgfCBodG1sICVdIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVDb250cmFjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1RpY2tldE51bWJlcj1bJSBEYXRhLlRpY2tldE51bWJlciB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iPlslIERhdGEuRnJvbVJlYWxuYW1lIHwgaHRtbCAlXSAmbmRhc2g7IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkV4cGFuZCBhcnRpY2xlIikgfCBodG1sICVdLi4uIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPjwvYT48L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUNvbnRyYWN0ZWQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUV4cGFuZGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1RpY2tldE51bWJlcj1bJSBEYXRhLlRpY2tldE51bWJlciB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iPlslIERhdGEuRnJvbVJlYWxuYW1lIHwgaHRtbCAlXSAmbmRhc2g7IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPjwvYT48L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUV4cGFuZGVkIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJBZ2UiIHRpdGxlPSJbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSB8IGh0bWwgJV0iPlslIERhdGEuQWdlICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZVN0YXRlIiB2YWx1ZT0idW50b3VjaGVkIiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VCb2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRGV0YWlscyBTZXBlcmF0b3JSb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvZGl2PiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuUmVhbG5hbWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9kaXY+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKIyBzaG93IGFydGljbGUgZHluYW1pYyBmaWVsZHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIiB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiIHRpdGxlPSJbJSBEYXRhLkxhYmVsIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIiB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYWJlbCI+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGFwZXJjbGlwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEb3dubG9hZEF0dGFjaG1lbnQiIHRpdGxlPSJbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAtIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIERhdGEuTGluayAlXSIgWyUgRGF0YS5UYXJnZXQgJV0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkFjdGlvbikgfCBodG1sICVdIj5bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXTwvYT4sIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSwgWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5UGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Cb2R5Tm90ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQm9keSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCb2R5UGxhaW4iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5SFRNTExvYWQiKSAlXQojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgVXNlIElFJ3MgKG5vbi1zdGFuZGFyZCkgc2VjdXJpdHkgYXR0cmlidXRlIHRvIGFjaGlldmUgc29tZXRoaW5nIHNpbWlsYXIgaW4gb2xkZXIgSUUgYnJvd3NlcnMuIEFwcGVuZCBzZXNzaW9uIGluZm8gdG8gVVJMIGJlY2F1c2UgSUUgd2lsbCBub3Qgc2VuZCBjb29raWVzLgojIFNldCAnYWxsb3ctcG9wdXBzJyB0byBhbGxvdyBJRTEwKyB0byBvcGVuIGxpbmtzLiByZWY6IGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvd2lraS9DaGFuZ2VQcm9wb3NhbHMvc2FuZGJveF9hbGxvd19wb3B1cHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzIiBbJSBEYXRhLk1TU2VjdXJpdHlSZXN0cmljdGVkICVdIHRpdGxlPSJhYm91dDpibGFuayIgZnJhbWVib3JkZXI9IjAiIGlkPSJWaXNpYmxlRnJhbWUiIGNsYXNzPSJWaXNpYmxlRnJhbWUiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXTtGaWxlSUQ9WyUgRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvZHlIVE1MTG9hZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlIVE1MUGxhY2Vob2xkZXIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZXJlIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBzZXNzaW9uIGluZm8gaWYgY29va2llcyBhcmUgZGlzYWJsZWQsIGJlY2F1c2UgdGhlIGxheW91dCBvYmplY3QgY2Fubm90IGF1dG9tYXRpY2FsbHkgZG8gdGhhdCBoZXJlLCBsaWtlIGluIHRoZSBvdGhlciBpZnJhbWUgKG9ubHkgZm9yIHNyYyBhdHRyaWJ1dGUpLiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4iIFslIERhdGEuTVNTZWN1cml0eVJlc3RyaWN0ZWQgJV0gc3JjPSJhYm91dDpibGFuayIgZnJhbWVib3JkZXI9IjAiIHRpdGxlPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdO0ZpbGVJRD1bJSBEYXRhLkF0dGFjaG1lbnRJRE9mSFRNTEJvZHkgfCBodG1sICVdO1slIERhdGEuU2Vzc2lvbkluZm9ybWF0aW9uIHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvZHlIVE1MUGxhY2Vob2xkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5Q2hhdCIpICVdClslIElOQ0xVREUgIkNoYXREaXNwbGF5LnR0IiAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUNoYXQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlIikgJV0KICAgICAgICAgICAgPC91bD4gPCEtLSAvTWVzc2FnZXMgLS0+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQXJ0aWNsZXMiKSAlXQogICAgICAgICAgICA8dWwgaWQ9Ik5vQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBpdGVtIGhhcyBubyBhcnRpY2xlcyB5ZXQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9BcnRpY2xlcyIpICVdCiAgICAgICAgICAgIDxkaXYgaWQ9Ilpvb21TaWRlYmFyIj4KICAgICAgICAgICAgICAgIDx1bCBpZD0iTWV0YWRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+WyUgVHJhbnNsYXRlKCJJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIERhdGEuSG9vayB8IGh0bWwgJV06PC9zcGFuPiA8c3Bhbj5bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L3NwYW4+PC9saT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU2VydmljZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TZXJ2aWNlKSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlNMQSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TTEEpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU0xBKSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9zcGFuPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJTdGF0ZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KIyAtLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByaW9yaXR5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUXVldWUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCB8IHJlcGxhY2UoJzo6JywgJzx3YnI+Ojo8d2JyPicpICVdPC9zcGFuPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJRdWV1ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L3NwYW4+IFslIERhdGEuT3duZXJOYW1lIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L3NwYW4+IFslIERhdGEuUmVzcG9uc2libGVOYW1lIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NEYXRhIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJQcm9jZXNzIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuUHJvY2VzcyB8IGh0bWwgJV0iPlslIERhdGEuUHJvY2VzcyB8IGh0bWwgJV08L3NwYW4+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKCJBY3Rpdml0eSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLkFjdGl2aXR5IHwgaHRtbCAlXSI+WyUgRGF0YS5BY3Rpdml0eSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NEYXRhIikgJV0KCiMgLS0tCiMgSVRTTQojIC0tLQojIyBzaG93IHRpY2tldCBkeW5hbWljIGZpZWxkcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGxpPgojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IktleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZTIgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICA8L2xpPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5leHRBY3Rpdml0aWVzIikgJV0KICAgICAgICAgICAgICAgIDx1bCBpZD0iQWN0aXZpdGllcyI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIk5leHQgU3RlcHMiKSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIHRpdGxlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249Q3VzdG9tZXJUaWNrZXRQcm9jZXNzO1N1YmFjdGlvbj1EaXNwbGF5QWN0aXZpdHlEaWFsb2c7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtQcm9jZXNzRW50aXR5SUQ9WyUgRGF0YS5Qcm9jZXNzRW50aXR5SUQgfCB1cmkgJV07QWN0aXZpdHlEaWFsb2dFbnRpdHlJRD1bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGl2aXR5RGlhbG9nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9BY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgiVGhlcmUgYXJlIG5vIGRpYWxvZ3MgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIikgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIk5leHRBY3Rpdml0aWVzIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwIikgJV0KICAgICAgICAgICAgPGRpdiBpZD0iRm9sbG93VXAiIGNsYXNzPSJbJSBEYXRhLkZvbGxvd1VwVmlzaWJsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iTWVzc2VuZ2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IkRvbnRQcmludCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJEb250UHJpbnQiIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSaWNoVGV4dCIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0iIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IERvbnRQcmludCBWYWxpZGF0ZV9SZXF1aXJlZFJpY2hUZXh0IFslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iQm9keSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IkRvbnRQcmludCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkF0dGFjaG1lbnRIb2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXR0YWNobWVudCI+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHRpdGxlPSJBdHRhY2htZW50IiBpZD0iQXR0YWNobWVudCIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudFVwbG9hZCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IjAiIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNBdHRhY2htZW50JykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBdHRhY2htZW50IiB0aXRsZT0iWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0gLSBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiAvPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICAkKCcjQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLnZhbCgxKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLnRyaWdnZXIoJ3N1Ym1pdCcpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcEF0dGFjaG1lbnQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+IFslIERhdGEuTmV4dFN0YXRlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU3RhdGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNSZXBseUN1c3RvbWVyVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1N0YXRlSUQnLCBbICdQcmlvcml0eUlEJywgJ1RpY2tldElEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4gWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUHJpb3JpdHlJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNSZXBseUN1c3RvbWVyVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1ByaW9yaXR5SUQnLCBbICdTdGF0ZUlEJywgJ1RpY2tldElEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwUHJpb3JpdHkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcER5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4gWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXSA8YSBpZD0iQ2xvc2VCdXR0b24iIGhyZWY9IiI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxhIGlkPSJSZXBseUJ1dHRvbiIgY2xhc3M9IkRvbnRQcmludCIgaHJlZj0iIj48aSBjbGFzcz0iZmEgZmEtcmVwbHkiPjwvaT4gWyUgVHJhbnNsYXRlKCJSZXBseSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2Zvcm0+CgogICAgPC9kaXY+CjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIENvcmUuQ3VzdG9tZXIuVGlja2V0Wm9vbS5Jbml0KCk7CiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Cjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi8zNjA4YjYwNjI1OWFjZTYxZmVkYmI4MmY5NDI3M2Q2YWJlZmM2OTcyL0tlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0T3ZlcnZpZXdNZWRpdW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IFwlUGFyYW07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBFbmNvZGVPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFRpY2tldE9iamVjdCBNYWluT2JqZWN0IFF1ZXVlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZC0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9CiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZWRpdW0iKS0+e0R5bmFtaWNGaWVsZH07CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFjdGlvblJvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvd0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGsnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gdGlja2V0IG92ZXJ2aWV3IGRvY3VtZW50IGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NvbmZpZ30tPntPdmVydmlld01lbnVNb2R1bGVzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlTWVudXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgfTsKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkTWVudXN7JE1lbnV9ICk7CiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAoICRNZW51c3skTWVudX0tPntWaWV3fSAmJiAkTWVudXN7JE1lbnV9LT57Vmlld30gbmUgJFBhcmFte1ZpZXd9ICk7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSXRlbSk7CgogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9IGVxICdEb2N1bWVudEFjdGlvblJvd0l0ZW0nICkgewoKICAgICAgICAgICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9fiBzLyhcc3wmfDspLy9pZzsKCiAgICAgICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SFRNTCcgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkSXRlbS0+e0hUTUx9OwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGluaXQgZm9yIHRhYmxlIGNvbnRyb2wKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeVN0YXJ0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNvcnRPcmRlckJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJzsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRpY2tldElEcyBQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXRNZXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICBteSAkT3V0cHV0UmF3ID0gJyc7CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgfQogICAgbXkgJE91dHB1dCAgICAgICAgPSAnJzsKICAgIG15ICRDb3VudGVyICAgICAgID0gMDsKICAgIG15ICRDb3VudGVyT25TaXRlID0gMDsKICAgIG15IEBUaWNrZXRJRHNTaG93bjsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSB0aWNrZXRzIHRvIHNob3cKICAgIGlmICggc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9CiAgICAgICAgICAgICAgICAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzU2hvd24sICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyT25TaXRlLAogICAgICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+ICRPdXRwdXQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJHskT3V0cHV0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ05vVGlja2V0Rm91bmQnICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEc1Nob3duKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEZvb3RlckJ1bGtJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0TWV0YSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TWV0YTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgYWN0aW9uIHJvdyBqcyBkYXRhCgogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCnN1YiBfU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlTGFzdEN1c3RvbWVyQXJ0aWNsZSgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICApOwoKICAgICMgRmFsbGJhY2sgZm9yIHRpY2tldHMgd2l0aG91dCBhcnRpY2xlczogZ2V0IGF0IGxlYXN0IGJhc2ljIHRpY2tldCBkYXRhCiAgICBpZiAoICElQXJ0aWNsZSApIHsKICAgICAgICAlQXJ0aWNsZSA9ICVUaWNrZXQ7CiAgICAgICAgaWYgKCAhJEFydGljbGV7VGl0bGV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtUaXRsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdUaGlzIHRpY2tldCBoYXMgbm8gdGl0bGUgb3Igc3ViamVjdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkQXJ0aWNsZXtUaXRsZX07CiAgICB9CgogICAgIyBzaG93IHRpY2tldCBjcmVhdGUgdGltZSBpbiBjdXJyZW50IHZpZXcKICAgICRBcnRpY2xle0NyZWF0ZWR9ID0gJFRpY2tldHtDcmVhdGVkfTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHNldCBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAkQXJ0aWNsZXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAnLSc7CiAgICAkQXJ0aWNsZXtJbXBhY3R9ICAgICAgPSAkQXJ0aWNsZXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQXJ0aWNsZXtPd25lcklEfSwKICAgICk7CiAgICAlQXJ0aWNsZSA9ICggJVVzZXJJbmZvLCAlQXJ0aWNsZSApOwoKICAgICMgY3JlYXRlIGh1bWFuIGFnZQogICAgJEFydGljbGV7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoIEFnZSA9PiAkQXJ0aWNsZXtBZ2V9LCBTcGFjZSA9PiAnICcgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcyAuLi4KICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSB8fCB7fSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57Q3VzdG9tZXJJbmZvfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Q3VzdG9tZXJOYW1lfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgbXkgJUFjdGlvbnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXRzIHdpdGggQWdlbnRUaWNrZXQKICAgICAgICAlUG9zc2libGVBY3Rpb25zCiAgICAgICAgICAgID0gbWFwIHsgKyskQ291bnRlciA9PiAkXyB9CiAgICAgICAgICAgIGdyZXAgeyBzdWJzdHIoICRfLCAwLCBsZW5ndGggJ0FnZW50VGlja2V0JyApIGVxICdBZ2VudFRpY2tldCcgfQogICAgICAgICAgICBzb3J0IGtleXMgJUFjdGlvbnM7CiAgICB9CgogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgcHJlIG1lbnUgbW9kdWxlcwogICAgbXkgQEFjdGlvbkl0ZW1zOwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiByZWYgJEl0ZW0gbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbklEQ29va2llfSAmJiAkSXRlbS0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgbXkgJE91dHB1dDsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJzxsaSBpZD0iJwogICAgICAgICAgICAgICAgICAgIC4gJEl0ZW0tPntJRH0KICAgICAgICAgICAgICAgICAgICAuICciPjxhIGhyZWY9IiMiIHRpdGxlPSInCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyI+JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKQogICAgICAgICAgICAgICAgICAgIC4gJzwvYT48L2xpPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9cbisvL2c7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9ccysvIC9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvPFwhLS0uKz8tLT4vL2c7CgogICAgICAgICAgICBwdXNoIEBBY3Rpb25JdGVtcywgewogICAgICAgICAgICAgICAgSFRNTCAgICAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICBUYXJnZXQgICAgICA9PiAkSXRlbS0+e1RhcmdldH0sCiAgICAgICAgICAgICAgICBQb3B1cFR5cGUgICA9PiAkSXRlbS0+e1BvcHVwVHlwZX0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgc3ViamVjdAogICAgJEFydGljbGV7U3ViamVjdH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Q29udGVudCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICk7CgogICAgIyBpZiAiQWN0aW9ucyBwZXIgVGlja2V0IiAoSW5saW5lIEFjdGlvbiBSb3cpIGlzIGFjdGl2ZQogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvdycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIEFkZCBsaXN0IGVudHJpZXMgZm9yIGV2ZXJ5IGFjdGlvbgogICAgICAgIGZvciBteSAkSXRlbSAoQEFjdGlvbkl0ZW1zKSB7CiAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1RhcmdldH0gKSB7CiAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENsYXNzID0gJyc7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRUaWNrZXRJRCAgID0gJFBhcmFte1RpY2tldElEfTsKICAgICAgICAgICAgICAgIG15ICRTZWxlY3RIVE1MID0gJEl0ZW0tPntIVE1MfTsKICAgICAgICAgICAgICAgICRTZWxlY3RIVE1MID1+IHMvaWQ9IkRlc3RRdWV1ZUlEIi9pZD0iRGVzdFF1ZXVlSUQkVGlja2V0SUQiL3htaWc7CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2Zvcj0iRGVzdFF1ZXVlSUQiL2Zvcj0iRGVzdFF1ZXVlSUQkVGlja2V0SUQiL3htaWc7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvd0l0ZW1IVE1MJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSFRNTCA9PiAkU2VsZWN0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRQYXJhbXtCdWxrfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCdWxrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRpY2tldCBmbGFncwogICAgbXkgQFRpY2tldE1ldGFJdGVtcyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0TWV0YUl0ZW1zKAogICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICApOwogICAgZm9yIG15ICRJdGVtIChAVGlja2V0TWV0YUl0ZW1zKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWV0YScsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEl0ZW0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01ldGFJY29uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIGFydGljbGUgbW9kdWxlcwogICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjayggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlcicsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICYmICgKICAgICAgICAgICAgIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQiKTsKICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlclBob25lT3V0Ym91bmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggJEFydGljbGV7U0xBfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZmlyc3QgcmVzcG9uc2UgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHVwZGF0ZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1VwZGF0ZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7VXBkYXRlVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle1VwZGF0ZVRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHNvbHV0aW9uIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7U29sdXRpb25UaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgJENvdW50ZXIgPSAwOwogICAgbXkgJERpc3BsYXlEeW5hbWljRmllbGRUYWJsZSA9IDE7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBmaWVsZCB2YWx1ZQogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKTsKCiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAjIHNob3cgZHluYW1pYyBmaWVsZCB0YWJsZSBpZiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgZGlzcGxheWVkCiAgICAgICAgaWYgKCAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID09IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID0gMDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGEgbmV3IHJvdyBpZiBjb3VudGVyIGlzIHN0YXJ0aW5nCiAgICAgICAgaWYgKCAkQ291bnRlciA9PSAxICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IDUgZHluYW1pYyBmaWVsZHMgYnkgcm93IGFyZSBhbGxvd2VkLCByZXNldCBjb3V0ZXIgaWYgbmVlZGVkCiAgICAgICAgaWYgKCAkQ291bnRlciA9PSA1ICkgewogICAgICAgICAgICAkQ291bnRlciA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIHBsYWluCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHRoZSByZXN0IG9mIHRoZSBEeW5hbWljIEZpZWxkcyByb3cgd2l0aCBlbXB0eSBjZWxscywgdGhpcyB3aWxsIGxvb2sgYmV0dGVyCiAgICBpZiAoICRDb3VudGVyID4gMCAmJiAkQ291bnRlciA8IDUgKSB7CgogICAgICAgIGZvciAoICRDb3VudGVyICsgMSAuLi4gNSApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRlc3QgYWNjZXNzIHRvIGZyb250ZW5kIG1vZHVsZSBmb3IgQ3VzdG9tZXIKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldEN1c3RvbWVyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CiAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAjIHRlc3QgYWNjZXNzIHRvIHRpY2tldAogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDdXN0b21lcicpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgcHJvcGVyIERUTCBibG9jayBiYXNlZCBvbiBwZXJtaXNzaW9ucwogICAgbXkgJEN1c3RvbWVySURCbG9jayA9ICRBY2Nlc3MgPyAnQ3VzdG9tZXJJRFJXJyA6ICdDdXN0b21lcklEUk8nOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRDdXN0b21lcklEQmxvY2ssCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICk7CgogICAgIyBnZXQgTW92ZVF1ZXVlc1N0cmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1vdmVUeXBlJykgPX4gL15mb3JtJC9pICkgewogICAgICAgICRQYXJhbXtNb3ZlUXVldWVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0UXVldWVJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNb3ZlUXVldWVzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0TW92ZX0KICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAnbW92ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgYWN0aW9uIGl0ZW1zIGFzIGpzCiAgICBpZiAoIEBBY3Rpb25JdGVtcyAmJiAhJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBBY3Rpb25JdGVtcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgcmV0dXJuIFwkT3V0cHV0Owp9CjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld1ByZXZpZXcucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvMzYwOGI2MDYyNTlhY2U2MWZlZGJiODJmOTQyNzNkNmFiZWZjNjk3Mi9LZXJuZWwvT3V0cHV0L0hUTUwvVGlja2V0T3ZlcnZpZXdQcmV2aWV3LnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRPdmVydmlld1ByZXZpZXc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gXCVQYXJhbTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIFVzZXJPYmplY3QgR3JvdXBPYmplY3QgVGlja2V0T2JqZWN0IE1haW5PYmplY3QgUXVldWVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld1ByZXZpZXciKS0+e0R5bmFtaWNGaWVsZH07CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFjdGlvblJvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvd0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGsnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gdGlja2V0IG92ZXJ2aWV3IGRvY3VtZW50IGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NvbmZpZ30tPntPdmVydmlld01lbnVNb2R1bGVzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlTWVudXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgfTsKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkTWVudXN7JE1lbnV9ICk7CiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAoICRNZW51c3skTWVudX0tPntWaWV3fSAmJiAkTWVudXN7JE1lbnV9LT57Vmlld30gbmUgJFBhcmFte1ZpZXd9ICk7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSXRlbSk7CgogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9IGVxICdEb2N1bWVudEFjdGlvblJvd0l0ZW0nICkgewoKICAgICAgICAgICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9fiBzLyhcc3wmfDspLy9pZzsKCiAgICAgICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SFRNTCcgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkSXRlbS0+e0hUTUx9OwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGluaXQgZm9yIHRhYmxlIGNvbnRyb2wKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeVN0YXJ0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBTb3J0T3JkZXJCYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIHJldHVybiAnJzsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRpY2tldElEcyBQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9OwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXRNZXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwogICAgbXkgJE91dHB1dFJhdyA9ICcnOwogICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0TWV0YSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TWV0YTsKICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgID0gJyc7CiAgICBteSAkQ291bnRlciAgICAgICA9IDA7CiAgICBteSAkQ291bnRlck9uU2l0ZSA9IDA7CiAgICBteSBAVGlja2V0SURzU2hvd247CgogICAgIyBjaGVjayBpZiB0aGVyZSBhcmUgdGlja2V0cyB0byBzaG93CiAgICBpZiAoIHNjYWxhciBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewoKICAgICAgICBmb3IgbXkgJFRpY2tldElEICggQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvdW50ZXIgPj0gJFBhcmFte1N0YXJ0SGl0fQogICAgICAgICAgICAgICAgJiYgJENvdW50ZXIgPCAoICRQYXJhbXtQYWdlU2hvd259ICsgJFBhcmFte1N0YXJ0SGl0fSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRpY2tldElEc1Nob3duLCAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPl9TaG93KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnRlck9uU2l0ZSwKICAgICAgICAgICAgICAgICAgICBCdWxrICAgICA9PiAkQnVsa0ZlYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJFBhcmFte0NvbmZpZ30sCiAgICAgICAgICAgICAgICAgICAgT3V0cHV0ICAgPT4gJFBhcmFte091dHB1dH0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJENvdW50ZXJPblNpdGUrKzsKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiAkT3V0cHV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0UmF3IC49ICR7JE91dHB1dH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdOb1RpY2tldEZvdW5kJyApOwogICAgfQoKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEZvb3RlcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHNTaG93bikgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXJCdWxrSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRPdXRwdXRNZXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkT3V0cHV0UmF3Owp9CgpzdWIgX1Nob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFBhcmFte0J1bGt9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbGxlY3QgcGFyYW1zIGZvciBBcnRpY2xlR2V0CiAgICBteSAlQXJ0aWNsZUdldFBhcmFtcyA9ICgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIE9yZGVyICAgICAgICAgPT4gJ0RFU0MnLAogICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlldzo6UHJldmlld0FydGljbGVMaW1pdCcpIHx8IDUsCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2VydGFpbiBhcnRpY2xlIHNlbmRlciB0eXBlcyBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBwcmV2aWV3CiAgICBteSAkUHJldmlld0FydGljbGVTZW5kZXJUeXBlcwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3OjpQcmV2aWV3QXJ0aWNsZVNlbmRlclR5cGVzJyk7CiAgICBteSBAQWN0aXZlQXJ0aWNsZVNlbmRlclR5cGVzOwogICAgaWYgKCByZWYgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMgZXEgJ0hBU0gnICkgewogICAgICAgIEBBY3RpdmVBcnRpY2xlU2VuZGVyVHlwZXMKICAgICAgICAgICAgPSBncmVwIHsgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMtPnskX30gPT0gMSB9IGtleXMgJXskUHJldmlld0FydGljbGVTZW5kZXJUeXBlc307CiAgICB9CgogICAgIyBpZiBhIGxpc3Qgb2YgYWN0aXZlIGFydGljbGUgc2VuZGVyIHR5cGVzIGhhcyBiZWVuIGRldGVybWluZWQsIGFkZCB0aGVtIHRvIHBhcmFtcyBoYXNoCiAgICBpZiAoQEFjdGl2ZUFydGljbGVTZW5kZXJUeXBlcykgewogICAgICAgICRBcnRpY2xlR2V0UGFyYW1ze0FydGljbGVTZW5kZXJUeXBlfSA9IFxAQWN0aXZlQXJ0aWNsZVNlbmRlclR5cGVzOwogICAgfQoKICAgICMgZ2V0IGxhc3QgNSBhcnRpY2xlcwogICAgbXkgQEFydGljbGVCb2R5ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KAogICAgICAgICVBcnRpY2xlR2V0UGFyYW1zLAogICAgKTsKICAgIG15ICVBcnRpY2xlID0gJXsgJEFydGljbGVCb2R5WzBdIHx8IHt9IH07CiAgICBteSAkQXJ0aWNsZUNvdW50ID0gc2NhbGFyIEBBcnRpY2xlQm9keTsKCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKIyAtLS0KICAgICk7CgogICAgIyBGYWxsYmFjayBmb3IgdGlja2V0cyB3aXRob3V0IGFydGljbGVzOiBnZXQgYXQgbGVhc3QgYmFzaWMgdGlja2V0IGRhdGEKICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICVBcnRpY2xlID0gJVRpY2tldDsKICAgICAgICBpZiAoICEkQXJ0aWNsZXtUaXRsZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RpdGxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ1RoaXMgdGlja2V0IGhhcyBubyB0aXRsZSBvciBzdWJqZWN0JwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRBcnRpY2xle1RpdGxlfTsKICAgIH0KCiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRBcnRpY2xle093bmVySUR9LAogICAgKTsKICAgICVBcnRpY2xlID0gKCAlVXNlckluZm8sICVBcnRpY2xlICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBzZXQgY3JpdGljYWxpdHkgYW5kIGltcGFjdAogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICctJzsKICAgICRUaWNrZXR7SW1wYWN0fSAgICAgID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gICAgICB8fCAnLSc7CiMgLS0tCgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRBcnRpY2xle0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzIC4uLgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICBEYXRhID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99ICkgewogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDdXN0b21lck5hbWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zOwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICMgZ2V0IGFsbCByZWdpc3RlcmVkIEFjdGlvbnMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlQWN0aW9ucyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgfTsKCiAgICAgICAgIyBvbmx5IHVzZSB0aG9zZSBBY3Rpb25zIHRoYXQgc3RhdHMgd2l0aCBBZ2VudFRpY2tldAogICAgICAgICVQb3NzaWJsZUFjdGlvbnMKICAgICAgICAgICAgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQWdlbnRUaWNrZXQnICkgZXEgJ0FnZW50VGlja2V0JyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KCiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAlQWNsQWN0aW9uID0gJVBvc3NpYmxlQWN0aW9uczsKICAgIGlmICgkQUNMKSB7CiAgICAgICAgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwogICAgfQoKICAgICMgcnVuIHRpY2tldCBwcmUgbWVudSBtb2R1bGVzCiAgICBteSBAQWN0aW9uSXRlbXM7CiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBBQ0wgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiByZWYgJEl0ZW0gbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbklEQ29va2llfSAmJiAkSXRlbS0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgbXkgJE91dHB1dDsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE91dHB1dCA9ICc8bGkgaWQ9IicKICAgICAgICAgICAgICAgICAgICAuICRJdGVtLT57SUR9CiAgICAgICAgICAgICAgICAgICAgLiAnIj48YSBocmVmPSIjIiB0aXRsZT0iJwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57RGVzY3JpcHRpb259ICkKICAgICAgICAgICAgICAgICAgICAuICciPicKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICkKICAgICAgICAgICAgICAgICAgICAuICc8L2E+PC9saT4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXG4rLy9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXHMrLyAvZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzLzxcIS0tLis/LS0+Ly9nOwoKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgIEhUTUwgICAgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICksCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30gLiAkSXRlbS0+e0xpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJEl0ZW0tPntUYXJnZXR9LAogICAgICAgICAgICAgICAgUG9wdXBUeXBlICAgPT4gJEl0ZW0tPntQb3B1cFR5cGV9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSwKCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBZGRpdGlvbmFsQ2xhc3NlcyA9ICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gPyAnU2hvd0lubGluZUFjdGlvbnMnIDogJyc7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudENvbnRlbnQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAlVGlja2V0LAojIC0tLQogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgPT4gJ0FydGljbGVDb3VudCcgLiAkQXJ0aWNsZUNvdW50LAogICAgICAgICAgICBBZGRpdGlvbmFsQ2xhc3NlcyA9PiAkQWRkaXRpb25hbENsYXNzZXMsCiAgICAgICAgICAgIENyZWF0ZWQgICAgICAgICAgID0+ICRUaWNrZXR7Q3JlYXRlZH0sICAgICAgICAgICAgICAjIHVzZSB2YWx1ZSBmcm9tIHRpY2tldCwgbm90IGFydGljbGUKICAgICAgICB9LAogICAgKTsKCiAgICAjIGlmICJBY3Rpb25zIHBlciBUaWNrZXQiIChJbmxpbmUgQWN0aW9uIFJvdykgaXMgYWN0aXZlCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgQWRkIGxpc3QgZW50cmllcyBmb3IgZXZlcnkgYWN0aW9uCiAgICAgICAgZm9yIG15ICRJdGVtIChAQWN0aW9uSXRlbXMpIHsKICAgICAgICAgICAgbXkgJExpbmsgPSAkSXRlbS0+e0xpbmt9OwogICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnQXNQb3B1cCBQb3B1cFR5cGVfJyAuICRJdGVtLT57UG9wdXBUeXBlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJEl0ZW0tPntCbG9ja30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRMaW5rLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFRpY2tldElEICAgPSAkUGFyYW17VGlja2V0SUR9OwogICAgICAgICAgICAgICAgbXkgJFNlbGVjdEhUTUwgPSAkSXRlbS0+e0hUTUx9OwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9pZD0iRGVzdFF1ZXVlSUQiL2lkPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRTZWxlY3RIVE1MID1+IHMvZm9yPSJEZXN0UXVldWVJRCIvZm9yPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbUhUTUwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIVE1MID0+ICRTZWxlY3RIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFBhcmFte0J1bGt9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICBteSBAVGlja2V0TWV0YUl0ZW1zID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRNZXRhSXRlbXMoCiAgICAgICAgVGlja2V0ID0+IFwlQXJ0aWNsZSwKICAgICk7CiAgICBmb3IgbXkgJEl0ZW0gKEBUaWNrZXRNZXRhSXRlbXMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICApOwogICAgICAgIGlmICgkSXRlbSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWV0YUljb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSBtb2R1bGVzCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIERlYnVnICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSBARGF0YSA9ICRPYmplY3QtPkNoZWNrKCBBcnRpY2xlID0+IFwlQXJ0aWNsZSwgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPntSZXN1bHR9ID0gJ1N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbHRlciBvcHRpb24KICAgICAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlJyk7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCcpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ3VzdG9tZXJJRCBhbmQgQ3VzdG9tZXJOYW1lCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IGFjY2VzcyB0byBmcm9udGVuZCBtb2R1bGUKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Q3VzdG9tZXInLAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwogICAgICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICAgICAjIHRlc3QgYWNjZXNzIHRvIHRpY2tldAogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q3VzdG9tZXInKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBwcm9wZXIgRFRMIGJsb2NrIGJhc2VkIG9uIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJEN1c3RvbWVySURCbG9jayA9ICRBY2Nlc3MgPyAnQ3VzdG9tZXJJRFJXJyA6ICdDdXN0b21lcklEUk8nOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRDdXN0b21lcklEQmxvY2ssCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0N1c3RvbWVyTmFtZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lck5hbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICRDb3VudGVyID0gMDsKICAgIG15ICRDbGFzcyA9ICdNaWRkbGUnOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgZmllbGQgdmFsdWUKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggIWRlZmluZWQgJFZhbHVlICk7CgogICAgICAgICRDb3VudGVyKys7CgogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgcm93IGlmIGNvdW50ZXIgaXMgc3RhcnRpbmcKICAgICAgICBpZiAoICRDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IHNlcGFyYXRpb24gcm93IGp1c3Qgb25jZQogICAgICAgICRDbGFzcyA9ICcnOwoKICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgbGluawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb25seSAyIGR5bmFtaWMgZmllbGRzIGJ5IHJvdyBhcmUgYWxsb3dlZCwgcmVzZXQgY291dGVyIGlmIG5lZWRlZAogICAgICAgIGlmICggJENvdW50ZXIgPT0gMiApIHsKICAgICAgICAgICAgJENvdW50ZXIgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHRoZSByZXN0IG9mIHRoZSBEeW5hbWljIEZpZWxkcyByb3cgd2l0aCBlbXB0eSBjZWxscywgdGhpcyB3aWxsIGxvb2sgYmV0dGVyCiAgICBpZiAoICRDb3VudGVyID4gMCAmJiAkQ291bnRlciA8IDIgKSB7CgogICAgICAgIGZvciAoICRDb3VudGVyICsgMSAuLi4gMiApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoQEFydGljbGVCb2R5KSB7CgogICAgICAgICMgY2hlY2sgaWYgYSBjZXJ0YWluIGFydGljbGUgdHlwZSBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGV4cGFuZGVkCiAgICAgICAgbXkgJFByZXZpZXdBcnRpY2xlVHlwZUV4cGFuZGVkCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3OjpQcmV2aWV3QXJ0aWNsZVR5cGVFeHBhbmRlZCcpCiAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAjIGlmIGEgY2VydGFpbiBhcnRpY2xlIHR5cGUgc2hvdWxkIGJlIHNob3duIGFzIGV4cGFuZGVkLCBzZXQgdGhlCiAgICAgICAgIyBsYXN0IGFydGljbGUgb2YgdGhpcyB0eXBlIGFzIGFjdGl2ZQogICAgICAgIGlmICgkUHJldmlld0FydGljbGVUeXBlRXhwYW5kZWQpIHsKCiAgICAgICAgICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgICAgICAgICAgQVJUSUNMRV9JVEVNOgogICAgICAgICAgICBmb3IgbXkgJEFydGljbGVJdGVtIChAQXJ0aWNsZUJvZHkpIHsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRV9JVEVNIGlmICEkQXJ0aWNsZUl0ZW07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IGFydGljbGUgdHlwZSBzaG91bGQgYmUgc2hvd24gYXMgZXhwYW5kZWQKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVJdGVtLT57QXJ0aWNsZVR5cGV9IGVxICRQcmV2aWV3QXJ0aWNsZVR5cGVFeHBhbmRlZCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntDbGFzc30gPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVfSVRFTTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBkaXNwbGF5IHRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGxpc3QgYXMgZXhwYW5kZWQgKGRlZmF1bHQpCiAgICAgICAgICAgICAgICBlbHNpZiAoICRDbGFzc0NvdW50ID09ICQjQXJ0aWNsZUJvZHkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5WzBdLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ2xhc3NDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBkaXNwbGF5IHRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGxpc3QgYXMgZXhwYW5kZWQgKGRlZmF1bHQpCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlQm9keVswXS0+e0NsYXNzfSA9ICdBY3RpdmUnOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZXNQcmV2aWV3QXJlYScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgaW5saW5lIGFydGljbGUKICAgIGZvciBteSAkQXJ0aWNsZUl0ZW0gKCByZXZlcnNlIEBBcnRpY2xlQm9keSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgKTsKICAgICAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5fSAgICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgPT4gJFBhcmFte0NvbmZpZ30tPntEZWZhdWx0Vmlld05ld0xpbmV9ICB8fCA5MCwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGVJdGVtLT57Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRQYXJhbXtDb25maWd9LT57RGVmYXVsdFByZVZpZXdMaW5lc30gfHwgMjUsCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAxLAogICAgICAgICAgICAgICAgU3RyaXBFbXB0eUxpbmVzID0+ICRQYXJhbXtDb25maWd9LT57U3RyaXBFbXB0eUxpbmVzfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBcnRpY2xlSXRlbS0+e1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZUl0ZW0tPntUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xlSXRlbS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQXJ0aWNsZUl0ZW0tPntDbGFzc30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGFjdGlvbnMKICAgICAgICBpZiAoICRBcnRpY2xlSXRlbS0+e0FydGljbGVUeXBlfSAhfiAvXihub3RlfGVtYWlsLW5vdGkpL2kgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3cnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcwogICAgICAgICAgICAgICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VzOwogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICVTdGFuZGFyZFJlc3BvbnNlcyA9ICV7ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9IH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZSBiZWNhdXNlIHdlIG5lZWQgdG8gc29ydCBieSBWYWx1ZXMKICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZFJlc3BvbnNlIFZhbHVlCiAgICAgICAgICAgICAgIyBhbmQgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKCiAgICAgICAgICAgICAgICAgICAgbXkgJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCA9IHJldmVyc2UgJVN0YW5kYXJkUmVzcG9uc2VzOwogICAgICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkgICAgICAgPSBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoeyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZFJlc3BvbnNlczsKCiAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1JlcGx5JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBidWlsZCBodG1sIHN0cmluZwogICAgICAgICAgICAgICAgICAgIG15ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJRCcgLiAkQXJ0aWNsZUl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1JlcGx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5JyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXBseSBhbGwgaXMgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgICAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkQXJ0aWNsZUl0ZW0tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICRBcnRpY2xlSXRlbS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRW1haWxQYXJzZXIgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBZGRyZXNzZXMgPSAkRW1haWxQYXJzZXItPlNwbGl0QWRkcmVzc0xpbmUoIExpbmUgPT4gJFJlY2lwaWVudHMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRW1haWwgPSAkRW1haWxQYXJzZXItPkdldEVtYWlsQWRkcmVzcyggRW1haWwgPT4gJEFkZHJlc3MgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQUREUkVTUyBpZiAhJEVtYWlsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRJc0xvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50Q291bnQgPiAxICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgU3RhbmRhcmRSZXNwb25zZXNTdHJnCiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0KEBTdGFuZGFyZFJlc3BvbnNlQXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSgnUmVwbHkgQWxsJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICdSZXNwb25zZUlEQWxsJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdSZXBseSBBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnIC4gJEFydGljbGVJdGVtLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBseUFsbCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGFjdGlvbiBpdGVtcyBhcyBqcwogICAgaWYgKCBAQWN0aW9uSXRlbXMgJiYgISRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQEFjdGlvbkl0ZW1zLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICB9LAogICAgKTsKICAgIHJldHVybiBcJE91dHB1dDsKfQoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNMQScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0gPSAkUGFyYW17REJTbGF2ZU9iamVjdH0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIG15ICgkRGF0ZSkgPSBzcGxpdCAvXHMrLywgJFRpbWVTdGFtcDsKICAgIG15ICRUb2RheSA9IHNwcmludGYgIiVzIDIzOjU5OjU5IiwgJERhdGU7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0JywKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgIG15ICRBQ0wgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEFjbCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAnQWdlbnRTdGF0cycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICAkUG9zc2libGVWYWx1ZXNGaWx0ZXIgPSBcJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICBteSAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXIKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcikgKSB7CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhIGxpc3QKICAgICAgICBteSAkQXJ0aWNsZURhdGFMaXN0ID0gJFNlbGYtPl9BcnRpY2xlRGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkQXJ0aWNsZURhdGFMaXN0OwoKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICFAeyRBcnRpY2xlRGF0YUxpc3R9OwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgQHskQXJ0aWNsZURhdGFMaXN0fSA+IDI7CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhIHBob25lIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVEYXRhTGlzdC0+WzFdICkgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhbiBleHRlcm5hbCBlbWFpbCBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlVHlwZUlEfSBlcSAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gYW4gYWdlbnQgKEVtYWlsLVRpY2tldCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgISRBcnRpY2xlRGF0YUxpc3QtPlsxXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gY3VzdG9tZXIgYW5kIHRoZSBzZWNvbmQgb25lIGZyb20gYW4gYWdlbnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZURhdGFMaXN0LT5bMV0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHM7Cn0KCnN1YiBfQXJ0aWNsZURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSB0eXBlICdwaG9uZScKICAgIGlmICggISRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57UGhvbmVUeXBlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5BcnRpY2xlVHlwZUxvb2t1cCgKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJ3Bob25lJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgdHlwZSAnZW1haWwtZXh0ZXJuYWwnCiAgICBpZiAoICEkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0KICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVUeXBlTG9va3VwKAogICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAnZW1haWwtZXh0ZXJuYWwnLAogICAgICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgc2VuZGVyIHR5cGUgJ2FnZW50JwogICAgaWYgKCAhJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0KICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdhZ2VudCcsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSBzZW5kZXIgdHlwZSAnY3VzdG9tZXInCiAgICBpZiAoICEkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfQogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBhcnRpY2xlX3R5cGVfaWQsIGFydGljbGVfc2VuZGVyX3R5cGVfaWQgRlJPTSBhcnRpY2xlICcKICAgICAgICAgICAgLiAnV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgYXJ0aWNsZV90eXBlX2lkIElOICggPywgPyApIEFORCAnCiAgICAgICAgICAgIC4gJ2FydGljbGVfc2VuZGVyX3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBcJFNlbGYtPntQaG9uZVR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9LAogICAgICAgICAgICBcJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDMsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEFydGljbGVEYXRhTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhOwogICAgICAgICRBcnRpY2xlRGF0YXtBcnRpY2xlVHlwZUlEfSAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVTZW5kZXJUeXBlSUR9ID0gJFJvd1sxXTsKCiAgICAgICAgcHVzaCBAQXJ0aWNsZURhdGFMaXN0LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIHJldHVybiBcQEFydGljbGVEYXRhTGlzdDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIHNvbHV0aW9uIHRpbWUgYXZlcmFnZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U0xBJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlR5cGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fSA9ICRQYXJhbXtEQlNsYXZlT2JqZWN0fSB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlciBsaXN0CiAgICBteSAlVXNlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICBTdGF0ZVR5cGUgPT4gWydjbG9zZWQnXSwKICAgICAgICBSZXN1bHQgICAgPT4gJ0hBU0gnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBxdWV1ZSBsaXN0CiAgICBteSAlUXVldWVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldEFsbFF1ZXVlcygpOwoKICAgICMgZ2V0IHByaW9yaXR5IGxpc3QKICAgIG15ICVQcmlvcml0eUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKS0+UHJpb3JpdHlMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjdXJyZW50IHRpbWUgdG8gZml4IGJ1ZyMzODMwCiAgICBteSAkVGltZVN0YW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgbXkgKCREYXRlKSA9IHNwbGl0IC9ccysvLCAkVGltZVN0YW1wOwogICAgbXkgJFRvZGF5ID0gc3ByaW50ZiAiJXMgMjM6NTk6NTkiLCAkRGF0ZTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBpbiBRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdCb2R5JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZSBUaW1lJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlVGltZScsCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICMgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVGltZVN0b3AgICAgICAgICA9PiAkVG9kYXksCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU2VydmljZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTTEEnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU0xBSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IHR5cGUgbGlzdAogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUxID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVHlwZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlMTsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU3RhdHM6OlVzZUFnZW50RWxlbWVudEluU3RhdHMnKSApIHsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnT3duZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgYnkgQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFVzZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpDdXN0b21lcklEQXNNdWx0aVNlbGVjdCcpICkgewoKICAgICAgICAjIEdldCBDdXN0b21lcklECiAgICAgICAgIyAoVGhpcyB3YXkgYWxzbyBjYW4gYmUgdGhlIHNvbHV0aW9uIGZvciB0aGUgQ3VzdG9tZXJVc2VySUQpCiAgICAgICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QgY3VzdG9tZXJfaWQgRlJPTSB0aWNrZXQnLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICVDdXN0b21lcklEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUR7ICRSb3dbMF0gfSA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDdXN0b21lcklELAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgbXkgJEFDTCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsKAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICdBZ2VudFN0YXRzJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9IHx8IHt9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICBteSAlRmlsdGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgICRQb3NzaWJsZVZhbHVlc0ZpbHRlciA9IFwlRmlsdGVyOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgIG15ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcgogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+U3RhdHNGaWVsZFBhcmFtZXRlckJ1aWxkKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyKSApIHsKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSApICkgewoKICAgICAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0VsZW1lbnR9LAogICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgYWxsIGNsb3NlZCBzdGF0cyBpZiBubyBzdGF0ZXMgYXJlIGdpdmVuCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRHN9ICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGV9ID0gWydjbG9zZWQnXTsKICAgIH0KCiAgICAjIHN0YXJ0IHRpY2tldCBzZWFyY2gKICAgIG15IEBUaWNrZXRTZWFyY2hJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICctJyBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkVGltZSA9IDA7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0U2VhcmNoSURzKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJFRpY2tldERhdGEgPSAkU2VsZi0+X1RpY2tldERhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJXskVGlja2V0RGF0YX07CgogICAgICAgICMgZ2V0IHJlbGV2YW50IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgJEhpc3RvcnlEYXRhID0gJFNlbGYtPl9UaWNrZXRIaXN0b3J5RGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkSGlzdG9yeURhdGE7CgogICAgICAgICMgaWYgdGlja2V0IGlzIGNsb3NlZCBpbiB0aGUgdGlja2V0IGNyZWF0ZSBtYXNrCiAgICAgICAgaWYgKCBAeyRIaXN0b3J5RGF0YX0gPT0gMSApIHsKICAgICAgICAgICAgJFRpbWUgKz0gKCAzICogNjAgKTsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgIG15ICVUaW1lc3BhbnM7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskSGlzdG9yeURhdGF9ICkgewoKICAgICAgICAgICAgaWYgKCAkVGltZXNwYW5zeyRDb3VudGVyfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdG9wIHRpbWUKICAgICAgICAgICAgICAgICRUaW1lc3BhbnN7JENvdW50ZXJ9LT57U3RvcFRpbWV9CiAgICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVudHJ5LT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRW50cnktPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhcgogICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT5fQ2FsZW5kYXJHZXQoCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gJFRpY2tldERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDb3VudCAoIHNvcnQga2V5cyAlVGltZXNwYW5zICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGltZXNwYW4gPSAkVGltZXNwYW5zeyRDb3VudH07CgogICAgICAgICAgICAkVGltZXNwYW4tPntTdG9wVGltZX0gfHw9ICRUaW1lc3Bhbi0+e1N0YXJ0VGltZX0gKyAoIDMgKiA2MCApOwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgd29ya2luZyB0aW1lCiAgICAgICAgICAgIG15ICRXb3JraW5nVGltZVBhcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5Xb3JraW5nVGltZSgKICAgICAgICAgICAgICAgICV7JFRpbWVzcGFufSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRUaW1lICs9ICRXb3JraW5nVGltZVBhcnQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRDb3VudCA9IEBUaWNrZXRTZWFyY2hJRHM7CiAgICBteSAkQXZlcmFnZVRpbWUgPSAkVGltZSAvICRUaWNrZXRDb3VudDsKCiAgICAjIHRyYW5zbGF0ZSBzZWNvbmRzIGluIGEgcmVhZGFibGUgZm9ybWF0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+X1NlY29uZGVUb1N0cmluZygKICAgICAgICBTZWNvbmRzID0+IGludCAkQXZlcmFnZVRpbWUsCiAgICApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCnN1YiBfVGlja2V0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB7fSBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBxdWV1ZV9pZCwgc2xhX2lkLCBjcmVhdGVfdGltZV91bml4ICcKICAgICAgICAgICAgLiAnRlJPTSB0aWNrZXQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGlja2V0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGlja2V0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGlja2V0RGF0YXtRdWV1ZUlEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJFRpY2tldERhdGF7U0xBSUR9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRUaWNrZXREYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gXCVUaWNrZXREYXRhOwp9CgpzdWIgX0NhbGVuZGFyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbgogICAgJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gfHw9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlJyk7CgogICAgbXkgJUVzY2FsYXRpb25EYXRhOwogICAgaWYgKCAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSAmJiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0gKSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFHZXQoCiAgICAgICAgICAgIFNMQUlEICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57UXVldWVJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkRXNjYWxhdGlvbkRhdGF7Q2FsZW5kYXJ9IHx8IHVuZGVmOwp9CgpzdWIgX1RpY2tldEhpc3RvcnlEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IGlkIG9mIGhpc3RveSB0eXBlIFN0YXRlVXBkYXRlCiAgICBpZiAoICEkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ICkgewogICAgICAgICRTZWxmLT57U3RhdGVVcGRhdGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICdTdGF0ZVVwZGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBOZXdUaWNrZXQKICAgIGlmICggISRTZWxmLT57TmV3VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TmV3VGlja2V0SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnTmV3VGlja2V0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZpZXdhYmxlIHN0YXRlIGlkcwogICAgaWYgKCAhJFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfSApIHsKICAgICAgICBteSBAVmlld2FibGVTdGF0ZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICAgICAgVHlwZSAgID0+ICdWaWV3YWJsZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgICk7CgogICAgICAgIG15ICVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoQFZpZXdhYmxlU3RhdGVJRHMpIHsKICAgICAgICAgICAgJFZpZXdhYmxlU3RhdGVJRExpc3R7JFN0YXRlSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gPSBcJVZpZXdhYmxlU3RhdGVJRExpc3Q7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1Qgc3RhdGVfaWQsIGNyZWF0ZV90aW1lIEZST00gdGlja2V0X2hpc3RvcnkgJwogICAgICAgICAgICAuICdXSEVSRSB0aWNrZXRfaWQgPSA/IEFORCBoaXN0b3J5X3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCBcJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSwgXCRTZWxmLT57TmV3VGlja2V0SUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRpY2tldEhpc3RvcnlMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlSGlzdG9yeURhdGE7CiAgICAgICAgJEhpc3RvcnlEYXRhe1N0YXRlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkSGlzdG9yeURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzFdOwoKICAgICAgICBwdXNoIEBUaWNrZXRIaXN0b3J5TGlzdCwgXCVIaXN0b3J5RGF0YTsKICAgIH0KCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKEBUaWNrZXRIaXN0b3J5TGlzdCkgewoKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAwOwogICAgICAgIG5leHQgRU5UUlkgaWYgISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30tPnsgJEVudHJ5LT57U3RhdGVJRH0gfTsKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAxOwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEhpc3RvcnlMaXN0Owp9CgpzdWIgX1NlY29uZGVUb1N0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkUGFyYW17U2Vjb25kc307CgogICAgIyBjYWxjdWxhdGUgdGhlIHNlY29uZHMKICAgIG15ICRTZWNvbmRzID0gJFBhcmFte1NlY29uZHN9ICUgNjA7CiAgICAkUGFyYW17U2Vjb25kc30gPSAoICRQYXJhbXtTZWNvbmRzfSAtICRTZWNvbmRzICkgLyA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbWludXRlcwogICAgbXkgJE1pbnV0ZXMgPSAkUGFyYW17U2Vjb25kc30gJSA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgaG91cnMKICAgIG15ICRIb3VycyA9ICggJFBhcmFte1NlY29uZHN9IC0gJE1pbnV0ZXMgKSAvIDYwOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRIb3VycyAgIHx8PSAwOwogICAgJE1pbnV0ZXMgfHw9IDA7CiAgICAkU2Vjb25kcyB8fD0gMDsKCiAgICBpZiAoICRTZWNvbmRzID49IDMwICkgewogICAgICAgICRNaW51dGVzKys7CiAgICB9CgogICAgJE1pbnV0ZXMgPSBzcHJpbnRmICIlMDJkIiwgJE1pbnV0ZXM7CgogICAgbXkgJEhvdXJzU3RyaW5nICAgPSAnSG91cnMnOwogICAgbXkgJE1pbnV0ZXNTdHJpbmcgPSAnTWludXRlcyc7CgogICAgcmV0dXJuICIkSG91cnMgJEhvdXJzU3RyaW5nICRNaW51dGVzICRNaW51dGVzU3RyaW5nIjsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlR5cGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6OklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgcmVidWlsZCBaWloqIGZpbGVzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyktPldyaXRlRGVmYXVsdCgpOwoKICAgICMgZGVmaW5lIHRoZSBaWlogZmlsZXMKICAgIG15IEBaWlpGaWxlcyA9ICgKICAgICAgICAnWlpaQUF1dG8ucG0nLAogICAgICAgICdaWlpBdXRvLnBtJywKICAgICk7CgogICAgIyByZWxvYWQgdGhlIFpaWiBmaWxlcyAobW9kX3Blcmwgd29ya2Fyb3VuZCkKICAgIGZvciBteSAkWlpaRmlsZSAoQFpaWkZpbGVzKSB7CgogICAgICAgIFBSRUZJWDoKICAgICAgICBmb3IgbXkgJFByZWZpeCAoQElOQykgewogICAgICAgICAgICBteSAkRmlsZSA9ICRQcmVmaXggLiAnL0tlcm5lbC9Db25maWcvRmlsZXMvJyAuICRaWlpGaWxlOwogICAgICAgICAgICBuZXh0IFBSRUZJWCBpZiAhLWYgJEZpbGU7CiAgICAgICAgICAgIGRvICRGaWxlOwogICAgICAgICAgICBsYXN0IFBSRUZJWDsKICAgICAgICB9CiAgICB9CgogICAgIyBhbHdheXMgZGlzY2FyZCB0aGUgY29uZmlnIG9iamVjdCBiZWZvcmUgcGFja2FnZSBjb2RlIGlzIGV4ZWN1dGVkLAogICAgIyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgbmV3bHksIHNvIHRoYXQgaXQKICAgICMgd2lsbCB1c2UgdGhlIHJlY2VudGx5IHdyaXR0ZW4gbmV3IGNvbmZpZyBmcm9tIHRoZSBwYWNrYWdlCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoCiAgICAgICAgT2JqZWN0cyA9PiBbJ0tlcm5lbDo6Q29uZmlnJ10sCiAgICApOwoKICAgICMgdGhlIHN0YXRzIG9iamVjdCBuZWVkcyBhIFVzZXJJRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3RvcgogICAgIyB3ZSBuZWVkIHRvIGRpc2NhcmQgYW55IGV4aXN0aW5nIHN0YXRzIG9iamVjdCBiZWZvcmUKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpTeXN0ZW06OlN0YXRzJ10sCiAgICApOwoKICAgICMgZGVmaW5lIFVzZXJJRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3RhdHMgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cycgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGRlZmluZSBmaWxlIHByZWZpeCBmb3Igc3RhdHMKICAgICRTZWxmLT57RmlsZVByZWZpeH0gPSAnSVRTTVN0YXRzJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBuZXcgdGlja2V0IHN0YXRlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBUeXBlTmFtZXMgPSAoCiAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6TWFqb3InLAogICAgICAgICAgICAnU2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnUHJvYmxlbScsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFR5cGVWYWxpZCgKICAgICAgICAgICAgVHlwZU5hbWVzID0+IFxAVHlwZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICAkU2VsZi0+X0NyZWF0ZUlUU01EeW5hbWljRmllbGRzKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAzLjIuOTEgKDMuMy4wIEJldGEgMSkuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzJfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmVuYW1lIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT5fUmVuYW1lRHluYW1pY0ZpZWxkcygpOwoKICAgICMgc2V0IHRoZSBzY3JlZW4gZHluYW1pYyBmaWVsZCBjb25maWcKICAgICRTZWxmLT5fU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1ha2UgZHluYW1pYyBmaWVsZHMgaW50ZXJuYWwKICAgICRTZWxmLT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBuZXcgdGlja2V0IHN0YXRlcyB0byBpbnZhbGlkCiAgICB7CiAgICAgICAgbXkgQFN0YXRlTmFtZXMgPSAoCiAgICAgICAgICAgICdjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJywKICAgICAgICApOwoKICAgICAgICAjIHNldCBzdGF0ZXMgdG8gaW52YWxpZAogICAgICAgICRTZWxmLT5fU2V0U3RhdGVWYWxpZCgKICAgICAgICAgICAgU3RhdGVOYW1lcyA9PiBcQFN0YXRlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyB0aWNrZXQgdHlwZXMgdG8gaW52YWxpZAogICAgewogICAgICAgIG15IEBUeXBlTmFtZXMgPSAoCiAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6TWFqb3InLAogICAgICAgICAgICAnU2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnUHJvYmxlbScsCgogICAgICAgICAgICAjIG9sZCB0eXBlcyBmcm9tIElUU00gYmVmb3JlIHZlcnNpb24gMy4yLjkxCiAgICAgICAgICAgICdJbmNpZGVudDo6U2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OkRpc2FzdGVyJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gaW52YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9TZXRTY3JlZW5EeW5hbWljRmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzY3JlZW4gZHluYW1pYyBzY3JlZW4gY29uZmlnCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTY3JlZW5EeW5hbWljRmllbGRDb25maWcoKTsKCj1jdXQKCnN1YiBfU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtYXBwaW5nIG9sZCBuYW1lIHRvIG5ldyBuYW1lIG9mIGR5bmFtaWMgZmllbGRzCiAgICBteSAlT2xkMk5ldyA9ICgKICAgICAgICBUaWNrZXRGcmVlVGV4dDEzID0+ICdJVFNNQ3JpdGljYWxpdHknLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTQgPT4gJ0lUU01JbXBhY3QnLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTUgPT4gJ0lUU01SZXZpZXdSZXF1aXJlZCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNiA9PiAnSVRTTURlY2lzaW9uUmVzdWx0JywKICAgICAgICBUaWNrZXRGcmVlVGltZTMgID0+ICdJVFNNUmVwYWlyU3RhcnRUaW1lJywKICAgICAgICBUaWNrZXRGcmVlVGltZTQgID0+ICdJVFNNUmVjb3ZlcnlTdGFydFRpbWUnLAogICAgICAgIFRpY2tldEZyZWVUaW1lNSAgPT4gJ0lUU01EZWNpc2lvbkRhdGUnLAogICAgICAgIFRpY2tldEZyZWVUaW1lNiAgPT4gJ0lUU01EdWVEYXRlJywKICAgICk7CgogICAgIyBkZWZpbmUgdGhlIGVuYWJsZWQgZHluYW1pYyBmaWVsZHMgZm9yIGVhY2ggc2NyZWVuCiAgICAjICh0YWtlbiBmcm9tIHN5c2NvbmZpZyBvZiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCkKICAgIG15ICVTY3JlZW5EeW5hbWljRmllbGRDb25maWcgPSAoCiAgICAgICAgQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCA9PiB7CiAgICAgICAgICAgIElUU01SZXBhaXJTdGFydFRpbWUgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVjb3ZlcnlTdGFydFRpbWUgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldERlY2lzaW9uID0+IHsKICAgICAgICAgICAgSVRTTURlY2lzaW9uUmVzdWx0ID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvbkRhdGUgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRQaG9uZSA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgID0+IDEsCiAgICAgICAgICAgIElUU01EdWVEYXRlID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldEVtYWlsID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCAgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0U2VhcmNoID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCAgICA9PiAxLAogICAgICAgICAgICBJVFNNRGVjaXNpb25SZXN1bHQgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlcGFpclN0YXJ0VGltZSAgID0+IDEsCiAgICAgICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgICAgICBJVFNNRGVjaXNpb25EYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldFpvb20gPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTUNyaXRpY2FsaXR5ICAgICAgID0+IDEsCiAgICAgICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCAgICA9PiAxLAogICAgICAgICAgICBJVFNNRGVjaXNpb25SZXN1bHQgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlcGFpclN0YXJ0VGltZSAgID0+IDEsCiAgICAgICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgICAgICBJVFNNRGVjaXNpb25EYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldFByaW9yaXR5ID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRDbG9zZSA9PiB7CiAgICAgICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRDb21wb3NlID0+IHsKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRTY3JlZW4gKCBzb3J0IGtleXMgJVNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZyApIHsKCiAgICAgICAgIyBnZXQgZXhpc3RpbmcgY29uZmlnIGZvciBlYWNoIHNjcmVlbgogICAgICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTY3JlZW4iKTsKCiAgICAgICAgIyBnZXQgZXhpc3RpbmcgZHluYW1pYyBmaWVsZCBjb25maWcKICAgICAgICBteSAlRXhpc3RpbmdTZXR0aW5nID0gJXsgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30gfTsKCiAgICAgICAgIyBhZGQgdGhlIG5ldyBzZXR0aW5ncwogICAgICAgIG15ICVOZXdTZXR0aW5nID0gKCAlRXhpc3RpbmdTZXR0aW5nLCAleyAkU2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlneyRTY3JlZW59IH0gKTsKCiAgICAgICAgIyBkZWxldGUgbm8gbG9uZ2VyIHVzZWQgZHluYW1pYyBmaWVsZCBuYW1lcyBmcm9tIGVhY2ggY29uZmlnCiAgICAgICAgZm9yIG15ICRPbGREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJU9sZDJOZXcgKSB7CgogICAgICAgICAgICAjIGFuIG9sZCBzZXR0aW5nIGV4aXN0cwogICAgICAgICAgICBpZiAoIGV4aXN0cyAkTmV3U2V0dGluZ3skT2xkRHluYW1pY0ZpZWxkfSApIHsKCiAgICAgICAgICAgICAgICAjIGNvcHkgdGhlIG9sZCBzZXR0aW5nIHRvIHRoZSBuZXcgc2V0dGluZwogICAgICAgICAgICAgICAgJE5ld1NldHRpbmd7ICRPbGQyTmV3eyRPbGREeW5hbWljRmllbGR9IH0gPSAkTmV3U2V0dGluZ3skT2xkRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgb2xkIHNldHRpbmcKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3U2V0dGluZ3skT2xkRHluYW1pY0ZpZWxkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHN5c2NvbmZpZwogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpLT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpGcm9udGVuZDo6JyAuICRTY3JlZW4gLiAnIyMjRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgVmFsdWUgPT4gXCVOZXdTZXR0aW5nLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRTdGF0ZVZhbGlkKCkKCnNldHMgc3RhdGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgIFN0YXRlTmFtZXMgPT4gWyAnbmV3JywgJ29wZW4nIF0sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0U3RhdGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVOYW1lc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0YXRlTmFtZXMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgU1RBVEVOQU1FOgogICAgZm9yIG15ICRTdGF0ZU5hbWUgKCBAeyAkUGFyYW17U3RhdGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBnZXQgc3RhdGUKICAgICAgICBteSAlU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJFN0YXRlTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNUQVRFTkFNRSBpZiAhJVN0YXRlOwoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZVVwZGF0ZSgKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1NldFR5cGVWYWxpZCgpCgpzZXRzIHR5cGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgVHlwZU5hbWVzID0+IFsgJ0luY2lkZW50JywgJ1Byb2JsZW0nIF0sCiAgICAgICAgVmFsaWQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9TZXRUeXBlVmFsaWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1R5cGVOYW1lc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGVOYW1lcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHZhbGlkIGlkCiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgJVZhbGlkTGlzdCA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZElEID0gJFBhcmFte1ZhbGlkfSA/ICRWYWxpZExpc3R7dmFsaWR9IDogJFZhbGlkTGlzdHtpbnZhbGlkfTsKCiAgICAjIGdldCBsaXN0IG9mIGFsbCB0eXBlcwogICAgbXkgJVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyByZXZlcnNlIHRoZSB0eXBlIGxpc3QgZm9yIGVhc2llciBsb29rdXAKICAgIG15ICVUeXBlTGlzdFJldmVyc2UgPSByZXZlcnNlICVUeXBlTGlzdDsKCiAgICBUWVBFTkFNRToKICAgIGZvciBteSAkVHlwZU5hbWUgKCBAeyAkUGFyYW17VHlwZU5hbWVzfSB9ICkgewoKICAgICAgICAjIGxvb2t1cCB0eXBlIGlkCiAgICAgICAgbXkgJFR5cGVJRCA9ICRUeXBlTGlzdFJldmVyc2V7JFR5cGVOYW1lfTsKCiAgICAgICAgbmV4dCBUWVBFTkFNRSBpZiAhJFR5cGVJRDsKCiAgICAgICAgIyBnZXQgdHlwZQogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUdldCgKICAgICAgICAgICAgSUQgPT4gJFR5cGVJRCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZVVwZGF0ZSgKICAgICAgICAgICAgJVR5cGUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMoKQoKY3JlYXRlcyBhbGwgZHluYW1pYyBmaWVsZHMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciBJVFNNCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMoKTsKCj1jdXQKCnN1YiBfQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICAjIGdldCBhbGwgY3VycmVudCBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyBnZXQgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBvcmRlciBsaXN0IGFuZCBhZGQgMQogICAgbXkgJE5leHRPcmRlck51bWJlciA9IDE7CiAgICBpZiAoQER5bmFtaWNmaWVsZE9yZGVyTGlzdCkgewogICAgICAgICROZXh0T3JkZXJOdW1iZXIgPSAkRHluYW1pY2ZpZWxkT3JkZXJMaXN0Wy0xXSArIDE7CiAgICB9CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgICMgY3JlYXRlIGEgZHluYW1pYyBmaWVsZHMgbG9va3VwIHRhYmxlCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiByZWYgJER5bmFtaWNGaWVsZCBuZSAnSEFTSCc7CiAgICAgICAgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgY3JlYXRlIG9yIHVwZGF0ZSBkeW5hbWljIGZpZWxkcwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CgogICAgICAgIG15ICRDcmVhdGVEeW5hbWljRmllbGQ7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGR5bmFtaWMgZmllbGQgYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoIHJlZiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgICRDcmVhdGVEeW5hbWljRmllbGQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgZmllbGQgZXhpc3RzIGNoZWNrIGlmIHRoZSB0eXBlIG1hdGNoIHdpdGggdGhlIG5lZWRlZCB0eXBlCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgbmUgJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgcmVuYW1lIHRoZSBmaWVsZCBhbmQgY3JlYXRlIGEgbmV3IG9uZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gfSwKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e05hbWV9IC4gJ09sZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDcmVhdGVEeW5hbWljRmllbGQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgaWYgdGhlIGZpZWxkIGV4aXN0cyBhbmQgdGhlIHR5cGUgbWF0Y2gsIHVwZGF0ZSBpdCB0byB0aGUgSVRTTSBkZWZpbml0aW9uCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0lEfSwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZE9yZGVyfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBmaWVsZCBoYXMgdG8gYmUgY3JlYXRlZAogICAgICAgIGlmICgkQ3JlYXRlRHluYW1pY0ZpZWxkKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgICAgICAgICBteSAkRmllbGRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICAgICAgICAgSW50ZXJuYWxGaWVsZCA9PiAxLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICREeW5hbWljRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZE9yZGVyICAgID0+ICROZXh0T3JkZXJOdW1iZXIsCiAgICAgICAgICAgICAgICBGaWVsZFR5cGUgICAgID0+ICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgICA9PiAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgICAgICBDb25maWcgICAgICAgID0+ICREeW5hbWljRmllbGQtPntDb25maWd9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRGaWVsZElEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgb3JkZXIgbnVtYmVyCiAgICAgICAgICAgICROZXh0T3JkZXJOdW1iZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIGR5bmFtaWMgZmllbGRzIGludGVybmFsCiAgICAkU2VsZi0+X01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1JlbmFtZUR5bmFtaWNGaWVsZHMoKQoKVGhpcyBmdW5jdGlvbiByZW5hbWVzIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9SZW5hbWVEeW5hbWljRmllbGRzKCk7Cgo9Y3V0CgpzdWIgX1JlbmFtZUR5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgIG15ICRTdWNjZXNzQ291bnRlcjsKCiAgICAjIHJlbmFtZSB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5ldyAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgIyBnZXQgZXhpc3RpbmcgZHluYW1pYyBmaWVsZCBkYXRhCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9sZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROZXctPntPbGROYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSB0aGUgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgIElEICAgICAgICAgPT4gJER5bmFtaWNGaWVsZE9sZC0+e0lEfSwKICAgICAgICAgICAgRmllbGRPcmRlciA9PiAkRHluYW1pY0ZpZWxkT2xkLT57RmllbGRPcmRlcn0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJER5bmFtaWNGaWVsZE5ldy0+e05hbWV9LAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICREeW5hbWljRmllbGROZXctPntMYWJlbH0sCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJER5bmFtaWNGaWVsZE5ldy0+e0ZpZWxkVHlwZX0sCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJER5bmFtaWNGaWVsZE5ldy0+e09iamVjdFR5cGV9LAogICAgICAgICAgICBDb25maWcgICAgID0+ICREeW5hbWljRmllbGRPbGQtPntDb25maWd9LCAgICAgICAjIHVzZSB0aGUgb2xkIGNvbmZpZyBzZXR0aW5ncwogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFJlb3JkZXIgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAkU3VjY2Vzc0NvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBlcnJvciBoYW5kbGluZyBpZiBub3QgYWxsIGR5bmFtaWMgZmllbGRzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CiAgICBpZiAoIHNjYWxhciBARHluYW1pY0ZpZWxkcyAhPSAkU3VjY2Vzc0NvdW50ZXIgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHJlbmFtZSBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKQoKcmV0dXJucyB0aGUgZGVmaW5pdGlvbiBmb3IgSVRTTSByZWxhdGVkIGR5bmFtaWMgZmllbGRzCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7Cgo9Y3V0CgpzdWIgX0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTVJldmlld1JlcXVpcmVkJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnUmV2aWV3IFJlcXVpcmVkJywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgID0+ICdObycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm8gID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgWWVzID0+ICdZZXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTURlY2lzaW9uUmVzdWx0JywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnRGVjaXNpb24gUmVzdWx0JywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAnUGVuZGluZycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAnQXBwcm92ZWQnICAgICA9PiAnQXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgICdQZW5kaW5nJyAgICAgID0+ICdQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAnUG9zdHBvbmVkJyAgICA9PiAnUG9zdHBvbmVkJywKICAgICAgICAgICAgICAgICAgICAnUHJlLWFwcHJvdmVkJyA9PiAnUHJlLWFwcHJvdmVkJywKICAgICAgICAgICAgICAgICAgICAnUmVqZWN0ZWQnICAgICA9PiAnUmVqZWN0ZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRpbWUzJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTVJlcGFpclN0YXJ0VGltZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ1JlcGFpciBTdGFydCBUaW1lJywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lNCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZWNvdmVyeVN0YXJ0VGltZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ1JlY292ZXJ5IFN0YXJ0IFRpbWUnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICA9PiAwLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFllYXJzSW5GdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzSW5QYXN0ICAgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzUGVyaW9kICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRpbWU1JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTURlY2lzaW9uRGF0ZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0RlY2lzaW9uIERhdGUnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICA9PiAwLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFllYXJzSW5GdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzSW5QYXN0ICAgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzUGVyaW9kICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRpbWU2JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTUR1ZURhdGUnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICdEdWUgRGF0ZScsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDI1OTIwMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDksCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBEeW5hbWljRmllbGRzOwp9Cgo9aXRlbSBfTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpCgpDb252ZXJ0cyB0aGUgZHluYW1pYyBmaWVsZHMgdG8gaW50ZXJuYWwgZmllbGRzLCB3aGljaCBtZWFucyB0aGF0IHRoZXkgY2FuIG5vdCBiZSBkZWxldGVkIGluIHRoZSBhZG1pbiBpbnRlcmZhY2UuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKPWN1dAoKc3ViIF9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIHNldCBhcyBpbnRlcm5hbCBmaWVsZAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgZHluYW1pY19maWVsZAogICAgICAgICAgICAgICAgU0VUIGludGVybmFsX2ZpZWxkID0gMQogICAgICAgICAgICAgICAgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
closed with workaround
ticket is closed with workaround
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::Major
1
current_timestamp
1
current_timestamp
1
ServiceRequest
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1