TimeAccounting
1.2.5
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed problem with the invalid attribute in the action drop down menu. Fixed missing data problem (if you have insert invalid data).
Improved the delete handling and the favorite project function.
Add a handling to provide additional input fields.
Reworked code. Fixed bug#3392. Add a favorite handling for projects. Add a configuration for project<->remark relations. Add functions: ProjectTotalHours and ProjectHistory.
First official version for OTRS 2.3.
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.3.4
2.3.5
2.3.6
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package TimeAccounting.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>no dependencies</li>
</ul>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket TimeAccounting (Zeiterfassung) zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>keine Abhängigkeiten</li>
</ul>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the time accounting module, you need to add them as member to the group 'time_accounting'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf die Zeiterfassung zu gewähren, müssen diese Mitglied der neuen Gruppe 'time_accounting' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'time_accounting' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'time_accounting' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
((enjoy))<br>
<br>
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2009-03-10 12:26:06
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuMTIgMjAwOS8wMi8yNCAxNDo0MjowMSB0ciBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGltZUFjY291bnRpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbiBmb3IgVGltZUFjY291bnRpbmdNb2R1bGUgIHRvIGRlZmluZSB0aGUgcmVnaXN0cmF0aW9uIHNldHRpbmdzIGluIHRoZSBwcm9ncmFtIGFuZCB0byBzZXQgcmlnaHRzIGFuZCBwb3NpdGlvbnMgb2YgaWNvbnMgaW4gdGhlIG5hdmlnYXRpb24gYmFyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZE1vZHVsUmVnaXN0cmF0aW9uIGb8ciBkYXMgWmVpdGVyZmFzc3VuZ3NNb2R1bC4gIEhpZXIKa/ZubmVuIFNpZSBkaWUgQW5nYWJlbiBm/HIgZGllIFJlZ2lzdHJpZXJ1bmcgZGVzIE1vZHVscyBpbSBQcm9ncmFtbSB05HRpZ2VuLiBGZXJuZXIKa/ZubmVuIGRpZSBSZWNodGUgdW5kIGRpZSBQb3NpdGlvbmVuIGRlciBJY29ucyBpbiBkZXIgTmF2aWdhdGlvbnNsZWlzdGUgZ2VzZXR6dCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpbWVBY2NvdW50aW5nPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpbWVBY2NvdW50aW5nPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPlRpbWVBY2NvdW50aW5nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpbWVBY2NvdW50aW5nPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5UaW1lQWNjb3VudGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+dGltZV9hY2NvdW50aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1FZGl0PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjYwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5PdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+T3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm92ZXJ2aWV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1PdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cFJvPnRpbWVfYWNjb3VudGluZzwvR3JvdXBSbz4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RWRpdCB0aW1lIHJlY29yZDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RWRpdDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bmV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1FZGl0PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5uPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlByb2plY3QgdGltZSByZXBvcnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlJlcG9ydGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+cmVwb3J0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1SZXBvcnRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3M8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNldHRpbmc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm1vZHVsZV9zZXR0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1TZXR0aW5nPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3ROYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuYW1lIGZvciBuZXcgcHJvamVjdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBQcm9qZWt0bmFtZSBiZWltIEVyc3RlbGxlbiBlaW5lcyBuZXVlbiBQcm9qZWt0cyBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0U3RhdHVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0dXMgb2YgYW4gbmV3IHByb2plY3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXMgbmV1ZW4gUHJvamVrdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5pbnZhbGlkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj52YWxpZDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuYW1lIGZvciBuZXcgYWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5pdGlhbGVyIE5hbWUgZWluZXIgbmV1ZW4gVOR0aWdrZWl0IGluIGRlciBaZWl0ZXJmYXNzdW5nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvblN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBhY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXIgbmV1ZW4gVOR0aWdrZWl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlcldlZWtseUhvdXJzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhbmRhcmQgd2Vla2x5IGhvdXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBXb2NoZW5hcmJlaXRzemVpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGxlYXZlIGRheXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFVybGF1YnN0YWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4yMzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlck92ZXJ0aW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBvdmVydGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXZlbnR1ZWxsIHZvcmhhbmRlbmVyINxiZXJzdHVuZGVu/GJlcnRyYWcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlU3RhcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGRhdGUgc3RhcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YXJ0ZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAxMC0wMS0wMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVFbmQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGRhdGUgZW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FbmRkYXR1bSBm/HIgZGllIEVpbmdhYmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4yMDEwLTEyLTMxPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyU3RhdHVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0dXMgb2YgYW4gbmV3IHVzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXMgbmV1ZW4gQmVudXR6ZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Xb3JraW5nIGRheXMgYWZ0ZXIgYXQgdGhlIGxhdGVzdCB3b3JraW5nIHVuaXRzIGhhdmUgdG8gaW5zZXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG5hY2ggd2lldmllbGVuIFdlcmt0YWdlbiBzcOR0ZXN0ZW5zIGRpZSBBcmJlaXRzc3R1bmRlbiBlaW5nZXRyYWdlbiB3ZXJkZW4gbfxzc2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj40PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHdhcm5pbmcsIGlmIHRvIG11Y2ggaW5jb21wbGV0ZSB3b3JraW5nIGRheXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlplaWd0IGVpbmUgV2FybnVuZywgd2VubiB6dXZpZWxlIEFyYmVpdHN0YWdlIG5pY2h0IGVpbmdldHJhZ2VuIHd1cmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpOb3RpZnlNb2R1bGUjIyM4ODgtVGltZUFjY291bnRpbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIG5vdGlmaWNhdGlvbiBtb2R1bGUgZ2l2ZXMgYSB3YXJuaW5nIGlmIHRvIG11Y2ggaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYXZhaWxhYmxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCwgZGFzIGRlbiBBZ2VudCBpbSBOb3RpZmljYXRpb24tQmVyZWljaCBkZXMgQWdlbnQtSW50ZXJmYWNlcyBkYXL8YmVyIGluZm9ybWllcnQsIHdlbm4gc2Nob24genUgbGFuZ2Uga2VpbmUgU3R1bmRlbiBtZWhyIGVpbmdldHJhZ2VuIHd1cmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlTm90aWZ5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5vdGlmaWNhdGlvblRpbWVBY2NvdW50aW5nPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6Ok1heEFsbG93ZWRJbnNlcnREYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9yIGhvdyBtYW55IGRheXMgYWdvIHlvdSBjYW4gaW5zZXJ0IHdvcmtpbmcgdW5pdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxlZ3QgZmVzdCwgYmlzIHdhbm4gbWFuIGluIORsdGVyZSBaZWl0ZWludHLkZ2UgYmVhcmJlaXRlbiBrYW5uICh6LiBCLiAxMCBUYWdlIHp1cvxja2xpZWdlbmQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VG8gdXNlLCBpZiBzb21lIGFjdGlvbnMgYWNvdW50IHJlZHVjZWQgd29ya2luZyBob3VycyhLZXkgPSZndDsgdHJhdmVsaW5nOyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBrYW5uIG1hbiBlaW5nZWJlbiwgb2IgZvxyIGVpbmUgYmVzdGltbXRlIFTkdGlna2VpdCwgZGllIHp1IHZlcnJlY2huZW5kZW4gU3R1bmRlbiBnZWv8cnp0IHdlcmRlbi4gWi4gQiB3ZW5uIFJlaXNlemVpdGVuIG51ciB6dXIgSORsZnRlIHZlcmf8dGV0IHdlcmRlbiAoS2V5ID0mZ3Q7IGpvdXJuZXk7IENvbnRlbnQgPSZndDsgNTApLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InRyYXZlbGluZyI+NTA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6SW5wdXRIb3Vyc1dpdGhvdXRTdGFydEVuZFRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXR0aW5nLCBpZiB3b3JraW5nIGhvdXJzIGNhbiBpbnNlcnQgd2l0aG91dCBzdGFydC0gYW5kIGVuZHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxlZ3QgZmVzdCwgb2IgbWFuIEFyYmVpdHNzdHVuZGVuIGF1Y2ggb2huZSBBbmZhbmdzLSB1bmQgRW5kemVpdCBlaW5nZWJlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHJlQXBwbGljYXRpb25Nb2R1bGUjIyNBZ2VudFRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBtb2R1bGUgeW91IGNhbiBmb3JjZSBpbnNlcnRzIGluIHRoZSBUaW1lQWNjb3VudGluZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IEhpbGZlIGRpZXNlcyBNb2R1bHMga/ZubmVuIEVpbnRy5GdlIGluIGRpZSBaZWl0ZXJmYXNzdW5nIGVyend1bmdlbiB3ZXJkZW4sIGluIGRlbSBiZWltIEVpbmxvZ2dlbiBkYXMgUG9ydGFsIGdlYmxvY2t0IHdpcmQgdW5kIG51ciBkYXMgWmVpdGVyZmFzc3VuZ3NmZW5zdGVyIGVyc2NoZWludC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+S2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpbWVBY2NvdW50aW5nPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9yIHdoaWNoIHByb2plY3RzIGlzIGEgcmVtYXJrIHJlcXVpcmVkLiBJZiB0aGUgUmVnRXhwIG1hdGNoIG9uIHRoZSBwcm9qZWN0LCB5b3UgaGF2ZSB0byBpbnNlcnQgYSByZW1hcmsgdG9vLiBUaGUgUmVnRXhwIHVzZSB0aGUgc214IHBhcmFtZXRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5uZXJoYWxiIGRpZXNlciBLb25maWd1cmF0aW9uc29wdGlvbiBrYW5uIGVpbmUgUmVnRXhwIGRlZmluaWVydCB3ZXJkZW4sIGRpZSBmZXN0bGVndCwgYmVpIHdlbGNoZW4gUHJvamVrdGVuIGVpbmUgQmVtZXJrdW5nIGVpbmdldHJhZ2VuIHdlcmRlbiBtdXNzIChkaWUgUmVnRXhwIGFyYmVpdGV0IG1pdCBzbXgtUGFyYW1ldGVybikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPl4oPzogUFJPSkVDVFwjIHwgSU5GUkE6IHwgUFJPRFVDVDogKTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuMzEgMjAwOS8wMy8xMCAxMToyMDo0NiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzEgJCkgWzFdOwoKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWspOwoKPWhlYWQxIE5BTUUjCgpLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmcgLSB0aW1lYWNjb3VudGluZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHRpbWVhY2NvdW50aW5nIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UjCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZUFjY291bnRpbmdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJJRCBUaW1lT2JqZWN0IFVzZXJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFVzZXJDdXJyZW50UGVyaW9kR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgb2YgdGhlIGN1cnJlbnQgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMTInOwogICAgICAgIERheSAgID0+ICcyNCcKICAgICk7Cgo9Y3V0CgpzdWIgVXNlckN1cnJlbnRQZXJpb2RHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlckN1cnJlbnRQZXJpb2RHZXQ6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApIC4gIiAwMDowMDowMCI7CgogICAgIyBDYWNoaW5nCiAgICBpZiAoICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9eyREYXRlfSApIHsKICAgICAgICByZXR1cm4gJXsgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317JERhdGV9IH07CiAgICB9CgogICAgIyBkYiBzZWxlY3QKICAgIG15ICVEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAiCiAgICAgICAgICAgIC4gIldIRVJFIGRhdGVfc3RhcnQgPD0gJyREYXRlJyBBTkQgZGF0ZV9lbmQgID49JyREYXRlJyIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAkVXNlclJlZiA9IHsKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGVyaW9kICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgPT4gc3Vic3RyKCAkUm93WzJdLCAwLCAxMCApLAogICAgICAgICAgICBEYXRlRW5kICAgICA9PiBzdWJzdHIoICRSb3dbM10sIDAsIDEwICksCiAgICAgICAgICAgIFdlZWtseUhvdXJzID0+ICRSb3dbNF0sCiAgICAgICAgICAgIExlYXZlRGF5cyAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIE92ZXJ0aW1lICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIFVzZXJTdGF0dXMgID0+ICRSb3dbN10sCiAgICAgICAgfTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFVzZXJSZWY7CiAgICB9CgogICAgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317JERhdGV9ID0gXCVEYXRhOwoKICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclJlcG9ydGluZygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGxlYXZlZGF5cywgb3ZlcnRpbWVzLAp3b3JraW5naG91cnMgZXRjLiBvZiBhbGwgdXNlcnMKCiAgICBteSAlRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzEyJywKICAgICAgICBEYXkgICA9PiAnMTInLCAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgVXNlclJlcG9ydGluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhID0gKCk7CiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICYmICRfIG5lICdEYXknICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiVXNlclJlcG9ydGluZzogTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte0RheX0gfHw9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwoKICAgIG15ICVVc2VyQ3VycmVudFBlcmlvZCA9ICRTZWxmLT5Vc2VyQ3VycmVudFBlcmlvZEdldCglUGFyYW0pOwogICAgbXkgJFllYXJTdGFydCAgICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkRGF5U3RhcnQgICAgICAgICAgPSAwOwogICAgbXkgJFllYXJFbmQgICAgICAgICAgID0gJFBhcmFte1llYXJ9OwogICAgbXkgJE1vbnRoRW5kICAgICAgICAgID0gJFBhcmFte01vbnRofTsKICAgIG15ICREYXlFbmQgICAgICAgICAgICA9ICRQYXJhbXtEYXl9OwoKICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlckN1cnJlbnRQZXJpb2QgKSB7CiAgICAgICAgaWYgKCAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17RGF0ZVN0YXJ0fSA9fiAvXihcZCspLShcZCspLShcZCspLyApIHsKICAgICAgICAgICAgJFllYXJTdGFydCAgPSAkMTsKICAgICAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAgICAgJERheVN0YXJ0ICAgPSAkMzsKICAgICAgICB9CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXl9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1NpY2t9ICAgICAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZX0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9ICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5VG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtTaWNrVG90YWx9ICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9ID0gMDsKCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkWWVhciAoICRZZWFyU3RhcnQgLi4gJFllYXJFbmQgKSB7CiAgICAgICAgICAgIG15ICRNb250aFN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ID8gJE1vbnRoU3RhcnQgOiAxOwogICAgICAgICAgICBteSAkTW9udGhFbmRQb2ludCAgID0gJFllYXIgPT0gJFllYXJFbmQgICA/ICRNb250aEVuZCAgIDogMTI7CgogICAgICAgICAgICBmb3IgbXkgJE1vbnRoICggJE1vbnRoU3RhcnRQb2ludCAuLiAkTW9udGhFbmRQb2ludCApIHsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RhcnRQb2ludCA9ICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ID8gJERheVN0YXJ0IDogMTsKICAgICAgICAgICAgICAgIG15ICREYXlFbmRQb2ludCA9ICRZZWFyID09ICRZZWFyRW5kCiAgICAgICAgICAgICAgICAgICAgJiYgJE1vbnRoID09ICRNb250aEVuZCA/ICREYXlFbmQgOiBEYXlzX2luX01vbnRoKCAkWWVhciwgJE1vbnRoICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKCAkRGF5U3RhcnRQb2ludCAuLiAkRGF5RW5kUG9pbnQgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gJFNlbGYtPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJExlYXZlRGF5ICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNpY2sgICAgICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJE92ZXJ0aW1lICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldFN0YXRlICA9IDA7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFdvcmtpbmdVbml0e0xlYXZlRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJExlYXZlRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkV29ya2luZ1VuaXR7U2lja30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1NpY2tUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJFNpY2sgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXb3JraW5nVW5pdHtPdmVydGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdmVydGltZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnNUb3RhbH0gKz0gJFdvcmtpbmdVbml0e1RvdGFsfTsKICAgICAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgIERheSAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkV2Vla2RheSAhPSA2CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU2ljawogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJExlYXZlRGF5CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9IC8gNTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFN0YXRlID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e1dlZWtseUhvdXJzfSAvIDU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb250aCA9PSAkTW9udGhFbmQgJiYgJFllYXIgPT0gJFllYXJFbmQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlfSAgKz0gJFRhcmdldFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9ICs9ICRXb3JraW5nVW5pdHtUb3RhbH07CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5fSAgICAgKz0gJExlYXZlRGF5OwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtTaWNrfSAgICAgICAgICs9ICRTaWNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZX0gPSAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9IC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e092ZXJ0aW1lfQogICAgICAgICAgICArICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc1RvdGFsfQogICAgICAgICAgICAtICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVW50aWx9ID0gJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gLSAkRGF0YXskVXNlcklEfXtPdmVydGltZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlSZW1haW5pbmd9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0xlYXZlRGF5c30gLSAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHByb2plY3QgZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnIHx8ICdpbnZhbGlkJywgb3B0aW9uYWwgZGVmYXVsdCB2YWxpZCAmJiBpbnZhbGlkCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJFdoZXJlID0gJyc7CgogICAgaWYgKCAkUGFyYW17U3RhdHVzfSApIHsKICAgICAgICAkV2hlcmUgPSAnIFdIRVJFIHN0YXR1cyA9ICc7CiAgICAgICAgJFdoZXJlIC49ICRQYXJhbXtTdGF0dXN9IGVxICdpbnZhbGlkJyA/ICcwJyA6ICcxJzsKICAgIH0KCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAkV2hlcmUiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJElEID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtQcm9qZWN0fXskSUR9ICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRhe1Byb2plY3REZXNjcmlwdGlvbn17JElEfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7UHJvamVjdFN0YXR1c317JElEfSAgICAgID0gJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KAogICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywgIyBvcHRpb25hbAogICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLCAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17UHJvamVjdH0gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3ROYW1lJykgfHwgJyc7CiAgICAkUGFyYW17UHJvamVjdFN0YXR1c30gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3RTdGF0dXMnKQogICAgICAgIHx8ICcwJzsKICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259IHx8PSAnJzsKCiAgICAjIGJ1aWxkIHNxbAoKICAgIG15ICRTUUwKICAgICAgICA9ICdJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAocHJvamVjdCwgZGVzY3JpcHRpb24sIHN0YXR1cykgVkFMVUVTICggPyAsID8gLCA/KSc7CgogICAgbXkgJEJpbmQgPSBbXCRQYXJhbXtQcm9qZWN0fSwgXCRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259LCBcJFBhcmFte1Byb2plY3RTdGF0dXN9XTsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSBwcm9qZWN0IGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBQcm9qZWN0SUQKICAgICAgICAgICAgUHJvamVjdCAgICAgICA9PiAnaW50ZXJuYWwnLAogICAgICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ3Byb2plY3RuYW1lJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBQUk9KRUNUSUQ6CiAgICBmb3IgbXkgJFByb2plY3RJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgbmV4dCBpZiAhJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3R9OwoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwKICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0ICIKICAgICAgICAgICAgLiAiU0VUIHByb2plY3QgPSA/ICwgc3RhdHVzID0gPyAsIGRlc2NyaXB0aW9uID0gPyAgV0hFUkUgaWQgPSA/IjsKCiAgICAgICAgbXkgJEJpbmQgPSBbXCRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fSwgXCRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0U3RhdHVzfSwgXCRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0RGVzY3JpcHRpb259LCBcJFByb2plY3RJRCBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgYWN0aW9uIHNldHRpbmdzCgogICAgbXkgJUFjdGlvbkRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPkFjdGlvblNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgaWQsIGFjdGlvbiwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX2FjdGlvbicsICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9ufSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtBY3Rpb25TdGF0dXN9ID0gJFJvd1syXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyBhY3Rpb24gZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPkFjdGlvblNldHRpbmdzSW5zZXJ0KAogICAgICAgIEFjdGlvbiAgICAgICA9PiAnbWVldGluZycsICAgIyBvcHRpb25hbAogICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGIgcXVvdGUKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgIH0KCiAgICAkUGFyYW17QWN0aW9ufSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZScpIHx8ICcnOwogICAgJFBhcmFte0FjdGlvblN0YXR1c30gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvblN0YXR1cycpCiAgICAgICAgfHwgJzAnOwoKICAgICMgYnVpbGQgc3FsCiAgICBteSAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX2FjdGlvbiAoYWN0aW9uLCBzdGF0dXMpIgogICAgICAgIC4gIiBWQUxVRVMgKCckUGFyYW17QWN0aW9ufScgLCAnJFBhcmFte0FjdGlvblN0YXR1c30nKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSBhY3Rpb24gZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPkFjdGlvblNldHRpbmdzVXBkYXRlKAogICAgICAgIDEgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnbWVldGluZycsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBBY3Rpb25JRAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJ2pvdXJuZXknLAogICAgICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBBQ1RJT05JRDoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIG5leHQgQUNUSU9OSUQgaWYgISRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn07CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTCAgPSAnVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gU0VUIGFjdGlvbiA9ID8gLCBzdGF0dXMgPSA/IFdIRVJFIGlkID0gPyAnOwogICAgICAgIG15ICRCaW5kID0gWyBcJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSAsIFwkUGFyYW17JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9ICwgXCRBY3Rpb25JRCBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFVzZXJMaXN0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgZGF0YSBvZiBhbGwgdXNlcgoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckxpc3QoKTsKCj1jdXQKCnN1YiBVc2VyTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIHVzZXJfaWQsIGRlc2NyaXB0aW9uLCBzaG93X292ZXJ0aW1lLCBjcmVhdGVfcHJvamVjdCwgY2FsZW5kYXIgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcicsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e1VzZXJJRH0gICAgICAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0Rlc2NyaXB0aW9ufSAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e1Nob3dPdmVydGltZX0gID0gJFJvd1syXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0NyZWF0ZVByb2plY3R9ID0gJFJvd1szXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0NhbGVuZGFyfSAgICAgID0gJFJvd1s0XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlckdldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIGRhdGEgb2Ygb25lIHVzZXIKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+IDE1LCAgIwogICAgKTsKCj1jdXQKCnN1YiBVc2VyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdVc2VyR2V0OiBOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgZGVzY3JpcHRpb24sIHNob3dfb3ZlcnRpbWUsIGNyZWF0ZV9wcm9qZWN0LCBjYWxlbmRhciBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyIFdIRVJFIHVzZXJfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXtVc2VySUR9ICAgICAgICA9ICRQYXJhbXtVc2VySUR9OwogICAgICAgICREYXRhe0Rlc2NyaXB0aW9ufSAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtTaG93T3ZlcnRpbWV9ICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7Q3JlYXRlUHJvamVjdH0gPSAkUm93WzJdOwogICAgICAgICREYXRhe0NhbGVuZGFyfSAgICAgID0gJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzICcKICAgICAgICAgICAgLgogICAgICAgICAgICAnRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QnLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1VzZXJJRH0gICAgICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1BlcmlvZH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0RhdGVTdGFydH0gICA9IHN1YnN0ciggJFJvd1syXSwgMCwgMTAgKTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17RGF0ZUVuZH0gICAgID0gc3Vic3RyKCAkUm93WzNdLCAwLCAxMCApOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtXZWVrbHlIb3Vyc30gPSAkUm93WzRdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtMZWF2ZURheXN9ICAgPSAkUm93WzVdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtPdmVydGltZX0gICAgPSAkUm93WzZdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtVc2VyU3RhdHVzfSAgPSAkUm93WzddOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgVXNlcklEICAgICAgID0+ICcyJywKICAgICAgICBQZXJpb2QgICAgICAgPT4gJzInLAogICAgKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9OwoKICAgICRQYXJhbXtXZWVrbHlIb3Vyc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyV2Vla2x5SG91cnMnKQogICAgICAgIHx8ICc0MCc7CiAgICAkUGFyYW17TGVhdmVEYXlzfSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzJykgfHwgJzI1JzsKICAgICRQYXJhbXtVc2VyU3RhdHVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJTdGF0dXMnKSAgICB8fCAnMSc7CiAgICAkUGFyYW17T3ZlcnRpbWV9ICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyT3ZlcnRpbWUnKSAgfHwgJzAnOwogICAgJFBhcmFte0RhdGVFbmR9ICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVFbmQnKQogICAgICAgIHx8ICcyMDA3LTEyLTMxJzsKICAgICRQYXJhbXtEYXRlU3RhcnR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVTdGFydCcpCiAgICAgICAgfHwgJzIwMDctMDEtMDEnOwogICAgJFBhcmFte0Rlc2NyaXB0aW9ufSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEZXNjcmlwdGlvbicpCiAgICAgICAgfHwgJyc7CgogICAgIyBkYiBxdW90ZQogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApOwogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHNxbAogICAgbXkgJFNRTAogICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAodXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCIKICAgICAgICAuICIgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzKSIKICAgICAgICAuICIgVkFMVUVTIgogICAgICAgIC4gIiAoJyRQYXJhbXtVc2VySUR9JywgJyRQYXJhbXtQZXJpb2R9JywgJyRQYXJhbXtEYXRlU3RhcnR9IDAwOjAwOjAwJywgJyRQYXJhbXtEYXRlRW5kfSAwMDowMDowMCcsIgogICAgICAgIC4gIiAnJFBhcmFte1dlZWtseUhvdXJzfScsICckUGFyYW17TGVhdmVEYXlzfScsICckUGFyYW17T3ZlcnRpbWV9JywgJyRQYXJhbXtVc2VyU3RhdHVzfScpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CgogICAgIyBTcGxpdCB0aGUgZm9sbG93aW5nIGNvZGUgaW4gYSBzZXBlcmF0ZSBmdW5jdGlvbiEKCiAgICAjY2hlY2sgaWYgdGhlIHVzZXIgc3RpbGwgZXhpc3RzCiAgICBteSAkVXNlcklEOwoKICAgICMgYnVpbGQgc3FsCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXIgV0hFUkUgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfSciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFVzZXJJRCA9ICRSb3dbMF07CiAgICB9CiAgICBpZiAoICFkZWZpbmVkICRVc2VySUQgKSB7CiAgICAgICAgJFNRTCA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdXNlciAodXNlcl9pZCwgZGVzY3JpcHRpb24pIgogICAgICAgICAgICAuICIgVkFMVUVTIgogICAgICAgICAgICAuICIgKCckUGFyYW17VXNlcklEfScsICckUGFyYW17RGVzY3JpcHRpb259JykiOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgdXNlciBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclNldHRpbmdzVXBkYXRlKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIFRleHQnLAogICAgICAgIENyZWF0ZVByb2plY3QgPT4gMSB8fCAwLAogICAgICAgIFNob3dPdmVydGltZSAgPT4gMSB8fCAwLAogICAgICAgIDEgICAgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgICAgIENyZWF0ZVByb2plY3QgPT4gMSB8fCAwLAogICAgICAgICAgICBTaG93T3ZlcnRpbWUgID0+IDEgfHwgMCwKICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcmlvZCAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBEYXRlU3RhcnQgICAgPT4gJzIwMDUtMTItMTInLAogICAgICAgICAgICAgICAgRGF0ZUVuZCAgICAgID0+ICcyMDA1LTEyLTMxJywKICAgICAgICAgICAgICAgIFdlZWtseUhvdXJzICA9PiAnMzgnLAogICAgICAgICAgICAgICAgTGVhdmVEYXlzICAgID0+ICcyNScsCiAgICAgICAgICAgICAgICBPdmVydGltZSAgICAgPT4gJzM4JywKICAgICAgICAgICAgICAgIFVzZXJTdGF0dXMgICA9PiAxIHx8IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsKICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMiwKICAgICAgICAgICAgICAgIFBlcmlvZCAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBEYXRlU3RhcnQgICAgPT4gJzIwMDUtMTItMTInLAogICAgICAgICAgICAgICAgRGF0ZUVuZCAgICAgID0+ICcyMDA1LTEyLTMxJywKICAgICAgICAgICAgICAgIFdlZWtseUhvdXJzICA9PiAnMzgnLAogICAgICAgICAgICAgICAgTGVhdmVEYXlzICAgID0+ICcyNScsCiAgICAgICAgICAgICAgICBPdmVydGltZSAgICAgPT4gJzM4JywKICAgICAgICAgICAgICAgIFVzZXJTdGF0dXMgICA9PiAxIHx8IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9OwoKICAgIFVTRVJJRDoKICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVQYXJhbSApIHsKCiAgICAgICAgbXkgJFVzZXJSZWYgPSAkUGFyYW17JFVzZXJJRH07CgogICAgICAgIGlmICggIWRlZmluZWQgJFVzZXJSZWYtPnsxfXtEYXRlU3RhcnR9ICYmICFkZWZpbmVkICRVc2VyUmVmLT57MX17RGF0ZUVuZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyU2V0dGluZ1VwZGF0ZTogVGhlcmUgYXJlIG5vIGRhdGEgZm9yIHVzZXIgaWQgJFVzZXJJRCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgVVNFUklEOwogICAgICAgIH0KCiAgICAgICAgI3NldCBkZWZhdWx0IGZvciBTaG93T3ZlclRpbWUuLi4KICAgICAgICAkVXNlclJlZi0+e1Nob3dPdmVydGltZX0gfHw9IDA7CgogICAgICAgICNzZXQgZGVmYXVsdCBmb3IgQ3JlYXRlUHJvamVjdC4uLgogICAgICAgICRVc2VyUmVmLT57Q3JlYXRlUHJvamVjdH0gfHw9IDA7CiAgICAgICAgJFVzZXJSZWYtPntDYWxlbmRhcn0gICAgICB8fD0gMDsKCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMCiAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfdXNlciAiCiAgICAgICAgICAgIC4gIlNFVCBkZXNjcmlwdGlvbiA9ID8sIHNob3dfb3ZlcnRpbWUgPSA/LCBjcmVhdGVfcHJvamVjdCA9ID8sIGNhbGVuZGFyID0gPyAiCiAgICAgICAgICAgIC4gIldIRVJFIHVzZXJfaWQgPSA/IjsKCiAgICAgICAgbXkgJEJpbmQgPSBbCiAgICAgICAgICAgIFwkVXNlclJlZi0+e0Rlc2NyaXB0aW9ufSwgXCRVc2VyUmVmLT57U2hvd092ZXJ0aW1lfSwKICAgICAgICAgICAgXCRVc2VyUmVmLT57Q3JlYXRlUHJvamVjdH0sIFwkVXNlclJlZi0+e0NhbGVuZGFyfSwgXCRVc2VyUmVmLT57VXNlcklEfQogICAgICAgIF07CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCA9PiAkQmluZCwKICAgICAgICApOwoKICAgICAgICBmb3IgKHF3KFVzZXJJRCBEZXNjcmlwdGlvbiBTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCBDYWxlbmRhcikpIHsKICAgICAgICAgICAgZGVsZXRlICRVc2VyUmVmLT57JF99OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBrZXlzICV7JFVzZXJSZWZ9ICkgewoKICAgICAgICAgICAgbXkgJFBlcmlvZFJlZiA9ICRVc2VyUmVmLT57JFBlcmlvZH07CgogICAgICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgICAgICBteSAkU1FMCiAgICAgICAgICAgICAgICA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIKICAgICAgICAgICAgICAgIC4gIlNFVCBsZWF2ZV9kYXlzID0gPywgZGF0ZV9zdGFydCA9ID8iCiAgICAgICAgICAgICAgICAuICIsIGRhdGVfZW5kID0gPywgb3ZlcnRpbWUgPSA/IgogICAgICAgICAgICAgICAgLiAiLCB3ZWVrbHlfaG91cnMgPSA/LCBzdGF0dXMgPSA/ICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIHVzZXJfaWQgPSA/IEFORCBwcmVmZXJlbmNlX3BlcmlvZCA9ID8iOwoKICAgICAgICAgICAgbXkgJEJpbmQgPSBbCiAgICAgICAgICAgICAgICBcJFBlcmlvZFJlZi0+e0xlYXZlRGF5c30sIFwkUGVyaW9kUmVmLT57RGF0ZVN0YXJ0fSwgICBcJFBlcmlvZFJlZi0+e0RhdGVFbmR9LAogICAgICAgICAgICAgICAgXCRQZXJpb2RSZWYtPntPdmVydGltZX0sICBcJFBlcmlvZFJlZi0+e1dlZWtseUhvdXJzfSwgXCRQZXJpb2RSZWYtPntVc2VyU3RhdHVzfSwKICAgICAgICAgICAgICAgIFwkUGVyaW9kUmVmLT57VXNlcklEfSwgICAgXCRQZXJpb2QsCiAgICAgICAgICAgIF07CgogICAgICAgICAgICAjIGRiIGluc2VydAogICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5cyBhbmQKdGhlIGluZm9ybWF0aW9uIGlmIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBpbiB0aGUgYWxsb3dlZApyYW5nZS4KCiAgICBteSAlV29ya2luZ1VuaXRzQ2hlY2sgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgICAgICAgICAgICAgICAgPSAoKTsKICAgIG15ICRXb3JraW5nVW5pdElEICAgICAgID0gMDsKICAgIG15ICVDb21wbGV0ZVdvcmtpbmdEYXlzID0gKCk7CiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwoKICAgIG15ICRVc2VySUQgPSAkUGFyYW17VXNlcklEfSB8fCAkU2VsZi0+e1VzZXJJRH07CgogICAgIyBUT0RPOiBTZWFyY2ggb25seSBpbiB0aGUgQ3VycmVudFVzZXJQZXJpb2QKICAgICMgVE9ETzogU2VhcmNoIG9ubHkgd29ya2luZyB1bml0cyB3aGVyZSBhY3Rpb25faWQgYW5kIHByb2plY3RfaWQgaXMgdHJ1ZQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gIlNFTEVDVCBESVNUSU5DVCB0aW1lX3N0YXJ0IEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHVzZXJfaWQgPSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRVc2VySUQgXSwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXihcZCspLShcZCspLShcZCspLyApIHsKICAgICAgICAgICAgJENvbXBsZXRlV29ya2luZ0RheXN7JDF9eyQyfXskM30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwoKICAgIG15ICRXb3JraW5nRGF5cyA9IDA7CiAgICBteSAkWWVhclN0YXJ0ICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnQgID0gMDsKICAgIG15ICREYXlTdGFydCAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgPSAkWWVhcjsKICAgIG15ICRNb250aEVuZCAgICA9ICRNb250aDsKICAgIG15ICREYXlFbmQgICAgICA9ICREYXk7CgogICAgaWYgKCAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17RGF0ZVN0YXJ0fSA9fiAvXihcZCspLShcZCspLShcZCspLyApIHsKICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICRNb250aFN0YXJ0ID0gJDI7CiAgICAgICAgJERheVN0YXJ0ICAgPSAkMzsKICAgIH0KCiAgICBteSAkQ2FsZW5kYXIgPSB7ICRTZWxmLT5Vc2VyR2V0KCBVc2VySUQgPT4gJFVzZXJJRCApIH0tPntDYWxlbmRhcn07CgogICAgZm9yIG15ICRZZWFyICggJFllYXJTdGFydCAuLiAkWWVhckVuZCApIHsKCiAgICAgICAgbXkgJE1vbnRoU3RhcnRQb2ludCA9ICRZZWFyID09ICRZZWFyU3RhcnQgPyAkTW9udGhTdGFydCA6IDE7CiAgICAgICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9ICRZZWFyID09ICRZZWFyRW5kICAgPyAkTW9udGhFbmQgICA6IDEyOwoKICAgICAgICBmb3IgbXkgJE1vbnRoICggJE1vbnRoU3RhcnRQb2ludCAuLiAkTW9udGhFbmRQb2ludCApIHsKICAgICAgICAgICAgbXkgJERheVN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCA/ICREYXlTdGFydCA6IDE7CiAgICAgICAgICAgIG15ICREYXlFbmRQb2ludCA9ICRZZWFyID09ICRZZWFyRW5kCiAgICAgICAgICAgICAgICAmJiAkTW9udGggPT0gJE1vbnRoRW5kID8gJERheUVuZCA6IERheXNfaW5fTW9udGgoICRZZWFyLCAkTW9udGggKTsKICAgICAgICAgICAgbXkgJE1vbnRoU3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKCiAgICAgICAgICAgIGZvciBteSAkRGF5ICggJERheVN0YXJ0UG9pbnQgLi4gJERheUVuZFBvaW50ICkgewogICAgICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFllYXIgICAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICAgID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJERheVN0cmluZyA9IHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgICAgICAgICAgbXkgJFdlZWtkYXkgPSBEYXlfb2ZfV2VlayggJFllYXIsICRNb250aCwgJERheSApOwogICAgICAgICAgICAgICAgaWYgKCAkV2Vla2RheSAhPSA2ICYmICRXZWVrZGF5ICE9IDcgJiYgISRWYWNhdGlvbkNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICRXb3JraW5nRGF5cysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRXZWVrZGF5ICE9IDYKICAgICAgICAgICAgICAgICAgICAmJiAkV2Vla2RheSAhPSA3CiAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgJiYgISRDb21wbGV0ZVdvcmtpbmdEYXlzeyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9ID0gJFdvcmtpbmdEYXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzJykgfHwgJzUnOwogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcnKQogICAgICAgIHx8ICczJzsKICAgIGZvciBteSAkWWVhciAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICBmb3IgbXkgJE1vbnRoICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICREYXkgKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH17JERheX0KICAgICAgICAgICAgICAgICAgICA8ICRXb3JraW5nRGF5cyAtICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0VuZm9yY2VJbnNlcnR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fQogICAgICAgICAgICAgICAgICAgIDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe1dhcm5pbmd9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB3b3JraW5nIHVuaXRzIGRhdGEKCiAgICBteSAlV29ya2luZ1VuaXRzRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgIFllYXIgICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggID0+ICc3JywKICAgICAgICBEYXkgICAgPT4gJzEzJywKICAgICAgICBVc2VySUQgPT4gJzInLCAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgIH0KCiAgICAkUGFyYW17VXNlcklEfSB8fD0gJFNlbGYtPntVc2VySUR9OwoKICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCIKICAgICAgICAgICAgLiAiIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJSciCiAgICAgICAgICAgIC4gIiBBTkQgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfScgT1JERVIgYnkgaWQiLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBUb3RhbCA9PiAwLAogICAgICAgIERhdGUgID0+ICREYXRlLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgJFJvd1s0XSAhfiBte14gKC4rPykgXHMgKFxkKzpcZCspIDogKFxkKykgfXNteDsKCiAgICAgICAgIyBjaGVjayBpZiBpdCBpcyBhIHNwZWNpYWwgd29ya2luZyB1bml0CiAgICAgICAgaWYgKCAkUm93WzFdID09IC0xICkgewogICAgICAgICAgICBteSAkQWN0aW9uSUQgPSAkUm93WzJdOwoKICAgICAgICAgICAgJERhdGF7U2lja30gICAgID0gJEFjdGlvbklEID09IC0xID8gMSA6IDA7CiAgICAgICAgICAgICREYXRhe0xlYXZlRGF5fSA9ICRBY3Rpb25JRCA9PSAtMiA/IDEgOiAwOwogICAgICAgICAgICAkRGF0YXtPdmVydGltZX0gPSAkQWN0aW9uSUQgPT0gLTMgPyAxIDogMDsKCiAgICAgICAgICAgIG5leHQgUk9XOwogICAgICAgIH0KICAgICAgICBteSAkU3RhcnRUaW1lID0gJDI7CiAgICAgICAgbXkgJEVuZFRpbWUgPSAnJzsKICAgICAgICBpZiAoJFJvd1s1XSA9fiBte14oLis/KVxzKFxkKzpcZCspOihcZCspfXNteCkgewogICAgICAgICAgICAkRW5kVGltZSA9ICQyOwogICAgICAgIH0KCiAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gKAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUHJvamVjdElEID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAkUm93WzJdLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgUGVyaW9kICAgID0+IGRlZmluZWQoICRSb3dbNl0gKSA/IHNwcmludGYoICIlLjJmIiwgJFJvd1s2XSApIDogMCwKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgY291bnQgY29tcGxldGUgd29ya2luZyB1bml0cwogICAgICAgIGlmICgkUm93WzFdICYmICRSb3dbMl0pIHsKICAgICAgICAgICAgJERhdGF7VG90YWx9ICs9ICRXb3JraW5nVW5pdHtQZXJpb2R9OwogICAgICAgIH0KICAgICAgICBwdXNoIEB7JERhdGF7V29ya2luZ1VuaXRzfX0sIFwlV29ya2luZ1VuaXQ7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0luc2VydCgpCgppbnNlcnQgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0luc2VydCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzA3JywKICAgICAgICBEYXkgICA9PiAnMDInLAogICAgICAgIExlYXZlRGF5ID0+IDEsIHx8IDAKICAgICAgICBTaWNrICAgICA9PiAxLCB8fCAwCiAgICAgICAgT3ZlcnRpbWUgPT4gMSwgfHwgMAogICAgICAgIFdvcmtpbmdVbml0cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAxLAogICAgICAgICAgICAgICAgQWN0aW9uSUQgID0+IDIzLAogICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICdTb21lVGV4dCwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnNzozMCcsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJzExOjAwJywKICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAnOC41JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgeyAuLi4uLi4gfSwKICAgICAgICBdCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya2luZ1VuaXRzSW5zZXJ0OiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwoKICAgICMgZGVsZXRlIGV4aXRpbmcgZGF0YQogICAgaWYgKCAhJFNlbGYtPldvcmtpbmdVbml0c0RlbGV0ZSggJVBhcmFtICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIHNwZWNpYWwgdGltZSB3b3JraW5nIHVuaXRzCiAgICBteSAlU3BlY2lhbEFjdGlvbiA9ICgKICAgICAgICAnU2ljaycgICAgID0+ICctMScsCiAgICAgICAgJ0xlYXZlRGF5JyA9PiAnLTInLAogICAgICAgICdPdmVydGltZScgPT4gJy0zJywKICAgICk7CgogICAgRUxFTUVOVDoKICAgIGZvciBteSAkRWxlbWVudCAocXcoTGVhdmVEYXkgU2ljayBPdmVydGltZSkpIHsKICAgICAgICBuZXh0IEVMRU1FTlQgaWYgISRQYXJhbXskRWxlbWVudH07CgogICAgICAgIG15ICVVbml0ID0gKAogICAgICAgICAgICBQcm9qZWN0SUQgPT4gLTEsCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAkU3BlY2lhbEFjdGlvbnskRWxlbWVudH0sCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAnJywKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJycsCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQHskUGFyYW17V29ya2luZ1VuaXRzfX0sIFwlVW5pdDsKICAgIH0KCiAgICAjaW5zZXJ0IG5ldyB3b3JraW5nIHVuaXRzCiAgICBVTklUUkVGOgogICAgZm9yIG15ICRVbml0UmVmICggQHskUGFyYW17V29ya2luZ1VuaXRzfX0gKSB7CiAgICAgICAgI25leHQgVU5JVFJFRiBpZiAhJFVuaXRSZWYtPntQcm9qZWN0SUR9IHx8ICEkVW5pdFJlZi0+e0FjdGlvbklEfTsKCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICREYXRlIC4gJyAnIC4gJFVuaXRSZWYtPntTdGFydFRpbWV9OwogICAgICAgIG15ICRFbmRUaW1lICAgPSAkRGF0ZSAuICcgJyAuICRVbml0UmVmLT57RW5kVGltZX07CgogICAgICAgICMgJycgZG9lcyBub3Qgd29yayBpbiBpbnRlZ2VyIGZpZWxkIG9mIHBvc3RncmVzCiAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9ICAgIHx8PSAwOwogICAgICAgICRVbml0UmVmLT57QWN0aW9uSUR9ICAgICB8fD0gMDsKICAgICAgICAkVW5pdFJlZi0+e1BlcmlvZH0gICAgICAgfHw9IDA7CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdGFibGUgKHVzZXJfaWQsIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcmVtYXJrLCIKICAgICAgICAgICAgLiAiIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCBwZXJpb2QsIGNyZWF0ZWQgKSIKICAgICAgICAgICAgLiAiIFZBTFVFUyAgKCA/LCA/LCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCkiOwogICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICBcJFNlbGYtPntVc2VySUR9LCBcJFVuaXRSZWYtPntQcm9qZWN0SUR9LCBcJFVuaXRSZWYtPntBY3Rpb25JRH0sCiAgICAgICAgICAgIFwkVW5pdFJlZi0+e1JlbWFya30sIFwkU3RhcnRUaW1lLCBcJEVuZFRpbWUsIFwkVW5pdFJlZi0+e1BlcmlvZH0KICAgICAgICBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0RlbGV0ZSgpCgpkZWxldHMgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzcnLAogICAgICAgIERheSAgID0+ICcxMycsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXb3JraW5nVW5pdHNJbnNlcnQ6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgIyBkZWxldGUgb2xkIHdvcmtpbmcgdW5pdHMKICAgIG15ICRTUUwgPSAiREVMRVRFIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlICIKICAgICAgICAuICJXSEVSRSB0aW1lX3N0YXJ0IDw9ICckRGF0ZSAyMzo1OTo1OScgQU5EIHRpbWVfc3RhcnQgPj0gJyREYXRlIDAwOjAwOjAwJyAiCiAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRTZWxmLT57VXNlcklEfSciOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RBY3Rpb25SZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaG91cnMgZGVwZW5kZW50IHByb2plY3QgYW5kIGFjdGlvbiBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgIFllYXIgID0+IDIwMDUsCiAgICAgICAgTW9udGggPT4gNywKICAgICAgICBVc2VySUQgPT4gMTIzLCAjIG9wdGlvbmFsOyBubyBVc2VySUQgbWVhbnMgJ29mIGFsbCB1c2VyJwogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgICAgID0gKCk7CiAgICBteSAkSURTZWxlY3QgPSAnJzsKICAgIGZvciAocXcoWWVhciBNb250aCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1VzZXJJRH0gKSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CgogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXlzSW5Nb250aCA9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwogICAgbXkgJERhdGVTdHJpbmcgPSAkUGFyYW17WWVhcn0gLiAiLSIgLiBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKCiAgICBteSAkU1FMX1F1ZXJ5X1RpbWVTdGFydCA9ICJ0aW1lX3N0YXJ0IDw9ICckRGF0ZVN0cmluZy0kRGF5c0luTW9udGggMjM6NTk6NTknJElEU2VsZWN0IjsKCiAgICAjIFRvdGFsIGhvdXJzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSBwcm9qZWN0X2lkICE9IC0xIEFORCAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IGlmICEkUm93WzJdOwogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9uc317ICRSb3dbMV0gfXtUb3RhbH0gKz0gJFJvd1syXTsKICAgIH0KCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSIKICAgICAgICAgICAgLiAiIFdIRVJFIHByb2plY3RfaWQgIT0gLTEgQU5EIHRpbWVfc3RhcnQgPj0gJyREYXRlU3RyaW5nLTAxIDAwOjAwOjAwJyBBTkQgJFNRTF9RdWVyeV9UaW1lU3RhcnQiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBpZiAhJFJvd1syXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvbnN9eyAkUm93WzFdIH17UGVyTW9udGh9ICs9ICRSb3dbMl07CiAgICB9CgogICAgIyBhZGQgcmVhZGFibGUgY29tcG9uZW50cwogICAgbXkgJVByb2plY3QgPSAkU2VsZi0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICBteSAlQWN0aW9uICA9ICRTZWxmLT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICVEYXRhKSB7CiAgICAgICAgJERhdGF7JFByb2plY3RJRH17TmFtZX0gICA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICREYXRheyRQcm9qZWN0SUR9e1N0YXR1c30gPSAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfTsKICAgICAgICAkRGF0YXskUHJvamVjdElEfXtEZXNjcmlwdGlvbn0gPSAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9OwogICAgICAgIG15ICRBY3Rpb25zUmVmID0gJERhdGF7ICRQcm9qZWN0SUQgfXtBY3Rpb25zfTsKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyRBY3Rpb25zUmVmfSkgewogICAgICAgICAgICAkRGF0YXsgJFByb2plY3RJRCB9e0FjdGlvbnN9eyRBY3Rpb25JRH17TmFtZX0gPSAkQWN0aW9ueyAkQWN0aW9uSUQgfXtBY3Rpb259OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFByb2plY3RUb3RhbEhvdXJzKCkKCnJldHVybnMgdGhlIHRvdGFsIHN1bSBvZiBhbGwgaG91cnMgcmVsYXRlZCB0byBhIHByb2plY3QKCiAgICBteSAkUHJvamVjdFRvdGFsSG91cnMgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RUb3RhbEhvdXJzKAogICAgICAgIFByb2plY3RJRCAgPT4gMTUsCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RUb3RhbEhvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIGlmICggISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUHJvamVjdEFjdGlvblJlcG9ydGluZzogTmVlZCBQcm9qZWN0SUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGIgc2VsZWN0CiAgICBteSAkVG90YWwgPSAwOwogICAgbXkgJFNRTCAgID0gJ1NFTEVDVCBTVU0ocGVyaW9kKSBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSBwcm9qZWN0X2lkID0gPyc7CiAgICBteSAkQmluZCAgPSBbIFwkUGFyYW17UHJvamVjdElEfSBdOwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRvdGFsID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFRvdGFsOwp9Cgo9aXRlbSBQcm9qZWN0SGlzdG9yeSgpCgpyZXR1cm5zIGEgYXJyYXkgd2l0aCBhbGwgV29ya2luZ1VuaXRzIHJlbGF0ZWQgdG8gYSBwcm9qZWN0CgogICAgbXkgQFByb2plY3RIaXN0b3J5QXJyYXkgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RIaXN0b3J5KAogICAgICAgIFByb2plY3RJRCAgPT4gMTUsCiAgICApOwoKZS5nLiBAUHJvamVjdEhpc3RvcnlBcnJheSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIElEICAgICAgICA9PiA5OTksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxNSwKICAgICAgICAgICAgVXNlciAgICAgID0+ICdUb20nLAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gNiwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdtaXNjJywKICAgICAgICAgICAgUmVtYXJrICAgID0+ICdyZW1hcmsnLAogICAgICAgICAgICBUaW1lU3RhcnQgPT4gJzc6MDAnLAogICAgICAgICAgICBUaW1lRW5kICAgPT4gJzE4OjAwJywKICAgICAgICAgICAgRGF0ZSAgICAgID0+ICcyMDA4LTEwLTMxJywgIyB0aGUgZGF0ZSBvZiB0aGUgd29ya2luZyB1bml0CiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAxMSwKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDA4LTExLTAxJywgIyB0aGUgaW5zZXJ0IHRpbWUgb2YgdGhlIHdvcmtpbmcgdW5pdAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBJRCAgICAgICAgPT4gOTk5LAogICAgICAgICAgICBVc2VySUQgICAgPT4gMTYsCiAgICAgICAgICAgIFVzZXIgICAgICA9PiAnTWFuZScsCiAgICAgICAgICAgIEFjdGlvbklEICA9PiA3LAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ2RldmVsb3BtZW50JywKICAgICAgICAgICAgUmVtYXJrICAgID0+ICdyZW1hcmsnLAogICAgICAgICAgICBUaW1lU3RhcnQgPT4gJzc6MDAnLAogICAgICAgICAgICBUaW1lRW5kICAgPT4gJzE4OjAwJywKICAgICAgICAgICAgUGVyaW9kICAgID0+IDExLAogICAgICAgICAgICBEYXRlICAgICAgPT4gJzIwMDgtMTEtMDMnLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMDgtMTEtMDMnLAogICAgICAgIH0KICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdEhpc3RvcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbQogICAgaWYgKCAhJFBhcmFte1Byb2plY3RJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ1Byb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgUHJvamVjdElEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgYWN0aW9uIGRhdGEgdG8gZ2V0IHRoZSByZWFkYWJsZSBuYW1lIG9mIHRoZSBhY3Rpb24KICAgIG15ICVBY3Rpb25EYXRhID0gJFNlbGYtPkFjdGlvblNldHRpbmdzR2V0KCk7CgogICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDAgKTsKCiAgICAjIGRiIHNlbGVjdAogICAgbXkgQERhdGEgPSAoKTsKICAgIG15ICRTUUwgID0gJ1NFTEVDVCBpZCwgdXNlcl9pZCwgYWN0aW9uX2lkLCByZW1hcmssIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCBwZXJpb2QsIGNyZWF0ZWQgJwogICAgICAgIC4gJyBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSBwcm9qZWN0X2lkID0gPyc7CiAgICBteSAkQmluZCA9IFsgXCRQYXJhbXtQcm9qZWN0SUR9IF07CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJFVzZXJSZWYgPSB7CiAgICAgICAgICAgIElEICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVXNlciAgICAgID0+ICRTaG93blVzZXJzeyAkUm93WzFdIH0sCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAkUm93WzJdLAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJEFjdGlvbkRhdGF7ICRSb3dbMl0gfXtBY3Rpb259LAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJFJvd1szXSB8fCAnJywKICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFRpbWVFbmQgICA9PiAkUm93WzVdLAogICAgICAgICAgICBEYXRlICAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgUGVyaW9kICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAkUm93WzddLAogICAgICAgIH07CiAgICAgICAgJFVzZXJSZWYtPntEYXRlfSA9fiBzeyhcZFxkXGRcZC1cZFxkLVxkXGQpIFxzIC4rIH17JDF9c214OwoKICAgICAgICBwdXNoIEBEYXRhLCAkVXNlclJlZjsKICAgIH0KCiAgICByZXR1cm4gQERhdGE7Cgp9Cgo9aXRlbSBMYXN0UHJvamVjdHNPZlVzZXIoKQoKcmV0dXJucyB0aGUgYSBhcnJheSB3aXRoIHRoZSBsYXN0IHByb2plY3RzIG9mIHRoZSB1c2VyCgogICAgbXkgQExhc3RQcm9qZWN0cyA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+TGFzdFByb2plY3RzT2ZVc2VyKCk7Cgo9Y3V0CgpzdWIgTGFzdFByb2plY3RzT2ZVc2VyIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkYiBzZWxlY3QKICAgICMgSSBkb24ndCB1c2UgZGlzdGluY3QgYmVjYXVzZSBvZiBPUkRFUiBCWSBwcm9ibGVtcyBvZiBwb3N0Z3JlIHNxbAogICAgbXkgJVByb2plY3RzID0gKCk7CiAgICBteSAkU1FMCiAgICAgICAgPSAnU0VMRUNUIHByb2plY3RfaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgdXNlcl9pZCA9ID8gQU5EIHByb2plY3RfaWQgPD4gLTEgT1JERVIgQlkgdGltZV9zdGFydCBERVNDJzsKICAgIG15ICRCaW5kICA9IFsgXCRTZWxmLT57VXNlcklEfSBdOwogICAgbXkgJExpbWl0ID0gNDA7CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCwgTGltaXQgPT4gJExpbWl0ICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgUk9XIGlmICRDb3VudGVyID4gNzsKICAgICAgICBuZXh0IFJPVyBpZiAkUHJvamVjdHN7ICRSb3dbMF0gfTsKCiAgICAgICAgJFByb2plY3RzeyAkUm93WzBdIH0gPSAxOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgcmV0dXJuIGtleXMgJVByb2plY3RzOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zMSAkICREYXRlOiAyMDA5LzAzLzEwIDExOjIwOjQ2ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS40MyAyMDA5LzAyLzEwIDExOjMwOjA0IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0gPSB7CiAgICAgICAgJXsgJFNlbGYtPntUcmFuc2xhdGlvbn0gfSwKCiAgICAgICAgIyBUZW1wbGF0ZTogQWdlbnRUaW1lQWNjb3VudGluZwogICAgICAgICdTZXR0aW5nJyAgICAgICAgICA9PiAnS29uZmlndXJhdGlvbicsCiAgICAgICAgJ1Byb2plY3Qgc2V0dGluZ3MnID0+ICdQcm9qZWt0a29uZmlndXJhdGlvbmVuJywKCiAgICAgICAgJ05leHQgZGF5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdO5GNoc3RlciBUYWcnLAogICAgICAgICdPbmUgZGF5IGJhY2snICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRWluZW4gVGFnIHp1cvxjaycsCiAgICAgICAgJ0RhdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXR1bScsCiAgICAgICAgJ0NvbW1lbnRzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdLb21tZW50YXJlJywKICAgICAgICAndW50aWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2JpcycsCiAgICAgICAgJ1RvdGFsIGhvdXJzIHdvcmtlZCcgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcmJlaXRzc3R1bmRlbicsCiAgICAgICAgJ1dvcmtpbmcgSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcmJlaXRzc3R1bmRlbicsCiAgICAgICAgJ0hvdXJzIHBlciB3ZWVrJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXb2NoZW5zdHVuZGVuJywKICAgICAgICAndGhpcyBtb250aCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2RpZXNlciBNb25hdCcsCiAgICAgICAgJ092ZXJ0aW1lIChIb3VycyknICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbiAoaW4gU3R1bmRlbiknLAogICAgICAgICdPdmVydGltZSAodG90YWwpJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gKGRpZXNlciBNb25hdCknLAogICAgICAgICdPdmVydGltZSAodGhpcyBtb250aCknICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gKFN1bW1lKScsCiAgICAgICAgJ1JlbWFpbmluZyBvdmVydGltZSBsZWF2ZScgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbiAodmVyYmxlaWJlbmQpJywKICAgICAgICAnVmFjYXRpb24nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YicsCiAgICAgICAgJ1ZhY2F0aW9uIChEYXlzKScgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWIgKGluIFRhZ2VuKScsCiAgICAgICAgJ1ZhY2F0aW9uIHRha2VuICh0aGlzIG1vbnRoKScgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ1ZhY2F0aW9uIHRha2VuICh0b3RhbCknICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoU3VtbWUpJywKICAgICAgICAnUmVtYWluaW5nIHZhY2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlICh2ZXJibGVpYmVuZCknLAogICAgICAgICdTaWNrIGxlYXZlIHRha2VuICh0aGlzIG1vbnRoKScgICAgICAgICAgICA9PiAnRXJrcmFua3QgKGRpZXNlciBNb25hdCknLAogICAgICAgICdTaWNrIGxlYXZlIHRha2VuICh0b3RhbCknICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKFN1bW1lKScsCiAgICAgICAgJ1RpbWVBY2NvdW50aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnVGltZSByZXBvcnRpbmcgbW9udGhseSBvdmVydmlldycgICAgICAgICAgPT4gJ01vbmF0c/xiZXJzaWNodCBaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnRWRpdCB0aW1lIHJlY29yZCcgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgYmVhcmJlaXRlbicsCiAgICAgICAgJ0VkaXQgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzJyAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nc2VpbnN0ZWxsdW5nZW4gYmVhcmJlaXRlbicsCiAgICAgICAgJ1VzZXIgcmVwb3J0cycgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOdXR6ZXJiZXJpY2h0ZScsCiAgICAgICAgJ1VzZXJcJ3MgcHJvamVjdCBvdmVydmlldycgICAgICAgICAgICAgICAgID0+ICdOdXR6ZXJiZXJpY2h0ZScsCiAgICAgICAgJ1Byb2plY3QgcmVwb3J0JyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0YmVyaWNodCcsCiAgICAgICAgJ1Byb2plY3QgcmVwb3J0cycgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0YmVyaWNodGUnLAogICAgICAgICdUaW1lIHJlcG9ydGluZycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGJlcmljaHRlJywKICAgICAgICAnTGVhdmVEYXkgUmVtYWluaW5nJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1ZlcmJsZWliZW5kZSBVcmxhdWJzdGFnZScsCiAgICAgICAgJ01vbnRobHkgdG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdwcm8gTW9uYXQnLAogICAgICAgICdWaWV3IHRpbWUgcmVjb3JkJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdHJla29yZCBhbnNpY2h0JywKICAgICAgICAnVmlldyBvZiAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0Fuc2ljaHQgdm9uJywKICAgICAgICAnTW9udGhseScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ3BybyBNb25hdCcsCiAgICAgICAgJ0hvdXJzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdHVuZGVuJywKICAgICAgICAnRGF0ZSBuYXZpZ2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0F1c3dhaGwgRGF0dW0nLAogICAgICAgICdNb250aCBuYXZpZ2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXVzd2FobCBEYXR1bScsCiAgICAgICAgJ0RheXMgd2l0aG91dCBlbnRyaWVzJyAgICAgICAgICAgICAgICAgICAgID0+ICduaWNodCBhdXNnZWb8bGx0ZSBUYWdlJywKICAgICAgICAnUHJvamVjdCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2pla3QnLAogICAgICAgICdQcm9qZWN0cycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdGUnLAogICAgICAgICdHcmFuZCB0b3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdMaWZldGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdMaWZldGltZSB0b3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdSZXBvcnRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQmVyaWNodHN3ZXNlbicsCiAgICAgICAgJ1Rhc2sgc2V0dGluZ3MnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdU5HRpZ2tlaXRzZWluc3RlbGx1bmdlbicsCiAgICAgICAgJ1VzZXIgc2V0dGluZ3MnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOdXR6ZXJlaW5zdGVsbHVuZ2VuJywKICAgICAgICAnU2hvdyBPdmVydGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuIGFuemVpZ2VuJywKICAgICAgICAnQWxsb3cgcHJvamVjdCBjcmVhdGlvbicgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2pla3QgZXJzdGVsbGVuJywKICAgICAgICAnQWRkIHRpbWUgcGVyaW9kJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05ldWUgTnV0emVyZWluc3RlbGx1bmcnLAogICAgICAgICdSZW1hcmsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQW5tZXJrdW5nJywKICAgICAgICAnU3RhcnQnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0JlZ2lubicsCiAgICAgICAgJ0VuZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFbmRlJywKICAgICAgICAnUGVyaW9kIGJlZ2luJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdHVtIEJlZ2lubicsCiAgICAgICAgJ1BlcmlvZCBlbmQnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXR1bSBFbmRlJywKICAgICAgICAnUGVyaW9kJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdWVyJywKICAgICAgICAnRGF5cyBvZiB2YWNhdGlvbicgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlJywKICAgICAgICAnT24gdmFjYXRpb24nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2ltIFVybGF1YicsCiAgICAgICAgJ1NpY2sgZGF5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFcmtyYW5rdCcsCiAgICAgICAgJ1NpY2sgbGVhdmUgKERheXMpJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFcmtyYW5rdCAoaW4gVGFnZW4pJywKICAgICAgICAnU2ljayBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0JywKICAgICAgICAnT24gc2ljayBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0JywKICAgICAgICAnVGFzaycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1TkdGlna2VpdCcsCiAgICAgICAgJ0F1dGhvcml6ZWQgb3ZlcnRpbWUnICAgICAgICAgICAgICAgICAgICAgID0+ICdhdXRvcmlzaWVydGUg3GJlcnN0dW5kZW4nLAogICAgICAgICdPbiBvdmVydGltZSBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdPdmVydGltZSBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdUb3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdPdmVydmlldyBvZiAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnNpY2h0IC0gJywKICAgICAgICAnVGltZUFjY291bnRpbmcgb2YnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgdm9tJywKICAgICAgICAnU3VjY2Vzc2Z1bCBpbnNlcnQhJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VyZm9sZ3JlaWNoIGVpbmdlZvxndCEnLAogICAgICAgICdNb3JlIGlucHV0IGZpZWxkcycgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV2VpdGVyZSBFaW5nYWJlZmVsZGVyJywKICAgICAgICAnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIE9iamVjdCcgPT4gJ1dvbGxlbiBTaWUgZGllc2VuIEVpbnRyYWcgd2lya2xpY2ggbPZzY2hlbicsCiAgICAgICAgJ0NhblwndCBpbnNlcnQgV29ya2luZyBVbml0cyEnICAgICAgICAgICAgID0+ICdLYW5uIGRpZSBBcmJlaXRzc3R1bmRlbiBuaWNodCBlaW5m/GdlbiEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHRhc2shJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBU5HRpZ2tlaXQgZmVobHQhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwcm9qZWN0IScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gUHJvamVrdGFuZ2FiZSBmZWhsdCEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlciB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnCiAgICAgICAgICAgID0+ICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIGlzdCBncvbfZXIgYWxzIGRlciBaZWl0cmF1bSB6d2lzY2hlbiBCZWdpbm4gdW5kIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgU3RhcnR0aW1lIGlzIG9sZGVyIHRoYW4gRW5kdGltZSEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIEJlZ2lubiBsaWVndCBuYWNoIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciAoZXJnaWJ0IHNpY2ggYXVzIFN0YXJ0LSB1bmQgRW5kemVpdCkgaXN0IG5pY2h0IGFuZ2VnZWJlbiEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBQZXJpb2QgaXMgbm90IGdpdmVuIGdpdmVuIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgKGVyZ2lidCBzaWNoIGF1cyBTdGFydC0gdW5kIEVuZHplaXQpIGlzdCBuaWNodCBhbmdlZ2ViZW4hJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gc2ljayBsZWF2ZT8nID0+CiAgICAgICAgICAgICdTaWUgd2FyZW4ga3JhbmsgdW5kIGhhYmVuIGdlYXJiZWl0ZXQ/IFdpciBicmF1Y2hlbiBtZWhyIHNvbGNoZSBNaXRhcmJlaXRlci4nLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiB2YWNhdGlvbj8nID0+CiAgICAgICAgICAgICdTaWUgaGF0dGVuIFVybGF1YiB1bmQgaGFiZW4gZ2VhcmJlaXRldD8gV2lyIGJyYXVjaGVuIG1laHIgc29sY2hlIE1pdGFyYmVpdGVyLicsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIG92ZXJ0aW1lIGxlYXZlPycgPT4KICAgICAgICAgICAgJ0hhYmVuIFNpZSB35GhyZW5kIGRlciDcYmVyc3R1bmRlbiBhdWNoIGdlYXJiZWl0ZXQ/JywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJyA9PiAnRWluIFRhZyBoYXQgbnVyIDI0IFN0dW5kZW4hJywKICAgICAgICAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgICAgICA9PiAnS2FubiBBcmJlaXRzc3R1bmRlbiBuaWNodCBs9nNjaGVuIScsCiAgICAgICAgJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScgPT4gJ0JpdHRlIHRyYWdlbiBTaWUgSWhyZSBBcmJlaXRzemVpdGVuIGVpbiEnLAogICAgICAgICdZb3UgaGF2ZSB0byBpbnNlcnQgYSBzdGFydCBhbmQgYW4gZW5kIHRpbWUgb3IgYSBwZXJpb2QnID0+CiAgICAgICAgICAgICdTaWUgbfxzc2VuIEJlZ2lubi0gdW5kIEVuZGV6ZWl0IG9kZXIgZGllIERhdWVyIGFuZ2ViZW4uJywKICAgICAgICAnWW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgY2hlY2tib3ggZWxlbWVudCEnID0+ICdTaWUga/ZubmVuIG51ciBlaW5lIENoZWNrYm94IG1hcmtpZXJlbiEnLAogICAgICAgICdFZGl0IHRpbWUgYWNjb3VudGluZyBwcm9qZWN0IHNldHRpbmdzJyA9PgogICAgICAgICAgICAnWmVpdGVyZmFzc3VuZzogQmVhcmJlaXR1bmcgZGVyIFByb2pla3Rrb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdCBzZXR0aW5ncycgPT4gJ1Byb2pla3Rrb25maWd1cmF0aW9uJywKICAgICAgICAnSWYgeW91IHNlbGVjdCAiTWlzY2VsbGFuZW91cyAobWlzYykiIHRoZSB0YXNrLCBwbGVhc2UgZXhwbGFpbiB0aGlzIGluIHRoZSByZW1hcmtzIGZpZWxkJyA9PgogICAgICAgICAgICAnV2VubiBTaWUgYWxzIFTkdGlna2VpdCBTb25zdGlnZXMgYXVzd+RobGVuLCBnZWJlbiBTaWUgYml0dGUgZWluZSBCZXNjaHJlaWJ1bmcgdW0gRmVsZCBBbm1lcmt1bmcgYW4uJywKICAgICAgICAnUGxlYXNlIGFkZCBhIHJlbWFyayB3aXRoIG1vcmUgdGhhbiA4IGNoYXJhY3RlcnMhJyA9PgogICAgICAgICAgICAnQml0dGUgZ2ViZW4gU2llIGVpbmUgQW5tZXJrdW5nIGVpbiBkaWUgbORuZ2VyIGFscyA4IFplaWNoZW4gaXN0IScsCgojIEZJWE1FIGFjdHVhbGx5IHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGZpbGUgZGUucG0sIGhvd2V2ZXIgdGhleSdyZSBub3Qgc28gSSBwdXQnZW0gaGVyZS4uLgogICAgICAgICdNb24nICAgICAgPT4gJ01vJywKICAgICAgICAnVHVlJyAgICAgID0+ICdEaScsCiAgICAgICAgJ1dlZCcgICAgICA9PiAnTWknLAogICAgICAgICdUaHUnICAgICAgPT4gJ0RvJywKICAgICAgICAnRnJpJyAgICAgID0+ICdGcicsCiAgICAgICAgJ1NhdCcgICAgICA9PiAnU2EnLAogICAgICAgICdTdW4nICAgICAgPT4gJ1NvJywKICAgICAgICAnSmFudWFyeScgID0+ICdKYW51YXInLAogICAgICAgICdGZWJydWFyeScgPT4gJ0ZlYnJ1YXInLAogICAgICAgICdNYXJjaCcgICAgPT4gJ03kcnonLAogICAgICAgICdNYXknICAgICAgPT4gJ01haScsCiAgICAgICAgJ0p1bmUnICAgICA9PiAnSnVuaScsCiAgICAgICAgJ0p1bHknICAgICA9PiAnSnVsaScsCiAgICAgICAgJ09jdG9iZXInICA9PiAnT2t0b2JlcicsCiAgICAgICAgJ0RlY2VtYmVyJyA9PiAnRGV6ZW1iZXInLAogICAgfTsKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS4zNCAyMDA5LzAzLzEwIDExOjIwOjQ2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBEYXRlOjpQY2FsYyBxdyhUb2RheSBEYXlzX2luX01vbnRoIERheV9vZl9XZWVrIEFkZF9EZWx0YV9ZTUQpOwp1c2UgVGltZTo6TG9jYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjM0ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBNb2R1bGVSZWcgTG9nT2JqZWN0IFVzZXJPYmplY3QKICAgICAgICBDb25maWdPYmplY3QgVGlja2V0T2JqZWN0IFRpbWVPYmplY3QgR3JvdXBPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKSBpZiAhJFNlbGYtPnskX307CiAgICB9CgogICAgIyBjcmVhdGUgcmVxdWlyZWQgb2JqZWN0cy4uLgogICAgJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldyglUGFyYW0pOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICByZXR1cm4gMSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICk7CgogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwoKICAgIHJldHVybiBpZiAhJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9OwoKICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwoKICAgICMgcmVkaXJlY3QgaWYgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgb3V0IG9mIHJhbmdlCiAgICBpZiAoCiAgICAgICAgJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fQogICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRUaW1lQWNjb3VudGluZycKICAgICAgICAmJiAkU2VsZi0+e0FjdGlvbn0gbmUgJ0FnZW50Q2FsZW5kYXJTbWFsbCcKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICdBY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZTdWJhY3Rpb249RWRpdCcKICAgICAgICApOwogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQE1vbnRoQXJyYXkgPSAoCiAgICAgICAgJycsICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICAgICAnQXByaWwnLCAgICdNYXknLAogICAgICAgICdKdW5lJywgJ0p1bHknLCAgICAnQXVndXN0JywgICAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLAogICAgICAgICdEZWNlbWJlcicsCiAgICApOwogICAgbXkgQFdlZWtkYXlBcnJheSA9ICggJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1bicsICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMgb2Ygb25lIGRheQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlJyApICkgewogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoU3RhdHVzIFllYXIgTW9udGggRGF5KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9IHx8ICEkUGFyYW17RGF5fSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gJERheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtZZWFyfSApOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtEYXl9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdEZWxldGUnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZScKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBlZGl0IHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgKSB7CiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBteSAlRnJvbnRlbmQgICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbkxpc3QgPSAkU2VsZi0+X0FjdGlvbkxpc3QoKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KFN0YXR1cyBZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICggISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSB8fCAhJFBhcmFte0RheX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9ICREYXk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17WWVhcn0gKTsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte01vbnRofSApOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17RGF5fSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmb3IgaW5pdGlhbCB1c2VpbmcsIHRoZSBmaXJzdCBhZ2VudCB3aXRoIHJ3LXJpZ2h0IHdpbGwgYmUgcmVkaXJlY3RlZAogICAgICAgICMgdG8gJ1NldHRpbmcnLiBUaGVuIGhlIGNhbiBkbyB0aGUgaW5pdGlhbCBzZXR0aW5ncwogICAgICAgIGlmICggISRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fRmlyc3RVc2VyUmVkaXJlY3QoKTsKICAgICAgICB9CgogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgIG15ICRNYXhBbGxvd2VkSW5zZXJ0RGF5cwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4QWxsb3dlZEluc2VydERheXMnKSB8fCAnMTAnOwogICAgICAgICggJFBhcmFte1llYXJBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0sICRQYXJhbXtEYXlBbGxvd2VkfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFllYXIsICRNb250aCwgJERheSwgMCwgMCwgLSRNYXhBbGxvd2VkSW5zZXJ0RGF5cyApOwogICAgICAgIGlmICgKICAgICAgICAgICAgdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17ICRQYXJhbXtZZWFyfSB9eyAkUGFyYW17TW9udGh9IH0KICAgICAgICAgICAgICAgIHsgJFBhcmFte0RheX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249RWRpdCZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAtMSApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgMSApOwoKICAgICAgICBteSAkUmVkdWNlVGltZVJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZScpOwoKICAgICAgICAjIEVkaXQgV29ya2luZyBVbml0cwogICAgICAgIGlmICggJFBhcmFte1N0YXR1c30gKSB7CgogICAgICAgICAgICBJRDoKICAgICAgICAgICAgZm9yIG15ICRJRCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBmb3IgKHF3KFByb2plY3RJRCBBY3Rpb25JRCBSZW1hcmsgU3RhcnRUaW1lIEVuZFRpbWUgUGVyaW9kKSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJElEIC4gJ10nICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJFBhcmFte1Byb2plY3RJRH0gJiYgISRQYXJhbXtBY3Rpb25JRH07CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgYSB2YWxpZCBwZXJpb2QKICAgICAgICAgICAgICAgIG15ICRQZXJpb2QgPSAkUGFyYW17UGVyaW9kfTsKICAgICAgICAgICAgICAgIGlmICggJFBlcmlvZCA9fiBte14gKFxkKykgLCAoXGQrKSB9c214ICkgewogICAgICAgICAgICAgICAgICAgICRQZXJpb2QgPSAkMSAuICIuIiAuICQyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICVXb3JraW5nVW5pdCA9ICgKICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFBhcmFte1Byb2plY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uSUQgID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICRQYXJhbXtSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkUGVyaW9kLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7JERhdGF7V29ya2luZ1VuaXRzfX0gLCBcJVdvcmtpbmdVbml0OwoKICAgICAgICAgICAgICAgICNpZiAoJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICYmICEkUGFyYW17UGVyaW9kfSkgewogICAgICAgICAgICAgICAgI292ZXJ3cml0ZSBQZXJpb2Qgd2hlbiBTdGFydCBhbmQgRW5kdGltZSBpcyBnaXZlbi4uLgogICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJFBhcmFte1N0YXJ0VGltZX0gfHwgISRQYXJhbXtFbmRUaW1lfTsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17RW5kVGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWR1Y2VUaW1lUmVmLT57ICRBY3Rpb25MaXN0IHsgJFBhcmFte0FjdGlvbklEfSB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXR7UGVyaW9kfSA9ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJFJlZHVjZVRpbWVSZWYtPnsgJEFjdGlvbkxpc3R7ICRQYXJhbXtBY3Rpb25JRH0gfSB9IC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0e1BlcmlvZH0gPSAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDaGVja2JveENoZWNrID0gMDsKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhMZWF2ZURheSBTaWNrIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRWxlbWVudCApOwogICAgICAgICAgICAgICAgaWYgKCAkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JEVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2tib3hDaGVjaysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENoZWNrYm94Q2hlY2sgPiAxICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ID0gJ1lvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7WWVhcn0gID0gJFBhcmFte1llYXJ9OwogICAgICAgICAgICAkRGF0YXtNb250aH0gPSAkUGFyYW17TW9udGh9OwogICAgICAgICAgICAkRGF0YXtEYXl9ICAgPSAkUGFyYW17RGF5fTsKCiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNJbnNlcnQoJURhdGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgV29ya2luZyBVbml0cwogICAgICAgICMgZ2V0IGV4aXN0aW5nIHdvcmtpbmcgdW5pdHMKICAgICAgICAlRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OklucHV0SG91cnNXaXRob3V0U3RhcnRFbmRUaW1lJykgKSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdsZWZ0JzsKICAgICAgICAgICAgJFBhcmFte1BlcmlvZEJsb2NrfSAgID0gJ1VuaXRJbnB1dFBlcmlvZCc7CiAgICAgICAgICAgICRGcm9udGVuZHtDbGFzc1RpbWV9ICA9ICdmb290bm90ZSc7CiAgICAgICAgICAgICRGcm9udGVuZHtQZXJpb2ROb3RlfSA9ICcqJzsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Zvb3ROb3RlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1RleHRQb3NpdGlvbn0gID0gJ3JpZ2h0JzsKICAgICAgICAgICAgJFBhcmFte1BlcmlvZEJsb2NrfSAgID0gJ1VuaXRQZXJpb2RXaXRob3V0SW5wdXQnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAncmVxdWlyZWQnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggdGltZSgpID4gdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRCbG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNpY2ssIGxlYXZlIGRheSBhbmQgb3ZlcnRpbWUKICAgICAgICAkUGFyYW17U2lja30gICAgID0gJERhdGF7U2lja30gICAgID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgJFBhcmFte0xlYXZlRGF5fSA9ICREYXRhe0xlYXZlRGF5fSA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAkRGF0YXtPdmVydGltZX0gPyAnY2hlY2tlZCcgOiAnJzsKCiAgICAgICAgJFBhcmFte1RvdGFsfSA9ICREYXRhe1RvdGFsfTsKICAgICAgICAjIGJ1aWxkIGEgd29ya2luZyB1bml0IGFycmF5CiAgICAgICAgbXkgQFVuaXRzID0gKCB1bmRlZiApOwogICAgICAgIGlmICgkRGF0YXtXb3JraW5nVW5pdHN9KSB7CiAgICAgICAgICAgIHB1c2ggQFVuaXRzLCBAeyREYXRhe1dvcmtpbmdVbml0c319CiAgICAgICAgfQoKICAgICAgICBteSAkU2hvd0FsbElucHV0RmllbGRzID0gc2NhbGFyIEBVbml0cyA+IDkgPyAxIDogMDsKCiAgICAgICAgIyBidWlsZCB1bml0cwogICAgICAgIGZvciBteSAkSUQgKCAxLi4xNiApIHsKICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRJRDsKICAgICAgICAgICAgbXkgJFVuaXRSZWYgPSAkVW5pdHNbJElEXTsKCiAgICAgICAgICAgICMgZ2V0IG9wdGlvbiBmaWVsZHMKICAgICAgICAgICAgJEZyb250ZW5ke0FjdGlvbk9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVBY3Rpb25MaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFVuaXRSZWYtPntBY3Rpb25JRH0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiQWN0aW9uSURbJElEXSIsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMzcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkRnJvbnRlbmR7UHJvamVjdE9wdGlvbn0gPSAkU2VsZi0+X1Byb2plY3RMaXN0KAogICAgICAgICAgICAgICAgV29ya2luZ1VuaXRJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgID0+ICRVbml0UmVmLT57UHJvamVjdElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtSZW1hcmt9ID0gJFVuaXRSZWYtPntSZW1hcmt9IHx8ICcnOwogICAgICAgICAgICBpZiAoICRVbml0UmVmLT57UHJvamVjdElEfSAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntQZXJpb2R9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUGVyaW9kICAgID0gJFVuaXRSZWYtPntQZXJpb2R9IHx8ICcnOwoKICAgICAgICAgICAgZm9yIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAhJFVuaXRSZWYtPnskX30gfHwgJFVuaXRSZWYtPnskX30gZXEgJzAwOjAwJyA/ICcnIDogJFVuaXRSZWYtPnskX307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRGVmaW5lIGlmIHRoZSBpbnB1dCBmaWVsZHMgYXJlIHZpc2libGUgb3Igbm90CiAgICAgICAgICAgICRQYXJhbXtWaXNpYmlsaXR5fSA9ICRTaG93QWxsSW5wdXRGaWVsZHMgfHwgJElEIDwgOSA/ICd2aXNpYmxlJyA6ICdjb2xsYXBzZScgOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17UGVyaW9kQmxvY2t9LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGV4dFBvc2l0aW9uID0+ICRQYXJhbXtUZXh0UG9zaXRpb259LAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICAgICA9PiAkUGVyaW9kLAogICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte1NpY2t9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHNpY2sgbGVhdmU/JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1Byb2plY3RJRH0KICAgICAgICAgICAgICAgICYmICRVbml0UmVmLT57QWN0aW9uSUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17TGVhdmVEYXl9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHZhY2F0aW9uPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte092ZXJ0aW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBvdmVydGltZSBsZWF2ZT8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntQcm9qZWN0SUR9ICYmICEkVW5pdFJlZi0+e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHRhc2shJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkVW5pdFJlZi0+e1Byb2plY3RJRH0gJiYgJFVuaXRSZWYtPntBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwcm9qZWN0ISc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntTdGFydFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e1N0YXJ0VGltZX0gbmUgJzAwOjAwJwogICAgICAgICAgICAgICAgJiYgJFVuaXRSZWYtPntFbmRUaW1lfQogICAgICAgICAgICAgICAgJiYgJFVuaXRSZWYtPntFbmRUaW1lfSBuZSAnMDA6MDAnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVW5pdFJlZi0+e0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQZXJpb2R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MCArIDAuMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiA2MCAqIDI0IHx8ICRTdGFydFRpbWUgPiA2MCAqIDI0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICMgUkVNQVJLOiBkb24ndCBkZWxldGUgYWxsIHdvcmtpbmcgdW5pdHMKICAgICAgICAgICAgICAgICNpZiAoCiAgICAgICAgICAgICAgICAjICAgICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgIyAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgIyAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgICMgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgIyAgICApCiAgICAgICAgICAgICAgICAjICAgICkKICAgICAgICAgICAgICAgICN7CiAgICAgICAgICAgICAgICAjICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgIyAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScKICAgICAgICAgICAgICAgICMgICAgKTsKICAgICAgICAgICAgICAgICN9CiAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICAgICA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9uVHJ1ZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlYWRvbmx5JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3MgZW5kCgogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgPiB0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbH0gKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICBpZiAoICRQYXJhbXtUb3RhbH0gJiYgJFBhcmFte1RvdGFsfSA+IDI0ICkgewogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1vcmUgdGhhbiAyNCB3b3JraW5nIGhvdXJzISc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMTYgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCBtb3JlIHRoYW4gMTYgaG91cnM/JzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlYWRvbmx5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdmFsaWRpdHkgY2hlY2tzIGVuZAoKICAgICAgICAkUGFyYW17RGF0ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgPCB0aW1lbG9jYWwoCiAgICAgICAgICAgICAgICAxLCAwLCAwLCAkUGFyYW17RGF5QWxsb3dlZH0sCiAgICAgICAgICAgICAgICAkUGFyYW17TW9udGhBbGxvd2VkfSAtIDEsCiAgICAgICAgICAgICAgICAkUGFyYW17WWVhckFsbG93ZWR9IC0gMTkwMAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17ICRQYXJhbXtZZWFyfSB9eyAkUGFyYW17TW9udGh9IH17ICRQYXJhbXtEYXl9IH0KICAgICAgICAgICAgICAgICYmICEkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBEYXRlIGlzIG91dCBvZiBsaW1pdCwgYnV0IHlvdSBoYXZlblwndCBpbnNlcnQgdGhpcyBkYXkgeWV0LCBzbyB5b3UgZ2V0IG9uZSghKSBjaGFuY2UgdG8gaW5zZXJ0JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciBteSAkWWVhcklEICggc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRNb250aElEICggc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFllYXJJRH0gfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkRGF5SUQgKAogICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9eyRNb250aElEfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtJbmNvbXBsZXRlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnSW5jb21wbGV0ZVRleHQnLCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkQm9sZFN0YXJ0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJEJvbGRFbmQgICA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJJRCAgICAgZXEgJFBhcmFte1llYXJ9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRNb250aElEIGVxICRQYXJhbXtNb250aH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJERheUlEICAgZXEgJFBhcmFte0RheX0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJvbGRTdGFydCA9ICc8Yj4nOwogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZEVuZCAgID0gJzwvYj4nOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5jb21wbGV0ZVdvcmtpbmdEYXlzJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyICAgICAgPT4gJFllYXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoICAgICA9PiAkTW9udGhJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERheSAgICAgICA9PiAkRGF5SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkU3RhcnQgPT4gJEJvbGRTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRFbmQgICA9PiAkQm9sZEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtJbmNvbXBsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgQ2FsZW5kYXIgPT4gJFVzZXJEYXRhe0NhbGVuZGFyfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwogICAgICAgIGlmICggJFBhcmFte1dlZWtkYXl9ICE9IDYgJiYgJFBhcmFte1dlZWtkYXl9ICE9IDcgJiYgISRWYWNhdGlvbkNoZWNrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3RoZXJUaW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IC0gMSBdOwoKICAgICAgICAjIGludGVncmF0ZSB0aGUgaGFuZGxpbmcgZm9yIHJlcXVpcmVkIHJlbWFya3MgaW4gcmVsYXRpb24gdG8KICAgICAgICAjIHByb2plY3RzCiAgICAgICAgJFBhcmFte1JlbWFya1JlZ0V4cH0gPSAkU2VsZi0+X1Byb2plY3QyUmVtYXJrUmVnRXhwKCk7CgogICAgICAgICRQYXJhbXtMaW5rVmlzaWJpbGl0eX0gPSAkU2hvd0FsbElucHV0RmllbGRzID8gJ2NvbGxhcHNlJyA6ICd2aXNpYmxlJyA7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICAgICBpZiAoICEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgY3JlYXRlIHByb2plY3QgbGluaywgaWYgYWxsb3dlZAogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe0NyZWF0ZVByb2plY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQ3JlYXRlUHJvamVjdCcsICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICYmICEkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfQogICAgICAgICAgICAmJiAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAnU3VjY2Vzc2Z1bCBpbnNlcnQhJywgKTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdmlldyBvbGRlciBkYXkgaW5zdGVydHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlldycgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhciBVc2VySUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyKSkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gIlZpZXc6IE5lZWQgJF8iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gVXNlcklEIHBvc3RlZCB1c2UgdGhlIGN1cnJlbnQgdXNlcgogICAgICAgICRQYXJhbXtVc2VySUR9IHx8PSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICMgc2hvdyB0aGUgbmFtaW5nIG9mIHRoZSBhZ2VudCB3aGljaCB0aW1lIGFjY291bnRpbmcgaXMgdmlzaXRlZAogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSApOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gPSAkU2hvd25Vc2Vyc3sgJFBhcmFte1VzZXJJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSAgICAgICAgID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbICRQYXJhbXtXZWVrZGF5fSAtIDEgXTsKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gICA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICMgVmFsdWVzIGZvciB0aGUgbGluayBpY29ucyA8PgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgLTEgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEgKTsKCiAgICAgICAgJFBhcmFte0RhdGVTZWxlY3Rpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICcnLAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGV9ID0gJERhdGF7RGF0ZX07CgogICAgICAgICMgZ2V0IHByb2plY3QgYW5kIGFjdGlvbiBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CgogICAgICAgICMgZ2V0IHNpY2ssIGxlYXZlIGRheSBhbmQgb3ZlcnRpbWUKICAgICAgICAkUGFyYW17U2lja30gICAgID0gJERhdGF7U2lja30gICAgID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgJFBhcmFte0xlYXZlRGF5fSA9ICREYXRhe0xlYXZlRGF5fSA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAkRGF0YXtPdmVydGltZX0gPyAnY2hlY2tlZCcgOiAnJzsKCiAgICAgICAgIyBvbmx5IHNob3cgdGhlIHVuaXQgYmxvY2sgaWYgdGhlcmUgaXMgc29tZSBkYXRhCiAgICAgICAgbXkgJFVuaXRzUmVmID0gJERhdGF7V29ya2luZ1VuaXRzfTsKICAgICAgICBpZiAoJFVuaXRzUmVmLT5bMF0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVW5pdEJsb2NrJywgKTsKCiAgICAgICAgICAgIGZvciBteSAkVW5pdFJlZiAoIEB7JFVuaXRzUmVmfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFByb2plY3R7UHJvamVjdH17ICRVbml0UmVmLT57UHJvamVjdElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJEFjdGlvbnsgJFVuaXRSZWYtPntBY3Rpb25JRH0gfXtBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZW1hcmsgICAgPT4gJFVuaXRSZWYtPntSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJFVuaXRSZWYtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJFVuaXRSZWYtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kICAgID0+ICRVbml0UmVmLT57UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJERhdGF7VG90YWx9ICkgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17U2lja30gfHwgJFBhcmFte0xlYXZlRGF5fSB8fCAkUGFyYW17T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3RoZXJUaW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTaWNrICAgICA9PiAkUGFyYW17U2lja30sCiAgICAgICAgICAgICAgICAgICAgTGVhdmVEYXkgPT4gJFBhcmFte0xlYXZlRGF5fSwKICAgICAgICAgICAgICAgICAgICBPdmVydGltZSA9PiAkUGFyYW17T3ZlcnRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFZhY2F0aW9uID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgQ2FsZW5kYXIgPT4gJFVzZXJEYXRhe0NhbGVuZGFyfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFZhY2F0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWYWNhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVmFjYXRpb24gPT4gJFZhY2F0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZXNlbnRhdGlvbgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1ZpZXcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nVmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgb2JqZWN0IGZyb20gZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldyBhYm91dCB0aGUgdXNlcnMgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ092ZXJ2aWV3JyApIHsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBmb3IgKHF3KFN0YXR1cyBEYXkgTW9udGggWWVhciBVc2VySUQgUHJvamVjdFN0YXR1c1Nob3cpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTdWJhY3Rpb259ID0gJ0VkaXQnOwoKICAgICAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSAmJiAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17U3ViYWN0aW9ufSA9ICdWaWV3JzsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSApOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gPSAkU2hvd25Vc2Vyc3sgJFBhcmFte1VzZXJJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICggISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte01vbnRofSApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgLTEsIDAgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgMSwgMCApOwoKICAgICAgICAjIE92ZXJ2aWV3IHBlciBkYXkKICAgICAgICBteSAkRGF5c09mTW9udGggPSBEYXlzX2luX01vbnRoKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0gKTsKCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJERheSAoIDEgLi4gJERheXNPZk1vbnRoICkgewogICAgICAgICAgICAkUGFyYW17RGF5fSA9IHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkRGF5ICkgLSAxOwogICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRVc2VyRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtZZWFyfSBlcSAkWWVhciAmJiAkUGFyYW17TW9udGh9IGVxICRNb250aCAmJiAkQ3VycmVudERheSBlcSAkRGF5ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSJvcmFuZ2UiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gICA9ICdiZ2NvbG9yPSIjRUJDQ0NDIic7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkVmFjYXRpb25DaGVjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXZWVrZGF5fSA9PSA2IHx8ICRQYXJhbXtXZWVrZGF5fSA9PSA1ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRkZFMEUwIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ID0gJ2JnY29sb3I9IiNFNUYwRkYiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJERhdGF7U2lja30gICAgID8gJ1NpY2sgbGVhdmUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICREYXRhe0xlYXZlRGF5fSA/ICdPbiB2YWNhdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJERhdGF7T3ZlcnRpbWV9ID8gJ09uIG92ZXJ0aW1lIGxlYXZlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9ICREYXRhe1RvdGFsfSA/IHNwcmludGYoICIlLjJmIiwgJERhdGF7VG90YWx9ICkgOiAnJzsKCiAgICAgICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IF07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclJlcG9ydCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUYXJnZXRTdGF0ZSBUYXJnZXRTdGF0ZVRvdGFsIFdvcmtpbmdIb3Vyc1RvdGFsIFdvcmtpbmdIb3VycwogICAgICAgICAgICBPdmVydGltZSBPdmVydGltZVRvdGFsIE92ZXJ0aW1lVW50aWwgTGVhdmVEYXkgTGVhdmVEYXlUb3RhbAogICAgICAgICAgICBMZWF2ZURheVJlbWFpbmluZyBTaWNrIFNpY2tUb3RhbCBTaWNrUmVtYWluaW5nKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVXNlclJlcG9ydHsgJFBhcmFte1VzZXJJRH0gfXskX30gfHw9IDA7CiAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmKCAiJS4yZiIsICRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVXNlckRhdGF7U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ0aW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICdhbGwnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgUFJPSkVDVElEOgogICAgICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICAgICAgc29ydCB7ICRQcm9qZWN0RGF0YXskYX17TmFtZX0gY21wICRQcm9qZWN0RGF0YXskYn17TmFtZX0gfQogICAgICAgICAgICBrZXlzICVQcm9qZWN0RGF0YQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJvamVjdFJlZiA9ICRQcm9qZWN0RGF0YXsgJFByb2plY3RJRCB9OwogICAgICAgICAgICBteSAkQWN0aW9uc1JlZiA9ICRQcm9qZWN0UmVmLT57QWN0aW9uc307CgogICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAnJzsKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ICA9ICRQcm9qZWN0UmVmLT57U3RhdHVzfSA/ICcnIDogJ3Bhc3Npdic7CgogICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgIG5leHQgUFJPSkVDVElEIGlmICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgJFBhcmFte1N0YXR1c307CgogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgKICAgICAgICAgICAgICAgIHNvcnQgeyAkQWN0aW9uc1JlZi0+eyRhfXtOYW1lfSBjbXAgJEFjdGlvbnNSZWYtPnskYn17TmFtZX0gfQogICAgICAgICAgICAgICAga2V5cyAleyRBY3Rpb25zUmVmfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQWN0aW9uUmVmID0gJEFjdGlvbnNSZWYtPnskQWN0aW9uSUR9OwoKICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ID0gJEFjdGlvblJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgPSBzcHJpbnRmKCAiJS4yZiIsICRBY3Rpb25SZWYtPntQZXJNb250aH0gfHwgMCApOwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkQWN0aW9uUmVmLT57VG90YWx9IHx8IDAgKTsKICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdFJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgIG15ICRQcm9qZWN0RGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0UmVmLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dTcGFuICAgICAgICAgICAgPT4gKDEgKyBzY2FsYXIga2V5cyAleyRBY3Rpb25zUmVmfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXR1c30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0RGVzY3JpcHRpb24gPT4gJFByb2plY3REZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtDcmVhdGVQcm9qZWN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGVyc29ucyBob3cgYXJlIGFsbG93ZWQgdG8gc2VlIHRoZSBjcmVhdGUgb2JqZWN0IGxpbmsgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsb3dlZCB0byBzZWUgdGhlIHByb2plY3QgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFByb2plY3RSZWYtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdE5vTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgUHJvamVjdCA9PiAkUHJvamVjdFJlZi0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWwgKTsKICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gPSAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17VG90YWxIb3Vyc30gKSApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc30gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnT3ZlcnZpZXcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ092ZXJ2aWV3JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldHRpbmdzIGZvciBoYW5kbGluZyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZycgKSB7CiAgICAgICAgbXkgJURhdGEgICAgID0gKCk7CgogICAgICAgIGZvciAocXcoQWN0aW9uQWN0aW9uIEFjdGlvblVzZXIgTmV3QWN0aW9uIE5ld1VzZXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSd307CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1NldHRpbmcnLCApOwoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVNldHRpbmciLAogICAgICAgICk7CgogICAgICAgIGlmICggJFBhcmFte0FjdGlvbkFjdGlvbn0gfHwgJFBhcmFte05ld0FjdGlvbn0gKSB7CiAgICAgICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwogICAgICAgICAgICBteSAlQWN0aW9uQ2hlY2sgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoQWN0aW9uIEFjdGlvblN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskQWN0aW9uSUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkQWN0aW9uSUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISREYXRheyRBY3Rpb25JRH17QWN0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uRW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0KICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9CiAgICAgICAgICAgICAgICAgICAgJiYgJEFjdGlvbkNoZWNreyAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gfSA9PSAxCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdUaGUgYWN0aW9ubmFtaW5nIG11c3QgYmUgdW5pcXVlIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIGFjdGlvbiBkYXRhIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3QWN0aW9ufSAmJiAhJEFjdGlvbkVtcHR5ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzSW5zZXJ0KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgYWN0aW9uIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwoKICAgICAgICAgICAgbXkgJUxhc3RQZXJpb2QgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyICkgewogICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBrZXlzICV7ICRVc2VyeyRVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGFzdFBlcmlvZHskVXNlcklEfSA8ICRQZXJpb2QgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gJFBlcmlvZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIk5ld1VzZXJTZXR0aW5nWyR7VXNlcklEfV0iICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUluc2VydERhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtQZXJpb2R9ID0gJExhc3RQZXJpb2R7JFVzZXJJRH0gKyAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb25Vc2VyfSAgPSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglSW5zZXJ0RGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uVXNlcn0gfHwgJFBhcmFte05ld1VzZXJ9ICkgewoKICAgICAgICAgICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJMaXN0KCk7CgogICAgICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyICkgewoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KCBTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCBDYWxlbmRhciApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFVzZXJJRCAuICddJyApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJEJyZWFrID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzY3JpcHRpb25bJyAuICRVc2VySUQgLiAnXScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQnJlYWsgPSAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRGVzY3JpcHRpb25bJHtVc2VySUR9XSIgKTsKCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259IC4gJEJyZWFrIC4gJERlc2NyaXB0aW9uOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtVc2VySUR9ID0gJFVzZXJJRDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBrZXlzICV7ICRVc2VyeyRVc2VySUR9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmb2xsb3dpbmcgaXMgYmVjYXVzZSBvZiBkZWFjdGl2YXRlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdEYXRlU3RhcnRbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhXZWVrbHlIb3VycyBMZWF2ZURheXMgVXNlclN0YXR1cyBEYXRlU3RhcnQgRGF0ZUVuZCBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9eyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAkXyAuICdbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3VXNlcn0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApICkgewoKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1VzZXJJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7UGVyaW9kfSA9ICcxJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGZvciAoIGtleXMgJUdyb3VwcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR3JvdXBzeyRffSBlcSAndGltZV9hY2NvdW50aW5nJyAmJiAhJEdyb3VwRGF0YXskX30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3ICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKAogICAgICAgICAgICAxID0+ICd2YWxpZCcsCiAgICAgICAgICAgIDAgPT4gJ2ludmFsaWQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBhY3Rpb24gZGF0YQogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CgogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJEFjdGlvbnskYX17QWN0aW9ufSBjbXAgJEFjdGlvbnskYn17QWN0aW9ufSB9IGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAkUGFyYW17QWN0aW9uSUR9ID0gJEFjdGlvbklEOwoKICAgICAgICAgICAgbXkgJFN0YXR1c09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJBY3Rpb25TdGF0dXNbJFBhcmFte0FjdGlvbklEfV0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXR1c09wdGlvbiA9PiAkU3RhdHVzT3B0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlciAgICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyTGlzdCgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CgogICAgICAgICMgZmlsbCB1cCB0aGUgY2FsZW5kYXIgbGlzdAogICAgICAgIG15ICRDYWxlbmRhckxpc3RSZWYgPSB7IDAgPT4gJ0RlZmF1bHQnIH07CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoIDEgLi4gOSApIHsKICAgICAgICAgICAgbXkgJENhbGVuZGFyTmFtZSA9ICJUaW1lWm9uZTo6Q2FsZW5kYXIke0NhbGVuZGFyfU5hbWUiOwogICAgICAgICAgICAkQ2FsZW5kYXJMaXN0UmVmLT57JENhbGVuZGFyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCRDYWxlbmRhck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgVVNFUklEOgogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyeyRVc2VySUR9OwoKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICBteSAkVXNlclJlZiAgICAgICA9ICRVc2VyeyRVc2VySUR9OwogICAgICAgICAgICBteSAkVXNlckJhc2ljc1JlZiA9ICRVc2VyQmFzaWNzeyRVc2VySUR9OwoKICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFVzZXJCYXNpY3NSZWYtPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkRGVzY3JpcHRpb24gPSAkRGVzY3JpcHRpb24gPyAkRGVzY3JpcHRpb24gLiAnPGJyPicgOiAnJzsKCiAgICAgICAgICAgIG15ICRDYWxlbmRhck9wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ2FsZW5kYXJMaXN0UmVmLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIkNhbGVuZGFyWyRVc2VySURdIiwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkVXNlckJhc2ljc1JlZi0+e0NhbGVuZGFyfSB8fCAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICBTaG93T3ZlcnRpbWUgICA9PiAkVXNlckJhc2ljc1JlZi0+e1Nob3dPdmVydGltZX0gPyAnY2hlY2tlZCcgOiAnJywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVQcm9qZWN0ICA9PiAkVXNlckJhc2ljc1JlZi0+e0NyZWF0ZVByb2plY3R9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJPcHRpb24gPT4gJENhbGVuZGFyT3B0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGRlbGV0ZSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKCiAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICggc29ydCBrZXlzICV7JFVzZXJSZWZ9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTdGF0dXNPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtVc2VyU3RhdHVzfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJVc2VyU3RhdHVzWyRVc2VySURdWyRQZXJpb2RdIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQZXJpb2QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICRVc2VyUmVmLT57JFBlcmlvZH17V2Vla2x5SG91cnN9LAogICAgICAgICAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtMZWF2ZURheXN9LAogICAgICAgICAgICAgICAgICAgICAgICBPdmVydGltZSAgICAgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtPdmVydGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e0RhdGVTdGFydH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e0RhdGVFbmR9LAogICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJFBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzT3B0aW9uID0+ICRTdGF0dXNPcHRpb24sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglU2hvd25Vc2VycykgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3snJ30gPSAnJzsKICAgICAgICAgICAgbXkgJE5ld1VzZXJPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXdVc2VyT3B0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBOZXdVc2VyT3B0aW9uID0+ICROZXdVc2VyT3B0aW9uLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZXR0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdTZXR0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldHRpbmdzIGZvciBoYW5kbGluZyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFNldHRpbmcnICkgewogICAgICAgIG15ICVQcm9qZWN0ICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICA9ICgpOwoKICAgICAgICBmb3IgKHF3KEFjdGlvblByb2plY3QgTmV3UHJvamVjdCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnUHJvamVjdFNldHRpbmcnLCApOwoKICAgICAgICAjIEVkaXQgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25Qcm9qZWN0fSB8fCAkUGFyYW17TmV3UHJvamVjdH0gKSB7CiAgICAgICAgICAgICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkUHJvamVjdEVtcHR5ID0gMDsKICAgICAgICAgICAgbXkgJVByb2plY3RDaGVjayA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfSApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoUHJvamVjdCBQcm9qZWN0U3RhdHVzIFByb2plY3REZXNjcmlwdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskUHJvamVjdElEfXskX30KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFByb2plY3RJRCAuICddJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RFbXB0eSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0KICAgICAgICAgICAgICAgICAgICAmJiAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9CiAgICAgICAgICAgICAgICAgICAgJiYgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfSA9PSAxCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdUaGUgcHJvamVjdG5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgcHJvamVjdCBkYXRhIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3UHJvamVjdH0gJiYgISRQcm9qZWN0RW1wdHkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgcHJvamVjdCBkYXRhIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICBteSAlU3RhdHVzTGlzdCA9ICgKICAgICAgICAgICAgMSA9PiAndmFsaWQnLAogICAgICAgICAgICAwID0+ICdpbnZhbGlkJywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgcHJvamVjdCBkYXRhCiAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwoKICAgICAgICAgICAgbXkgJFN0YXR1c09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJQcm9qZWN0U3RhdHVzWyRQYXJhbXtQcm9qZWN0SUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXR1c09wdGlvbiA9PiAkU3RhdHVzT3B0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnU2V0dGluZycgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1JlcG9ydGluZycgKSB7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDAgKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUnd9OwoKICAgICAgICBmb3IgKHF3KFN0YXR1cyBNb250aCBZZWFyIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICBteSAlTW9udGggPSAoKTsKICAgICAgICBmb3IgbXkgJElEICggMSAuLiAxMiApIHsKICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17VmFsdWV9ICAgID0gJE1vbnRoQXJyYXlbJElEXTsKICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17UG9zaXRpb259ID0gJElEOwogICAgICAgICAgICBpZiAoICRQYXJhbXtNb250aH0gPT0gJElEICkgewogICAgICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEZyb250ZW5ke01vbnRoT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uRWxlbWVudCgKICAgICAgICAgICAgRGF0YSA9PiBcJU1vbnRoLAogICAgICAgICAgICBOYW1lID0+ICdNb250aCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFllYXIgPSAoMjAwNSAuLiAkWWVhcik7CgogICAgICAgICRGcm9udGVuZHtZZWFyT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFxAWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1llYXJ9IHx8ICcnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnWWVhcicsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDAgKTsKCiAgICAgICAgbXkgJVVzZXJSZXBvcnQgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyTGlzdCgpOwoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJSZXBvcnR7JFVzZXJJRH07CgogICAgICAgICAgICBmb3IgKHF3KExlYXZlRGF5IE92ZXJ0aW1lIFdvcmtpbmdIb3VycyBTaWNrIExlYXZlRGF5UmVtYWluaW5nIE92ZXJ0aW1lVG90YWwpKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkVXNlclJlcG9ydHskVXNlcklEfXskX30gKTsKICAgICAgICAgICAgICAgICRQYXJhbXsgJ1RvdGFsJyAuICRfIH0gKz0gJFBhcmFteyRffTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTaG93IE92ZXJ0aW1lIGlmIGFsbG93ZWQKICAgICAgICAgICAgaWYgKCAhJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gICAgICA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lVG90YWx9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgID0gJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUb3RhbExlYXZlRGF5IFRvdGFsT3ZlcnRpbWUgVG90YWxXb3JraW5nSG91cnMKICAgICAgICAgICAgVG90YWxTaWNrIFRvdGFsTGVhdmVEYXlSZW1haW5pbmcgVG90YWxPdmVydGltZVRvdGFsKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17JF99ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHJlcG9ydCBzb3J0IGJ5IHByb2plY3RzCiAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAnYWxsJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ3ZhbGlkJzsKICAgICAgICB9CgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBSRU1BUks6bWVyZ2UgdGhpcyBwcm9qZWN0cmVwb3J0aW5nIGxpc3Qgd2l0aCB0aGUgbGlzdCBpbiBvdmVydmlldwoKICAgICAgICBQUk9KRUNUSUQ6CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3REYXRheyRhfXtOYW1lfSBjbXAgJFByb2plY3REYXRheyRifXtOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJVByb2plY3REYXRhCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRQcm9qZWN0UmVmID0gJFByb2plY3REYXRheyAkUHJvamVjdElEIH07CiAgICAgICAgICAgIG15ICRBY3Rpb25zUmVmID0gJFByb2plY3RSZWYtPntBY3Rpb25zfTsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICcnOwogICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gID0gJFByb2plY3RSZWYtPntTdGF0dXN9ID8gJycgOiAncGFzc2l2JzsKCiAgICAgICAgICAgIG15ICRUb3RhbCAgICAgID0gMDsKICAgICAgICAgICAgbXkgJFRvdGFsVG90YWwgPSAwOwoKICAgICAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyAmJiAkUGFyYW17U3RhdHVzfTsKCiAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKAogICAgICAgICAgICAgICAgc29ydCB7ICRBY3Rpb25zUmVmLT57JGF9e05hbWV9IGNtcCAkQWN0aW9uc1JlZi0+eyRifXtOYW1lfSB9CiAgICAgICAgICAgICAgICBrZXlzICV7JEFjdGlvbnNSZWZ9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRBY3Rpb25SZWYgPSAkQWN0aW9uc1JlZi0+eyRBY3Rpb25JRH07CgogICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkQWN0aW9uUmVmLT57TmFtZX07CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnN9ICA9IHNwcmludGYoICIlLjJmIiwgJEFjdGlvblJlZi0+e1Blck1vbnRofSB8fCAwICk7CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRBY3Rpb25SZWYtPntUb3RhbH0gfHwgMCApOwogICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdFJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgIG15ICRQcm9qZWN0RGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0UmVmLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dTcGFuICAgICAgICAgICAgPT4gKDEgKyBzY2FsYXIga2V5cyAleyRBY3Rpb25zUmVmfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXR1c30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0RGVzY3JpcHRpb24gPT4gJFByb2plY3REZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICAgICAgICAgICA9PiAkUHJvamVjdFJlZi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdElEICAgICAgICAgID0+ICRQcm9qZWN0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgID0gJ2NvbnRlbnRrZXknOwogICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAnVG90YWwnOwogICAgICAgICAgICAkUGFyYW17SG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbFRvdGFsICk7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgICs9ICRUb3RhbDsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKz0gJFRvdGFsVG90YWw7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICB8fD0gMDsKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSB8fD0gMDsKCiAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdSZXBvcnRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRpbWUgYWNjb3VudGluZyBwcm9qZWN0IHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcm9qZWN0UmVwb3J0aW5nJyApIHsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkUGFyYW17UHJvamVjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2plY3RJRCcgKTsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3RJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnUHJvamVjdFJlcG9ydGluZzogTmVlZCBQcm9qZWN0SUQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICRQcm9qZWN0e1Byb2plY3R9eyAkUGFyYW17UHJvamVjdElEfSB9OwoKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMCApOwoKICAgICAgICAjIG5lY2Fzc2FyeSBiZWNhdXNlIHRoZSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIGlzIG5vdCByZXdvcmtlZAogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0VGltZSA9ICgpOwoKICAgICAgICAjIE9ubHkgb25lIGZ1bmN0aW9uIHNob3VsZCBiZSBlbm91Z2gKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVNob3duVXNlcnMgKSB7CgogICAgICAgICAgICAjIE92ZXJ2aWV3IHBlciBwcm9qZWN0IGFuZCBhY3Rpb24KICAgICAgICAgICAgIyBSRU1BUks6IFRoaXMgaXMgdGhlIHdyb25nIGZ1bmN0aW9uIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXsgJFBhcmFte1Byb2plY3RJRH0gfSkgewogICAgICAgICAgICAgICAgbXkgJEFjdGlvbnNSZWYgPSAkUHJvamVjdERhdGF7ICRQYXJhbXtQcm9qZWN0SUR9IH17QWN0aW9uc307CiAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyAkQWN0aW9uc1JlZiB9ICkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSA9ICRBY3Rpb25zUmVmLT57JEFjdGlvbklEfXtUb3RhbH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgaGVhZGVybGluZQogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJOYW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBVc2VyID0+ICRTaG93blVzZXJzeyRVc2VySUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJldHRlciBzb2x1dGlvbiBmb3Igc29ydCBhY3Rpb25zIG5lY2Vzc2FyeQogICAgICAgIG15ICVOZXdBY3Rpb24gPSAoKTsKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAlUHJvamVjdFRpbWUgKSB7CiAgICAgICAgICAgICROZXdBY3Rpb257JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgIH0KICAgICAgICAlQWN0aW9uID0gJU5ld0FjdGlvbjsKCiAgICAgICAgIyBzaG93IHRoZSByZXN1bHRzCiAgICAgICAgbXkgJVRvdGFsID0gKCk7CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIHNvcnQgeyAkQWN0aW9ueyRhfSBjbXAgJEFjdGlvbnskYn0gfSBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgIG15ICRUb3RhbEhvdXJzID0gMDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgQWN0aW9uID0+ICRBY3Rpb257JEFjdGlvbklEfSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICAgICAgJFRvdGFsSG91cnMgICAgICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwOwogICAgICAgICAgICAgICAgJFRvdGFseyRVc2VySUR9ICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSG91cnMgPT4gc3ByaW50ZiggIiUuMmYiLCAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMCApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRvdGFsCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBIb3VycyA9PiBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbEhvdXJzICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSAwOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsQWxsfSArPSAkVG90YWx7JFVzZXJJRH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJFRvdGFseyRVc2VySUR9ICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxBbGx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxBbGx9ICk7CgogICAgICAgIG15IEBQcm9qZWN0SGlzdG9yeUFycmF5ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RIaXN0b3J5KAogICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFBhcmFte1Byb2plY3RJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFJvdyAoQFByb2plY3RIaXN0b3J5QXJyYXkpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyICAgPT4gJFJvdy0+e1VzZXJ9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkUm93LT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBSZW1hcmsgPT4gJFJvdy0+e1JlbWFya30gfHwgJy0tJywKICAgICAgICAgICAgICAgICAgICBQZXJpb2QgPT4gJFJvdy0+e1BlcmlvZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0ZSAgID0+ICRSb3ctPntEYXRlfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHRvdGFsIHN1bSBvZiBob3VycyBhdCB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5IGxpc3QKICAgICAgICAjIEkgYWxzbyBjYW4gdXNlICRQYXJhbXtUb3RhbEFsbH0KICAgICAgICBteSAkUHJvamVjdFRvdGFsSG91cnMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFRvdGFsSG91cnMoCiAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUGFyYW17UHJvamVjdElEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIaXN0b3J5VG90YWwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhpc3RvcnlUb3RhbCA9PiAkUHJvamVjdFRvdGFsSG91cnMgfHwgMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1Byb2plY3RSZXBvcnRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIFN1YmFjdGlvbiBwcm9jZXNzIScgKTsKfQoKc3ViIF9GaXJzdFVzZXJSZWRpcmVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZm9yIGluaXRpYWwgdXNlaW5nLCB0aGUgZmlyc3QgYWdlbnQgd2l0aCBydy1yaWdodCB3aWxsIGJlIHJlZGlyZWN0ZWQKICAgICMgdG8gJ1NldHRpbmcnLiBUaGVuIGhlIGNhbiBkbyB0aGUgaW5pdGlhbCBzZXR0aW5ncwoKICAgIG15ICVHcm91cExpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CiAgICBmb3IgKCBrZXlzICVHcm91cExpc3QgKSB7CiAgICAgICAgaWYgKCAkR3JvdXBMaXN0eyRffSBlcSAndGltZV9hY2NvdW50aW5nJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmIiAuICJTdWJhY3Rpb249U2V0dGluZyIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICJObyBVc2VyUGVyaW9kIGF2YWlsYWJsZSwgcGxlYXNlIGNvbnRhY3QgdGhlIHRpbWUgYWNjb3VudGluZyBhZG1pbiB0byBpbnNlcnQgeW91ciBVc2VyUGVyaW9kISIKICAgICk7Cn0KCnN1YiBfQWN0aW9uTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVBY3Rpb25MaXN0OwogICAgbXkgJUFjdGlvbiAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKCiAgICAjIGdldCBhY3Rpb24gc2V0dGluZ3MKICAgIEFDVElPTklEOgogICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJUFjdGlvbiApIHsKICAgICAgICBuZXh0IEFDVElPTklEIGlmICEkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9uU3RhdHVzfTsKICAgICAgICBuZXh0IEFDVElPTklEIGlmICEkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAkQWN0aW9uTGlzdHskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICB9CiAgICAkQWN0aW9uTGlzdHsnJ30gPSAnJzsKCiAgICByZXR1cm4gJUFjdGlvbkxpc3Q7Cn0KCnN1YiBfUHJvamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbQogICAgaWYgKCAhJFBhcmFte1dvcmtpbmdVbml0SUR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ19Qcm9qZWN0TGlzdDogTmVlZCBXb3JraW5nVW5pdElEJywKICAgICAgICApOwogICAgfQoKICAgICMgYXQgZmlyc3QgYSBlbXB0eSBsaW5lCiAgICBteSBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICcnLAogICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBwcm9qZWN0IHNldHRpbmdzCiAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoCiAgICAgICAgU3RhdHVzID0+ICd2YWxpZCcsCiAgICApOwoKICAgIGlmICggISRTZWxmLT57TGFzdFByb2plY3RzUmVmfSApIHsKICAgICAgICAjIGdldCB0aGUgbGFzdCBwcm9qZWN0cwogICAgICAgIG15IEBMYXN0UHJvamVjdHMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+TGFzdFByb2plY3RzT2ZVc2VyKCk7CgogICAgICAgICMgYWRkIHRoZSBmYXZvcml0cwogICAgICAgICV7ICRTZWxmLT57TGFzdFByb2plY3RzUmVmfSB9ID0gbWFwIHsgJF8gPT4gMSB9IEBMYXN0UHJvamVjdHM7CiAgICB9CgogICAgUFJPSkVDVElEOgogICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9CiAgICAgICAgKQogICAgewogICAgICAgIG5leHQgUFJPSkVDVElEIGlmICEkU2VsZi0+e0xhc3RQcm9qZWN0c1JlZn0tPnskUHJvamVjdElEfTsKICAgICAgICBteSAlSGFzaCA9ICgKICAgICAgICAgICAgS2V5ICAgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBMaXN0LCBcJUhhc2g7CgogICAgICAgICMgYXQgdGhlIG1vbWVudCBpdCBpcyBub3QgcG9zc2lsYmUgbWFyayB0aGUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgICMgaW4gdGhlIGZhdm9yaXQgbGlzdCAoSSB0aGluayBhIGJ1ZyBpbiBCdWlsZCBzZWxlY3Rpb24/ISkKICAgIH0KCiAgICAjIGFkZCB0aGUgc2VwZXJhdG9yCiAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgS2V5ICAgICAgPT4gJzAnLAogICAgICAgIFZhbHVlICAgID0+ICctLS0tLS0tLS0tLS0tLS0tLS0tLScsCiAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgIH07CgogICAgIyBhZGQgYWxsIGFsbG93ZWQgcHJvamVjdHMgdG8gdGhlIGxpc3QKICAgIFBST0pFQ1RJRDoKICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAhJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgbXkgJUhhc2ggPSAoCiAgICAgICAgICAgIEtleSAgID0+ICRQcm9qZWN0SUQsCiAgICAgICAgICAgIFZhbHVlID0+ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VsZWN0ZWRJRH0gJiYgJFBhcmFte1NlbGVjdGVkSUR9IGVxICRQcm9qZWN0SUQgKSB7CiAgICAgICAgICAgICRIYXNoe1NlbGVjdGVkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBMaXN0LCBcJUhhc2g7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXEBMaXN0LAogICAgICAgIE5hbWUgICAgICAgID0+ICJQcm9qZWN0SURbJFBhcmFte1dvcmtpbmdVbml0SUR9XSIsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICBNYXggICAgICAgICA9PiA2MiwKICAgICk7Cgp9CgojIGludGVncmF0ZSB0aGUgaGFuZGxpbmcgZm9yIHJlcXVpcmVkIHJlbWFya3MgaW4gcmVsYXRpb24gdG8gcHJvamVjdHMKCnN1YiBfUHJvamVjdDJSZW1hcmtSZWdFeHAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSBAUHJvamVjdHMyUmVtYXJrID0gKCk7CiAgICBteSAlUHJvamVjdERhdGEgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgKICAgICAgICBTdGF0dXMgPT4gJ3ZhbGlkJywKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwJyk7CgogICAgbXkgJFByb2plY3QyUmVtYXJrUmVnRXhwID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpQcm9qZWN0MlJlbWFya1JlZ0V4cCcpOwoKICAgIGZvciBteSAkUHJvamVjdElEICgga2V5cyAleyAkUHJvamVjdERhdGF7UHJvamVjdH0gfSApIHsKICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXtQcm9qZWN0fXskUHJvamVjdElEfSA9fiBteyRQcm9qZWN0MlJlbWFya1JlZ0V4cH1zbXggKSB7CiAgICAgICAgICAgIHB1c2ggQFByb2plY3RzMlJlbWFyaywgJFByb2plY3RJRDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGpvaW4gJ3wnLCBAUHJvamVjdHMyUmVtYXJrOwp9CjE7Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCx2IDEuMjQgMjAwOS8wMi8yNCAxNDozNTo1MCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgZm9yICh2YXIgQ291bnRlciA9IDE7Q291bnRlciA8IDEwOyBDb3VudGVyKyspIHsKICAgICAgICB2YXIgUmVtYXJrICA9ICdSZW1hcmtbJyAgICArIENvdW50ZXIgKyAnXSc7CiAgICAgICAgdmFyIFByb2plY3QgPSAnUHJvamVjdElEWycgKyBDb3VudGVyICsgJ10nOwoKICAgICAgICBpZiAoIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUHJvamVjdF0udmFsdWUgKSB7CgogICAgICAgICAgICB2YXIgUmVtYXJrQ2hlY2sgPSBwcm9qZWN0X3JlbWFya19jaGVjayhQcm9qZWN0KTsKCiAgICAgICAgICAgIGlmICggICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1Byb2plY3RdLnZhbHVlCiAgICAgICAgICAgICAgICAmJiBSZW1hcmtDaGVjawogICAgICAgICAgICAgICAgJiYgICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tSZW1hcmtdLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUmVtYXJrXS52YWx1ZS5sZW5ndGggPCA4CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2UgYWRkIGEgcmVtYXJrIHdpdGggbW9yZSB0aGFuIDggY2hhcmFjdGVycyEifScpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tSZW1hcmtdLmZvY3VzKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcHJvamVjdF9yZW1hcmtfY2hlY2soUHJvamVjdCkgewoKICAgIHZhciByZWcgPSAvXigkUURhdGF7IlJlbWFya1JlZ0V4cCJ9KSQvOwoKICAgIGlmICggcmVnLnRlc3QoZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tQcm9qZWN0XS52YWx1ZSkgPT0gZmFsc2UgKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCi8vIFRoaXMgZnVuY2l0b24gbWFrZSB0aGUgaW52aXNpYmxlIGlucHV0IGZpZWxkcyAoOSAtIDE2KSB2aXNpYmxlCgpmdW5jdGlvbiBNb3JlSW5wdXRGaWVsZHMoKSB7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1s5XSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTBdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxMV0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzEyXSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTNdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxNF0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzE1XSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTZdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTGluayIpLnN0eWxlLnZpc2liaWxpdHkgPSAiY29sbGFwc2UiOwogICAgfQp9CgovLy0tPgo8L3NjcmlwdD4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IHRpbWUgcmVjb3JkIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249T3ZlcnZpZXcmWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiT3ZlcnZpZXcifTwvYT4KPCEtLSBkdGw6YmxvY2s6Q3JlYXRlUHJvamVjdCAtLT4KICAgICAgLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Qcm9qZWN0U2V0dGluZyIgY2xhc3M9Im1lbnVpdGVtIj4KICAgICAgJFRleHR7IlByb2plY3Qgc2V0dGluZ3MifQogICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZTIiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJEYXRlIG5hdmlnYXRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGUifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kTFFEYXRheyJEYXlCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RWRpdCZZZWFyPSRMUURhdGF7IlllYXJOZXh0In0mTW9udGg9JExRRGF0YXsiTW9udGhOZXh0In0mRGF5PSRMUURhdGF7IkRheU5leHQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJOZXh0IGRheSJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJEYXlzIHdpdGhvdXQgZW50cmllcyJ9Ogo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlV29ya2luZ0RheXMgLS0+CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RWRpdCZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JkRheT0kTFFEYXRheyJEYXkifSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkJvbGRTdGFydCJ9CiAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZEVuZCJ9CiAgICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlV29ya2luZ0RheXMgLS0+CiAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkVkaXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3RhdHVzIiAgICB2YWx1ZT0iQWN0aW9uIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlllYXIiICAgICAgdmFsdWU9IiRRRGF0YXsiWWVhciJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik1vbnRoIiAgICAgdmFsdWU9IiRRRGF0YXsiTW9udGgifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXkiICAgICAgIHZhbHVlPSIkUURhdGF7IkRheSJ9Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkRhdGUifTogJFRleHR7IiRRRGF0YXsiV2Vla2RheV90b19UZXh0In0ifSAkUURhdGF7IlllYXIifS0kUURhdGF7Ik1vbnRoIn0tJFFEYXRheyJEYXkifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiU3RhcnQifSAoSEg6TU0pPHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3NUaW1lIn0iPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJFbmQifSAoSEg6TU0pPHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3NUaW1lIn0iPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTxzcGFuIGNsYXNzPSJmb290bm90ZSI+JFFEYXRheyJQZXJpb2ROb3RlIn08L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgaWQ9Ik1vcmVGaWVsZHNbJFFEYXRheyJJRCJ9XSIgIHN0eWxlPSJ2aXNpYmlsaXR5OiRRRGF0YXsiVmlzaWJpbGl0eSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJQcm9qZWN0T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkFjdGlvbk9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZW1hcmtbJFFEYXRheyJJRCJ9XSIgICAgdmFsdWU9IiRRRGF0YXsiUmVtYXJrIn0iICAgIHNpemU9IjM1Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN0YXJ0VGltZVskUURhdGF7IklEIn1dIiB2YWx1ZT0iJFFEYXRheyJTdGFydFRpbWUifSIgc2l6ZT0iNyI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJFbmRUaW1lWyRRRGF0YXsiSUQifV0iICAgdmFsdWU9IiRRRGF0YXsiRW5kVGltZSJ9IiAgIHNpemU9IjciPjwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVuaXRJbnB1dFBlcmlvZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUGVyaW9kWyRRRGF0YXsiSUQifV0iIHZhbHVlPSIkUURhdGF7IlBlcmlvZCJ9IiBzaXplPSI3Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdElucHV0UGVyaW9kIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiUGVyaW9kIn08L3RkPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZWFkb25seSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIiBpZD0iTGluayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Ok1vcmVJbnB1dEZpZWxkcygpIiBzdHlsZT0idmlzaWJpbGl0eTokUURhdGF7IkxpbmtWaXNpYmlsaXR5In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1iaWcucG5nIiBhbHQ9IiRUZXh0eyJNb3JlIGlucHV0IGZpZWxkcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iNCI+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iTGVhdmVEYXkiICREYXRheyJMZWF2ZURheSJ9PiRUZXh0eyJPbiB2YWNhdGlvbiJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iU2ljayIgICAgICREYXRheyJTaWNrIn0+JFRleHR7Ik9uIHNpY2sgbGVhdmUifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9Ik92ZXJ0aW1lIiAkRGF0YXsiT3ZlcnRpbWUifT4kVGV4dHsiT24gb3ZlcnRpbWUgbGVhdmUifQo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+JFFEYXRheyJUb3RhbCJ9Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcXVpcmVkIj4kVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8IS0tIGR0bDpibG9jazpSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlYWRvbmx5Ij4kVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBzdHlsZT0iZGlzcGxheTpub25lOyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iIG5hbWU9IkRlbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcXVpcmVkIj4qICRUZXh0eyJSZXF1aXJlZCBGaWVsZCJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvb3ROb3RlIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJZb3UgaGF2ZSB0byBpbnNlcnQgYSBzdGFydCBhbmQgYW4gZW5kIHRpbWUgb3IgYSBwZXJpb2QifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290bm90ZSI+KiAkVGV4dHsiSWYgeW91IHNlbGVjdCAiTWlzY2VsbGFuZW91cyAobWlzYykiIHRoZSB0YXNrLCBwbGVhc2UgZXhwbGFpbiB0aGlzIGluIHRoZSByZW1hcmtzIGZpZWxkIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nVmlldy5kdGwsdiAxLjEwIDIwMDgvMDkvMzAgMTE6NDE6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlZpZXcgdGltZSByZWNvcmQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuIn0iIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZpZXcgb2YgIn0gJFFEYXRheyJVc2VyIn08YnI+PGJyPjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZpZXciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVXNlcklEIiAgICB2YWx1ZT0iJFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJEYXRlIG5hdmlnYXRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGVTZWxlY3Rpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkRhdGUifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhckJhY2sifSZNb250aD0kUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kUURhdGF7IkRheUJhY2sifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1WaWV3JlllYXI9JFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhOZXh0In0mRGF5PSRRRGF0YXsiRGF5TmV4dCJ9JlVzZXJJRD0kUURhdGF7IlVzZXJJRCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJQcm9qZWN0In0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiQWN0aW9uIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUmVtYXJrIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTdGFydFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkVuZFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlBlcmlvZCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMiIgbmFtZT0iTGVhdmVEYXkiICREYXRheyJMZWF2ZURheSJ9IGRpc2FibGVkPiRUZXh0eyJPbiB2YWNhdGlvbiJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0xIiBuYW1lPSJTaWNrIiAkRGF0YXsiU2ljayJ9IGRpc2FibGVkPiRUZXh0eyJPbiBzaWNrIGxlYXZlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTMiIG5hbWU9Ik92ZXJ0aW1lIiAkRGF0YXsiT3ZlcnRpbWUifSBkaXNhYmxlZD4kVGV4dHsiT24gb3ZlcnRpbWUgbGVhdmUifQogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KPCEtLSBkdGw6YmxvY2s6VmFjYXRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJWYWNhdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPjwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZy5kdGwsdiAxLjIwIDIwMDkvMDEvMjEgMTA6NDM6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpQcm9qZWN0U2V0dGluZyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IHRpbWUgYWNjb3VudGluZyBwcm9qZWN0IHNldHRpbmdzIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiQmFjayJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJQcm9qZWN0U2V0dGluZyI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlByb2plY3Qgc2V0dGluZ3MifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgPHRyICBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQ29tbWVudHMifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiU3RhdHVzIn08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUHJvamVjdFskUURhdGF7IlByb2plY3RJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiUHJvamVjdCJ9IiBzaXplPSIzMCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz0iMiIgbmFtZT0iUHJvamVjdERlc2NyaXB0aW9uWyRRRGF0YXsiUHJvamVjdElEIn1dIiBjb2xzPSI0MCI+JFFEYXRheyJQcm9qZWN0RGVzY3JpcHRpb24ifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgbmFtZT0iTmV3UHJvamVjdCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uUHJvamVjdCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHIgY2xhc3M9InJlcXVpcmVkIj48dGQ+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvdGQ+PC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0U2V0dGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IHRpbWUgYWNjb3VudGluZyBzZXR0aW5ncyJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFNldHRpbmciIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJQcm9qZWN0IHNldHRpbmdzIn0KICAgICAgPC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNldHRpbmciPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJUYXNrIHNldHRpbmdzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGFzayJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQWN0aW9uWyRRRGF0YXsiQWN0aW9uSUQifV0iIHZhbHVlPSIkUURhdGF7IkFjdGlvbiJ9IiBzaXplPSI0MCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgbmFtZT0iTmV3QWN0aW9uIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBuYW1lPSJBY3Rpb25BY3Rpb24iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICAgIDxicj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiVXNlciBzZXR0aW5ncyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMyI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudHMifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz0iMSIgbmFtZT0iRGVzY3JpcHRpb25bJFFEYXRheyJVc2VySUQifV0iIGNvbHM9IjQwIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iU2hvd092ZXJ0aW1lWyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IlNob3dPdmVydGltZSJ9PgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJTaG93IE92ZXJ0aW1lIn08YnI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9IkNoZWNrYm94IiBuYW1lPSJDcmVhdGVQcm9qZWN0WyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IkNyZWF0ZVByb2plY3QifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWxsb3cgcHJvamVjdCBjcmVhdGlvbiJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYWxlbmRhciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ2FsZW5kYXJPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIGJlZ2luIn08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QgZW5kIn08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJEYXlzIG9mIHZhY2F0aW9uIn08c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyBwZXIgd2VlayJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBdXRob3JpemVkIG92ZXJ0aW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGF0ZVN0YXJ0WyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlU3RhcnQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVFbmRbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkRhdGVFbmQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxlYXZlRGF5c1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiTGVhdmVEYXlzIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldlZWtseUhvdXJzWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJXZWVrbHlIb3VycyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiT3ZlcnRpbWUifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQgdGltZSBwZXJpb2QifSIgIG5hbWU9Ik5ld1VzZXJTZXR0aW5nWyRRRGF0YXsiVXNlcklEIn1dIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aHI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CjwhLS0gZHRsOmJsb2NrOk5ld1VzZXJPcHRpb24gLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIzIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTmV3VXNlck9wdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik5ldyJ9IiAgbmFtZT0iTmV3VXNlciI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uVXNlciI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHIgY2xhc3M9InJlcXVpcmVkIj48dGQ+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvdGQ+PC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ092ZXJ2aWV3LmR0bCx2IDEuMjAgMjAwOC8xMS8yNyAxNToyOTowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSByZXBvcnRpbmcgbW9udGhseSBvdmVydmlldyJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPdmVydmlldyBvZiAifSAkUURhdGF7IlVzZXIifTxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjA7JiMwNjA7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAmIzA2MjsmIzA2MjsKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyICREYXRheyJTdHlsZSJ9PgogICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kTFFEYXRheyJTdWJhY3Rpb24ifSZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JkRheT0kTFFEYXRheyJEYXkifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAkUURhdGF7IkRheSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiV2Vla2RheV90b19UZXh0In0ifTwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiQ29tbWVudCJ9In08L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJsZWZ0Ij4kVGV4dHsiVG90YWwgaG91cnMgd29ya2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMzMlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiT3ZlcnRpbWUgKEhvdXJzKSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7Ik92ZXJ0aW1lICh0aGlzIG1vbnRoKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJPdmVydGltZSAodG90YWwpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVVbnRpbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPiRUZXh0eyJSZW1haW5pbmcgb3ZlcnRpbWUgbGVhdmUifTo8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJPdmVydGltZVRvdGFsIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnRpbWUgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlZhY2F0aW9uIChEYXlzKSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IlZhY2F0aW9uIHRha2VuICh0aGlzIG1vbnRoKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJWYWNhdGlvbiB0YWtlbiAodG90YWwpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlUb3RhbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPiRUZXh0eyJSZW1haW5pbmcgdmFjYXRpb24ifTo8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlNpY2sgbGVhdmUgKERheXMpIn06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiU2ljayBsZWF2ZSB0YWtlbiAodGhpcyBtb250aCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJTaWNrIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJTaWNrIGxlYXZlIHRha2VuICh0b3RhbCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJTaWNrVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIncyBwcm9qZWN0IG92ZXJ2aWV3In06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik1vbnRobHkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxpZmV0aW1lIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dGQgcm93c3Bhbj0iJERhdGF7IlJvd1NwYW4ifSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29udGVudGtleSRRRGF0YXsiU3RhdHVzIn0iPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgICAkRGF0YXsiUHJvamVjdCJ9CjwhLS0gZHRsOmJsb2NrOlByb2plY3ROb0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOlByb2plY3RMaW5rIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Qcm9qZWN0UmVwb3J0aW5nJlByb2plY3RJRD0kUURhdGF7IlByb2plY3RJRCJ9Ij4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQogICAgICAgICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOlByb2plY3RMaW5rIC0tPgogICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnR2YWx1ZSRRRGF0YXsiU3RhdHVzIn0iPiREYXRheyJQcm9qZWN0RGVzY3JpcHRpb24ifTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iID4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnNUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiR3JhbmQgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsSG91cnNUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nLmR0bCx2IDEuMTYgMjAwOC8wOS8zMCAxMTo0MToxOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgcmVwb3J0aW5nIn06ICRUZXh0eyIkUURhdGF7Ik1vbnRoX3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIiA+JFRleHR7Ik1vbnRoIG5hdmlnYXRpb24ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlJlcG9ydGluZyI+CiAgICAgICAgICAgICAgJERhdGF7Ik1vbnRoT3B0aW9uIn0KICAgICAgICAgICAgICAkRGF0YXsiWWVhck9wdGlvbiJ9CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTW9udGhfdG9fVGV4dCJ9In0gJFFEYXRheyJZZWFyIn0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJOZXh0IGRheSJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJVc2VyIHJlcG9ydHMifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+JFRleHR7Ik1vbnRobHkgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IkxpZmV0aW1lIHRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUgbGVhdmUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlZhY2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTaWNrIGxlYXZlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSBsZWF2ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Jm5ic3A7JFFEYXRheyJPdmVydGltZVRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbFdvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbE92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IHJlcG9ydHMifToKICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSI+CiAgICAgICAgICAgICgkVGV4dHsiU2hvdyJ9ICRUZXh0eyIkUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0ifSAkVGV4dHsiUHJvamVjdHMifSkKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTW9udGhseSB0b3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGlmZXRpbWUgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdCAtLT4KICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIkRGF0YXsiUm93U3BhbiJ9IiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50a2V5JFFEYXRheyJTdGF0dXMifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RSZXBvcnRpbmcmUHJvamVjdElEPSRRRGF0YXsiUHJvamVjdElEIn0iPgogICAgICAgICAgICAgICAgICAkRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3Vyc1RvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ1Byb2plY3RSZXBvcnRpbmcuZHRsLHYgMS42IDIwMDkvMDEvMjEgMTA6NDM6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJQcm9qZWN0IHJlcG9ydCJ9OiAkUURhdGF7IlByb2plY3QifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAkVGV4dHsiUHJvamVjdCByZXBvcnQifTogJFFEYXRheyJQcm9qZWN0In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlVzZXIifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXJOYW1lIC0tPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQWN0aW9uIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG90YWwifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXJUb3RhbCAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEFsbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7Ikhpc3RvcnkifTogJFFEYXRheyJQcm9qZWN0In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJEYXRlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlVzZXIifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlBlcmlvZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpIaXN0b3J5VG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ikhpc3RvcnlUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVRvdGFsIC0tPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBPVFJTIEdtYkgsIGh0dHA6Ly93d3cub3Rycy5kZS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZS5kdGwsdiAxLjEuMS4xIDIwMDUvMDkvMDUgMTI6MTg6NDMgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTm90aWZpY2F0aW9uVGltZUFjY291bnRpbmcucG0sdiAxLjUgMjAwOC8wNy8yOCAxMDowNDo1MSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwgKTsKICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgKTsKICAgIGlmICggJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9ICkgewogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwoKICAgICAgICAjIHJlZGlyZWN0IGlmIGluY29tcGxldGUgd29ya2luZyBkYXkgYXJlIG91dCBvZiByYW5nZQogICAgICAgIGlmICggJEluY29tcGxldGVXb3JraW5nRGF5c3tXYXJuaW5nfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICcnOwp9CgoxOwo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAEo0lEQVQ4y42VW2yURRTHf99lu7tdSr/laoBCa28qERaRRChSUWKEYKhcEqMEKoIKIdbGEDHRaIhCMJK2MZHEB60aHlRCMEDkQSlGFC1Bti1eCoFuuZV7lwK97DdzxoduSxERTnIyk8nM7/wzc+YcyxjDnSxv0U7PaIkZpRGt4yd3LUze6Yx1O3Dh0u9jRusKUbrMKO2J0oivMEojSifFV9vFVzXn9y+L3xW4+MU6z4hUidblxsskK38Y9xVEKRwVIdO1ONDSwemjFzlZ34Lfch6jVK0oqbzcuCp5W3Dx8jrPiKkj6MTGlOTycslIysaFEAPraw+TEw0wd04xKQMHL/p8/kMr+z/dh7rYERelZ145UtkPt/uhK/Z6xpg6OysYm7ckxmfzx/JUToiUgG9g3NAMRkSDCCAGxkcDvLeggBUflOGOyI6Jr+sGjd3o3QI2IlV20I3NWjSeiknZBB2LlECPQErg6dlFTJmaiza94FOtCcTA3GKP8vXzcLMzY6J01U3gomV7YkZL+Zjpebw0IRtlelWmBFLp0Tc3/HBjnPklk9iw5lVSGqbneUxd9TjG1+WhIe/G+sFGpCI8PMKCKSMI2L1KB3pPH1zgcEOcJbNnIiLEZjxB8loX3RrufziXwcX3IEpX3ABrKRtaMIwJQzPw04CBavu8aQD0rc1fMGTiozRetdjdepXWjh5Glz6A+LoMwM1/breHMV5hwRC0segWCNhgG7Ct3vtqbopzujXB2ytfQIuwurqWzvxHaE8F6dGKoANiLEZNzKFBa8+yX/dsIxITpYlGw9R+9Se7vjvCNQVdGro1JBIJ1jz/DIn6H7l6JcmMxSu50K05+3cDgwI2gwI2l5rP0/ztIYaN9hClwRBzjdIYLbi2RfJckizCXEmlVVtw9HgCz/MoLS2lurqa3Zs39uf9up9PEMkehnO9E3O5g7BrQfpfuEYkLkrTmezkyaXTCNqQTIMdC+6dUkpR6WzWrtvAKxs+YvDQkWgDSgwR18Z1bWKlBRSW5NN2or0vZtwyxpAz55v20oUTvIem5ZHpWoRdi7BjEXYhaFu4NvjdXThuAByXlBh6tKFLGTqV4boyXPeFX7f9zo53tiWN2RS1AUTp7Ud+ayVoG8IORFzICsCggEVWhsXggM3wwRGimRlkBWyyAjYR175JRMixOLzzEMD2/nQTX9Wc+OssZ46eJ+iQVmsRcW0irkXE7Q0WSQeNuBaRgEXYtQk5FkHH4sTBBC0HWgBq+sFtdYvjxle1Wz/eh+7yCaYVhB0I25DppKFO7zzkQCi9J+hY+Ne72fLmVoBaYzbFb6oVoqXyUltH/MM3dpDqTJFhWwQsCKbBe/afpqmpjZDduxZIe8/Vbt5/9hMunmqPA5W3FKEL9cuTovTMRPO5+GtLttB48CSuBQELMmxobjxN27EL/dniAA2/HGP1rCoSf5yJAzON2ZS8baHPLqryjNJV4uvyyZNHs2jBgzxWMo6CXA9toPn4Zer2HuPrLw9Q/9MxgFqgciD0f1tTZNT6mPi6QnxVJkp7RinE1xgRgGT69Wv67vSue95Ac0Nrvb6vjyH+b3X/Zf8AFuFkUCNJ29gAAAAASUVORK5CYII=
IyAtLQojIFRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpbWVBY2NvdW50aW5nLnBtLHYgMS40IDIwMDgvMDgvMjkgMDU6NTU6MjYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKClRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgdGltZV9hY2NvdW50aW5nCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aW1lX2FjY291bnRpbmcnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgYWxsIHRpbWUgYWNjb3VudGluZyB1c2VyLicsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIHRpbWVfYWNjb3VudGluZwogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAndGltZV9hY2NvdW50aW5nJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBncm91cCBkZXNjcmlwdGlvbi4nLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBjaGVjayBpZiBncm91cCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyByZWFjdGl2YXRlIHRoZSBncm91cAogICAgaWYgKCRHcm91cElEKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFjdGl2YXRlIGdyb3VwCiAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgYWRkIHRoZSBncm91cAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBDb21tZW50ID0+ICRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgbmV3IGdyb3VwIGlkCiAgICBteSAkTmV3R3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB1c2VyIHJvb3QgdG8gdGhlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgR0lEICAgICAgICA9PiAkTmV3R3JvdXBJRCwKICAgICAgICBVSUQgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOC8wOC8yOSAwNTo1NToyNiAkCgo9Y3V0Cg==