TimeAccounting
1.2.2
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
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-01-21 11:44:48
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuMTAgMjAwOS8wMS8yMSAxMDo0MzoxOSB0ciBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGltZUFjY291bnRpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+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+TGVndCBmZXN0LCBiZWkgd2VsY2hlbiBQcm9qZWt0ZW4gZWluIEFubWVya3VuZyBtaXQgZWluZ2V0cmFnZW4gd2VyZGVuIG11c3MuIEJlaSBhbGxlbiBQcm9qZWt0ZW4sIGJlaSBkZW5uZW4gZGllc2UgUmVnRXhwIG1hdGNoZWQsIG11c3MgYXVjaCBlaW5lIEFubWVya3VuZyBlaW5nZXRyYWdlbiB3ZXJkZW4gKGRpZSBSZWdFeHAgYXJiZWl0ZXQgbWl0IGRlbiBzbXgtUGFyYW1ldGVybikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPl4oPzogUFJPSkVDVFwjIHwgSU5GUkE6IHwgXChcKG90cnNcKVwpIHwgUFJPRFVDVDogKTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuMjQgMjAwOS8wMS8yMSAxMDo0MzoxOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNCAkKSBbMV07Cgp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2Vlayk7Cgo9aGVhZDEgTkFNRSMKCktlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZyAtIHRpbWVhY2NvdW50aW5nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdGltZWFjY291bnRpbmcgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRSMKCj1vdmVyIDQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVXNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lQWNjb3VudGluZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlcklEIFRpbWVPYmplY3QgVXNlck9iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVXNlckN1cnJlbnRQZXJpb2RHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBvZiB0aGUgY3VycmVudCBwZXJpb2QgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMic7CiAgICAgICAgRGF5ICAgPT4gJzI0JwogICAgKTsKCj1jdXQKCnN1YiBVc2VyQ3VycmVudFBlcmlvZEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyQ3VycmVudFBlcmlvZEdldDogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICkgLiAiIDAwOjAwOjAwIjsKCiAgICAjIENhY2hpbmcKICAgIGlmICggJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317JERhdGV9ICkgewogICAgICAgIHJldHVybiAleyAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfXskRGF0ZX0gfTsKICAgIH0KCiAgICAjIGRiIHNlbGVjdAogICAgbXkgJURhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIKICAgICAgICAgICAgLiAiV0hFUkUgZGF0ZV9zdGFydCA8PSAnJERhdGUnIEFORCBkYXRlX2VuZCAgPj0nJERhdGUnIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRVc2VyUmVmID0gewogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQZXJpb2QgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBEYXRlU3RhcnQgICA9PiBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICksCiAgICAgICAgICAgIERhdGVFbmQgICAgID0+IHN1YnN0ciggJFJvd1szXSwgMCwgMTAgKSwKICAgICAgICAgICAgV2Vla2x5SG91cnMgPT4gJFJvd1s0XSwKICAgICAgICAgICAgTGVhdmVEYXlzICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgT3ZlcnRpbWUgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgVXNlclN0YXR1cyAgPT4gJFJvd1s3XSwKICAgICAgICB9OwogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkVXNlclJlZjsKICAgIH0KCiAgICAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfXskRGF0ZX0gPSBcJURhdGE7CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgbGVhdmVkYXlzLCBvdmVydGltZXMsCndvcmtpbmdob3VycyBldGMuIG9mIGFsbCB1c2VycwoKICAgIG15ICVEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMTInLAogICAgICAgIERheSAgID0+ICcxMicsICAgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBVc2VyUmVwb3J0aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgPSAoKTsKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gJiYgJF8gbmUgJ0RheScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJVc2VyUmVwb3J0aW5nOiBOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17RGF5fSB8fD0gRGF5c19pbl9Nb250aCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9ICk7CgogICAgbXkgJVVzZXJDdXJyZW50UGVyaW9kID0gJFNlbGYtPlVzZXJDdXJyZW50UGVyaW9kR2V0KCVQYXJhbSk7CiAgICBteSAkWWVhclN0YXJ0ICAgICAgICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnQgICAgICAgID0gMDsKICAgIG15ICREYXlTdGFydCAgICAgICAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgICAgICAgPSAkUGFyYW17WWVhcn07CiAgICBteSAkTW9udGhFbmQgICAgICAgICAgPSAkUGFyYW17TW9udGh9OwogICAgbXkgJERheUVuZCAgICAgICAgICAgID0gJFBhcmFte0RheX07CgogICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyQ3VycmVudFBlcmlvZCApIHsKICAgICAgICBpZiAoICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheX0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17U2lja30gICAgICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX0gICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1NpY2tUb3RhbH0gICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0gPSAwOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRZZWFyICggJFllYXJTdGFydC4uJFllYXJFbmQgKSB7CiAgICAgICAgICAgIG15ICRNb250aFN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ID8gJE1vbnRoU3RhcnQgOiAxOwogICAgICAgICAgICBteSAkTW9udGhFbmRQb2ludCAgID0gJFllYXIgPT0gJFllYXJFbmQgICA/ICRNb250aEVuZCAgIDogMTI7CgogICAgICAgICAgICBmb3IgbXkgJE1vbnRoICggJE1vbnRoU3RhcnRQb2ludC4uJE1vbnRoRW5kUG9pbnQgKSB7CgogICAgICAgICAgICAgICAgbXkgJERheVN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCA/ICREYXlTdGFydCA6IDE7CiAgICAgICAgICAgICAgICBteSAkRGF5RW5kUG9pbnQgICA9ICRZZWFyID09ICRZZWFyRW5kCiAgICAgICAgICAgICAgICAgICAgJiYgJE1vbnRoID09ICRNb250aEVuZCA/ICREYXlFbmQgOiBEYXlzX2luX01vbnRoKCAkWWVhciwgJE1vbnRoICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKCAkRGF5U3RhcnRQb2ludC4uJERheUVuZFBvaW50ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVXb3JraW5nVW5pdCA9ICRTZWxmLT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFdvcmtpbmdIb3VycyA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJExlYXZlRGF5ICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNpY2sgICAgICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJE92ZXJ0aW1lICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldFN0YXRlICA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICgga2V5cyAlV29ya2luZ1VuaXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JraW5nSG91cnMgKz0gJFdvcmtpbmdVbml0eyRffXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRXb3JraW5nVW5pdHskX317UHJvamVjdElEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGVhdmVEYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkV29ya2luZ1VuaXR7JF99e0FjdGlvbklEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtTaWNrVG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNpY2sgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkV29ya2luZ1VuaXR7JF99e0FjdGlvbklEfSA9PSAtMyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRPdmVydGltZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc1RvdGFsfSArPSAkV29ya2luZ0hvdXJzOwogICAgICAgICAgICAgICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRXZWVrZGF5ID0gRGF5X29mX1dlZWsoICRZZWFyLCAkTW9udGgsICREYXkgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRXZWVrZGF5ICE9IDYKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFdlZWtkYXkgIT0gNwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFZhY2F0aW9uQ2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTaWNrCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkTGVhdmVEYXkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtXZWVrbHlIb3Vyc30gLyA1OwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0U3RhdGUgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9IC8gNTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1vbnRoID09ICRNb250aEVuZCAmJiAkWWVhciA9PSAkWWVhckVuZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9ICArPSAkVGFyZ2V0U3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc30gKz0gJFdvcmtpbmdIb3VyczsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXl9ICAgICArPSAkTGVhdmVEYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1NpY2t9ICAgICAgICAgKz0gJFNpY2s7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSA9ICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc30gLSAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0KICAgICAgICAgICAgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17T3ZlcnRpbWV9CiAgICAgICAgICAgICsgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzVG90YWx9CiAgICAgICAgICAgIC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVVbnRpbH0gPSAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAtICREYXRheyRVc2VySUR9e092ZXJ0aW1lfTsKICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVJlbWFpbmluZ30KICAgICAgICAgICAgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17TGVhdmVEYXlzfSAtICREYXRheyRVc2VySUR9e0xlYXZlRGF5VG90YWx9OwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgcHJvamVjdCBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NHZXQoCiAgICAgICAgU3RhdHVzID0+ICd2YWxpZCcgfHwgJ2ludmFsaWQnLCBvcHRpb25hbCBkZWZhdWx0IHZhbGlkICYmIGludmFsaWQKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzR2V0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJFdoZXJlID0gJyc7CgogICAgaWYgKCRQYXJhbXtTdGF0dXN9KSB7CiAgICAgICAgJFdoZXJlID0gJyBXSEVSRSBzdGF0dXMgPSAnOwogICAgICAgICRXaGVyZSAuPSAkUGFyYW17U3RhdHVzfSBlcSAnaW52YWxpZCcgPyAnMCcgOiAnMSc7CiAgICB9CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBwcm9qZWN0LCBkZXNjcmlwdGlvbiwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX3Byb2plY3QgJFdoZXJlIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRJRCA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7UHJvamVjdH17JElEfSAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtQcm9qZWN0RGVzY3JpcHRpb259eyRJRH0gPSAkUm93WzJdOwogICAgICAgICREYXRhe1Byb2plY3RTdGF0dXN9eyRJRH0gICAgICA9ICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IHByb2plY3QgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc0luc2VydCgKICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdpbnRlcm5hbCcsICMgb3B0aW9uYWwKICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte1Byb2plY3R9IHx8PSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0TmFtZScpIHx8ICcnOwogICAgJFBhcmFte1Byb2plY3RTdGF0dXN9IHx8PSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0U3RhdHVzJykKICAgICAgICB8fCAnMCc7CiAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSB8fD0gJyc7CgogICAgIyBkYiBxdW90ZQogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgICMgYnVpbGQgc3FsCgogICAgbXkgJFNRTAogICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0IChwcm9qZWN0LCBkZXNjcmlwdGlvbiwgc3RhdHVzKSAiCiAgICAgICAgLiAiVkFMVUVTICgnJFBhcmFte1Byb2plY3R9JywgJyRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259JywgJyRQYXJhbXtQcm9qZWN0U3RhdHVzfScpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSBwcm9qZWN0IGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBQcm9qZWN0SUQKICAgICAgICAgICAgUHJvamVjdCAgICAgICA9PiAnaW50ZXJuYWwnLAogICAgICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ3Byb2plY3RuYW1lJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBQUk9KRUNUSUQ6CiAgICBmb3IgbXkgJFByb2plY3RJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgbmV4dCBpZiAhJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3R9OwoKICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JFByb2plY3RJRH0gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRQcm9qZWN0SUR9eyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRQcm9qZWN0SUR9eyRffSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMCiAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAiCiAgICAgICAgICAgIC4gIlNFVCBwcm9qZWN0ID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdH0KICAgICAgICAgICAgLiAiJywgc3RhdHVzID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdFN0YXR1c30KICAgICAgICAgICAgLiAiJywgZGVzY3JpcHRpb24gPSAnIgogICAgICAgICAgICAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0RGVzY3JpcHRpb259IC4gIicgIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICciCiAgICAgICAgICAgIC4gJFByb2plY3RJRCAuICInIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBhY3Rpb24gc2V0dGluZ3MKCiAgICBteSAlQWN0aW9uRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBpZCwgYWN0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfYWN0aW9uJywgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtBY3Rpb259ICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvblN0YXR1c30gPSAkUm93WzJdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywgICAjIG9wdGlvbmFsCiAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkYiBxdW90ZQogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgICRQYXJhbXtBY3Rpb259IHx8PSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lJykgfHwgJyc7CiAgICAkUGFyYW17QWN0aW9uU3RhdHVzfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uU3RhdHVzJykKICAgICAgICB8fCAnMCc7CgogICAgIyBidWlsZCBzcWwKICAgIG15ICRTUUwKICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfYWN0aW9uIChhY3Rpb24sIHN0YXR1cykiCiAgICAgICAgLiAiIFZBTFVFUyAoJyRQYXJhbXtBY3Rpb259JyAsICckUGFyYW17QWN0aW9uU3RhdHVzfScpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnam91cm5leScsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIGlmICggJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSApIHsKCiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JEFjdGlvbklEfSB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRBY3Rpb25JRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFjdGlvbklEfXskX30gKSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gIgogICAgICAgICAgICAgICAgLiAiU0VUIGFjdGlvbiA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0KICAgICAgICAgICAgICAgIC4gIicsIHN0YXR1cyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gLiAiJyAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICciCiAgICAgICAgICAgICAgICAuICRBY3Rpb25JRCAuICInIjsKCiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyTGlzdCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIGRhdGEgb2YgYWxsIHVzZXIKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJMaXN0KCk7Cgo9Y3V0CgpzdWIgVXNlckxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkLCBkZXNjcmlwdGlvbiwgc2hvd19vdmVydGltZSwgY3JlYXRlX3Byb2plY3QsIGNhbGVuZGFyIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXInLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtVc2VySUR9ICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtEZXNjcmlwdGlvbn0gICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtTaG93T3ZlcnRpbWV9ICA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtDcmVhdGVQcm9qZWN0fSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtDYWxlbmRhcn0gICAgICA9ICRSb3dbNF07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBkYXRhIG9mIG9uZSB1c2VyCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAxNSwgICMKICAgICk7Cgo9Y3V0CgpzdWIgVXNlckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVXNlckdldDogTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGRlc2NyaXB0aW9uLCBzaG93X292ZXJ0aW1lLCBjcmVhdGVfcHJvamVjdCwgY2FsZW5kYXIgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlciBXSEVSRSB1c2VyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VXNlcklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7VXNlcklEfSAgICAgICAgPSAkUGFyYW17VXNlcklEfTsKICAgICAgICAkRGF0YXtEZXNjcmlwdGlvbn0gICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7U2hvd092ZXJ0aW1lfSAgPSAkUm93WzFdOwogICAgICAgICREYXRhe0NyZWF0ZVByb2plY3R9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtDYWxlbmRhcn0gICAgICA9ICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cyAnCiAgICAgICAgICAgIC4KICAgICAgICAgICAgJ0ZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kJywKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtVc2VySUR9ICAgICAgPSAkUm93WzBdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtQZXJpb2R9ICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtEYXRlU3RhcnR9ICAgPSBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0RhdGVFbmR9ICAgICA9IHN1YnN0ciggJFJvd1szXSwgMCwgMTAgKTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17V2Vla2x5SG91cnN9ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17TGVhdmVEYXlzfSAgID0gJFJvd1s1XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17T3ZlcnRpbWV9ICAgID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17VXNlclN0YXR1c30gID0gJFJvd1s3XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgdXNlciBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclNldHRpbmdzSW5zZXJ0KAogICAgICAgIFVzZXJJRCAgICAgICA9PiAnMicsCiAgICAgICAgUGVyaW9kICAgICAgID0+ICcyJywKICAgICk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfTsKCiAgICAkUGFyYW17V2Vla2x5SG91cnN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlcldlZWtseUhvdXJzJykKICAgICAgICB8fCAnNDAnOwogICAgJFBhcmFte0xlYXZlRGF5c30gID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckxlYXZlRGF5cycpIHx8ICcyNSc7CiAgICAkUGFyYW17VXNlclN0YXR1c30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyU3RhdHVzJykgICAgfHwgJzEnOwogICAgJFBhcmFte092ZXJ0aW1lfSAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlck92ZXJ0aW1lJykgIHx8ICcwJzsKICAgICRQYXJhbXtEYXRlRW5kfSAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kJykKICAgICAgICB8fCAnMjAwNy0xMi0zMSc7CiAgICAkUGFyYW17RGF0ZVN0YXJ0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlU3RhcnQnKQogICAgICAgIHx8ICcyMDA3LTAxLTAxJzsKICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGVzY3JpcHRpb24nKQogICAgICAgIHx8ICcnOwoKICAgICMgZGIgcXVvdGUKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKTsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBzcWwKICAgIG15ICRTUUwKICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgKHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwiCiAgICAgICAgLiAiIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cykiCiAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAuICIgKCckUGFyYW17VXNlcklEfScsICckUGFyYW17UGVyaW9kfScsICckUGFyYW17RGF0ZVN0YXJ0fSAwMDowMDowMCcsICckUGFyYW17RGF0ZUVuZH0gMDA6MDA6MDAnLCIKICAgICAgICAuICIgJyRQYXJhbXtXZWVrbHlIb3Vyc30nLCAnJFBhcmFte0xlYXZlRGF5c30nLCAnJFBhcmFte092ZXJ0aW1lfScsICckUGFyYW17VXNlclN0YXR1c30nKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwoKICAgICMgU3BsaXQgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgc2VwZXJhdGUgZnVuY3Rpb24hCgogICAgI2NoZWNrIGlmIHRoZSB1c2VyIHN0aWxsIGV4aXN0cwogICAgbXkgJFVzZXJJRDsKCiAgICAjIGJ1aWxkIHNxbAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyIFdIRVJFIHVzZXJfaWQgPSAnJFBhcmFte1VzZXJJRH0nIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRVc2VySUQgPSAkUm93WzBdOwogICAgfQogICAgaWYgKCAhZGVmaW5lZCAkVXNlcklEICkgewogICAgICAgICRTUUwgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXIgKHVzZXJfaWQsIGRlc2NyaXB0aW9uKSIKICAgICAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte0Rlc2NyaXB0aW9ufScpIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc1VwZGF0ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICBTaG93T3ZlcnRpbWUgID0+IDEgfHwgMCwKICAgICAgICAxICAgID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIFRleHQnLAogICAgICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7CiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfTsKCiAgICBVU0VSSUQ6CiAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgIG15ICRVc2VyUmVmID0gJFBhcmFteyRVc2VySUR9OwoKICAgICAgICBpZiAoICFkZWZpbmVkICRVc2VyUmVmLT57MX17RGF0ZVN0YXJ0fSAmJiAhZGVmaW5lZCAkVXNlclJlZi0+ezF9e0RhdGVFbmR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlclNldHRpbmdVcGRhdGU6IFRoZXJlIGFyZSBubyBkYXRhIGZvciB1c2VyIGlkICRVc2VySUQhIgogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICB9CgogICAgICAgICNzZXQgZGVmYXVsdCBmb3IgU2hvd092ZXJUaW1lLi4uCiAgICAgICAgJFVzZXJSZWYtPntTaG93T3ZlcnRpbWV9IHx8PSAwOwoKICAgICAgICAjc2V0IGRlZmF1bHQgZm9yIENyZWF0ZVByb2plY3QuLi4KICAgICAgICAkVXNlclJlZi0+e0NyZWF0ZVByb2plY3R9IHx8PSAwOwogICAgICAgICRVc2VyUmVmLT57Q2FsZW5kYXJ9ICAgICAgfHw9IDA7CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXIgIgogICAgICAgICAgICAuICJTRVQgZGVzY3JpcHRpb24gPSA/LCBzaG93X292ZXJ0aW1lID0gPywgY3JlYXRlX3Byb2plY3QgPSA/LCBjYWxlbmRhciA9ID8gIgogICAgICAgICAgICAuICJXSEVSRSB1c2VyX2lkID0gPyI7CgogICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICBcJFVzZXJSZWYtPntEZXNjcmlwdGlvbn0sIFwkVXNlclJlZi0+e1Nob3dPdmVydGltZX0sCiAgICAgICAgICAgIFwkVXNlclJlZi0+e0NyZWF0ZVByb2plY3R9LCBcJFVzZXJSZWYtPntDYWxlbmRhcn0sIFwkVXNlclJlZi0+e1VzZXJJRH0KICAgICAgICBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gJEJpbmQsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIChxdyhVc2VySUQgRGVzY3JpcHRpb24gU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QgQ2FsZW5kYXIpKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkVXNlclJlZi0+eyRffTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyRVc2VyUmVmfSApIHsKCiAgICAgICAgICAgIG15ICRQZXJpb2RSZWYgPSAkVXNlclJlZi0+eyRQZXJpb2R9OwoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAiCiAgICAgICAgICAgICAgICAuICJTRVQgbGVhdmVfZGF5cyA9ID8sIGRhdGVfc3RhcnQgPSA/IgogICAgICAgICAgICAgICAgLiAiLCBkYXRlX2VuZCA9ID8sIG92ZXJ0aW1lID0gPyIKICAgICAgICAgICAgICAgIC4gIiwgd2Vla2x5X2hvdXJzID0gPywgc3RhdHVzID0gPyAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSB1c2VyX2lkID0gPyBBTkQgcHJlZmVyZW5jZV9wZXJpb2QgPSA/IjsKCiAgICAgICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICAgICAgXCRQZXJpb2RSZWYtPntMZWF2ZURheXN9LCBcJFBlcmlvZFJlZi0+e0RhdGVTdGFydH0sICAgXCRQZXJpb2RSZWYtPntEYXRlRW5kfSwKICAgICAgICAgICAgICAgIFwkUGVyaW9kUmVmLT57T3ZlcnRpbWV9LCAgXCRQZXJpb2RSZWYtPntXZWVrbHlIb3Vyc30sIFwkUGVyaW9kUmVmLT57VXNlclN0YXR1c30sCiAgICAgICAgICAgICAgICBcJFBlcmlvZFJlZi0+e1VzZXJJRH0sICAgIFwkUGVyaW9kLAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYW5kCnRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgaW4gdGhlIGFsbG93ZWQKcmFuZ2UuCgogICAgbXkgJVdvcmtpbmdVbml0c0NoZWNrID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICAgICAgICAgICAgID0gKCk7CiAgICBteSAkV29ya2luZ1VuaXRJRCAgICAgICA9IDA7CiAgICBteSAlQ29tcGxldGVXb3JraW5nRGF5cyA9ICgpOwogICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgKTsKCiAgICBteSAkVXNlcklEID0gJFBhcmFte1VzZXJJRH0gfHwgJFNlbGYtPntVc2VySUR9OwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUIHRpbWVfc3RhcnQgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgdXNlcl9pZCA9ID8iLAogICAgICAgIEJpbmQgPT4gW1wkVXNlcklEXSwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXihcZCspLShcZCspLShcZCspLyApIHsKICAgICAgICAgICAgJENvbXBsZXRlV29ya2luZ0RheXN7JDF9eyQyfXskM30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwoKICAgIG15ICRXb3JraW5nRGF5cyA9IDA7CiAgICBteSAkWWVhclN0YXJ0ICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnQgID0gMDsKICAgIG15ICREYXlTdGFydCAgICA9IDA7CiAgICBteSAkWWVhckVuZCAgICAgPSAkWWVhcjsKICAgIG15ICRNb250aEVuZCAgICA9ICRNb250aDsKICAgIG15ICREYXlFbmQgICAgICA9ICREYXk7CgogICAgaWYgKCAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17RGF0ZVN0YXJ0fSA9fiAvXihcZCspLShcZCspLShcZCspLyApIHsKICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICRNb250aFN0YXJ0ID0gJDI7CiAgICAgICAgJERheVN0YXJ0ICAgPSAkMzsKICAgIH0KCiAgICBteSAkQ2FsZW5kYXIgPSB7ICRTZWxmLT5Vc2VyR2V0KCBVc2VySUQgPT4gJFVzZXJJRCApIH0tPntDYWxlbmRhcn07CgogICAgZm9yIG15ICRZZWFyICggJFllYXJTdGFydC4uJFllYXJFbmQpIHsKCiAgICAgICAgbXkgJE1vbnRoU3RhcnRQb2ludCA9ICRZZWFyID09ICRZZWFyU3RhcnQgPyAkTW9udGhTdGFydCA6IDE7CiAgICAgICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9ICRZZWFyID09ICRZZWFyRW5kICAgPyAkTW9udGhFbmQgICA6IDEyOwoKICAgICAgICBmb3IgbXkgJE1vbnRoICggJE1vbnRoU3RhcnRQb2ludC4uJE1vbnRoRW5kUG9pbnQpIHsKICAgICAgICAgICAgbXkgJERheVN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCA/ICREYXlTdGFydCA6IDE7CiAgICAgICAgICAgIG15ICREYXlFbmRQb2ludCA9ICRZZWFyID09ICRZZWFyRW5kCiAgICAgICAgICAgICAgICAmJiAkTW9udGggPT0gJE1vbnRoRW5kID8gJERheUVuZCA6IERheXNfaW5fTW9udGgoICRZZWFyLCAkTW9udGggKTsKICAgICAgICAgICAgbXkgJE1vbnRoU3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKCiAgICAgICAgICAgIGZvciBteSAkRGF5ICggJERheVN0YXJ0UG9pbnQuLiREYXlFbmRQb2ludCApIHsKICAgICAgICAgICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhciA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICREYXlTdHJpbmcgPSBzcHJpbnRmKCAiJTAyZCIsICREYXkgKTsKICAgICAgICAgICAgICAgIG15ICRXZWVrZGF5ID0gRGF5X29mX1dlZWsoICRZZWFyLCAkTW9udGgsICREYXkgKTsKICAgICAgICAgICAgICAgIGlmICggJFdlZWtkYXkgIT0gNiAmJiAkV2Vla2RheSAhPSA3ICYmICEkVmFjYXRpb25DaGVjayApIHsKICAgICAgICAgICAgICAgICAgICAkV29ya2luZ0RheXMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkV2Vla2RheSAhPSA2CiAgICAgICAgICAgICAgICAgICAgJiYgJFdlZWtkYXkgIT0gNwogICAgICAgICAgICAgICAgICAgICYmICEkVmFjYXRpb25DaGVjawogICAgICAgICAgICAgICAgICAgICYmICEkQ29tcGxldGVXb3JraW5nRGF5c3skWWVhcn17JE1vbnRoU3RyaW5nfXskRGF5U3RyaW5nfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRoU3RyaW5nfXskRGF5U3RyaW5nfSA9ICRXb3JraW5nRGF5czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15ICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5cycpIHx8ICc1JzsKICAgIG15ICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzQmVmb3JlV2FybmluZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nJykKICAgICAgICB8fCAnMyc7CiAgICBmb3IgbXkgJFllYXIgKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9IH0gKSB7CiAgICAgICAgZm9yIG15ICRNb250aCAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9IH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkRGF5ICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofSB9ICkgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9eyREYXl9CiAgICAgICAgICAgICAgICAgICAgPCAkV29ya2luZ0RheXMgLSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5cwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtFbmZvcmNlSW5zZXJ0fSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH17JERheX0KICAgICAgICAgICAgICAgICAgICA8ICRXb3JraW5nRGF5cyAtICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzQmVmb3JlV2FybmluZwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtXYXJuaW5nfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgd29ya2luZyB1bml0cyBkYXRhCgogICAgbXkgJVdvcmtpbmdVbml0c0RhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0dldCgKICAgICAgICBZZWFyICAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoICA9PiAnNycsCiAgICAgICAgRGF5ICAgID0+ICcxMycsCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YSAgICAgICAgICA9ICgpOwogICAgbXkgJFdvcmtpbmdVbml0SUQgPSAwOwogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgICRQYXJhbXtVc2VySUR9IHx8PSAkU2VsZi0+e1VzZXJJRH07CgogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywgdGltZV9zdGFydCwgdGltZV9lbmQsIgogICAgICAgICAgICAuICIgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHRpbWVfc3RhcnQgTElLRSAnJERhdGUlJyIKICAgICAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyBPUkRFUiBieSBpZCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbNF0gPX4gL14oLis/KVxzKFxkKzpcZCspOihcZCspLyApIHsKICAgICAgICAgICAgJFdvcmtpbmdVbml0SUQrKzsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1VzZXJJRH0gICAgPSAkUm93WzBdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICRSb3dbMV07CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gID0gJFJvd1syXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gICAgPSAkUm93WzNdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9ICQyOwoKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSBkZWZpbmVkKCAkUm93WzZdICkgPyBzcHJpbnRmKCAiJS4yZiIsICRSb3dbNl0gKSA6IDA7CgogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RGF0ZX0gPSAkMTsKICAgICAgICAgICAgaWYgKCAkUm93WzVdID1+IC9eKC4rPylccyhcZCs6XGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gPSAkMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzSW5zZXJ0KCkKCmluc2VydCB3b3JraW5nIHVuaXRzIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzSW5zZXJ0KAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMDcnLAogICAgICAgIERheSAgID0+ICcwMicsCiAgICAgICAgMSAgICA9PiB7CiAgICAgICAgICAgIFByb2plY3RJRCA9PiAxLAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gMjMsCiAgICAgICAgICAgIFJlbWFyayAgICA9PiA0LAogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzc6MzAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzExOjAwJywKICAgICAgICAgICAgUGVyaW9kICAgID0+ICc4LjUnLAogICAgICAgIH0sCiAgICAgICAgMiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZGVsZXRlICRQYXJhbXtZZWFyfTsKICAgIGRlbGV0ZSAkUGFyYW17TW9udGh9OwogICAgZGVsZXRlICRQYXJhbXtEYXl9OwoKICAgICNpbnNlcnQgbmV3IHdvcmtpbmcgdW5pdHMKICAgIGZvciBteSAkV29ya2luZ1VuaXRJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgICMgZGIgcXVvdGUKICAgICAgICBmb3IgKCBrZXlzICV7ICRQYXJhbXskV29ya2luZ1VuaXRJRH0gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskV29ya2luZ1VuaXRJRH17JF99ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU3RhcnRUaW1lID0gJERhdGUgLiAiICIgLiAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX07CiAgICAgICAgbXkgJEVuZFRpbWUgICA9ICREYXRlIC4gIiAiIC4gJFBhcmFteyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfTsKCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhQcm9qZWN0SUQgQWN0aW9uSUQgUGVyaW9kKSkgewogICAgICAgICAgICAjICcnIGRvZXMgbm90IHdvcmsgaW4gaW50ZWdlciBmaWVsZCBvZiBwb3N0Z3JlcwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoICFkZWZpbmVkKCAkUGFyYW17JFdvcmtpbmdVbml0SUR9eyRFbGVtZW50fSApICkKICAgICAgICAgICAgICAgIHx8ICggJFBhcmFteyRXb3JraW5nVW5pdElEfXskRWxlbWVudH0gZXEgJycgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFdvcmtpbmdVbml0SUR9eyRFbGVtZW50fSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdGFibGUgKHVzZXJfaWQsIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcmVtYXJrLCIKICAgICAgICAgICAgLiAiIHRpbWVfc3RhcnQsIHRpbWVfZW5kLCBwZXJpb2QsIGNyZWF0ZWQgKSIKICAgICAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAgICAgLiAiICgnJFNlbGYtPntVc2VySUR9JywgJyRQYXJhbXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfScsICckUGFyYW17JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfScsIgogICAgICAgICAgICAuICIgJyRQYXJhbXskV29ya2luZ1VuaXRJRH17UmVtYXJrfScsICckU3RhcnRUaW1lJywgJyRFbmRUaW1lJywgJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9LCIKICAgICAgICAgICAgLiAiIGN1cnJlbnRfdGltZXN0YW1wKSI7CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzRGVsZXRlKCkKCmRlbGV0cyB3b3JraW5nIHVuaXRzIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsCiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICAjIGRlbGV0ZSBvbGQgd29ya2luZyB1bml0cwogICAgbXkgJFNRTCA9ICJERUxFVEUgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgIgogICAgICAgIC4gIldIRVJFIHRpbWVfc3RhcnQgPD0gJyREYXRlIDIzOjU5OjU5JyBBTkQgdGltZV9zdGFydCA+PSAnJERhdGUgMDA6MDA6MDAnICIKICAgICAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRTZWxmLT57VXNlcklEfSciOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RBY3Rpb25SZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaG91cnMgZGVwZW5kZW50IHByb2plY3QgYW5kIGFjdGlvbiBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgIFllYXIgID0+IDIwMDUsCiAgICAgICAgTW9udGggPT4gNywKICAgICAgICBVc2VySUQgPT4gMTIzLCAjIG9wdGlvbmFsOyBubyBVc2VySUQgbWVhbnMgJ29mIGFsbCB1c2VyJwogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgICAgID0gKCk7CiAgICBteSAkSURTZWxlY3QgPSAnJzsKICAgIGZvciAocXcoWWVhciBNb250aCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1VzZXJJRH0gKSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CgogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXRlU3RyaW5nID0gJFBhcmFte1llYXJ9IC4gIi0iIC4gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CgogICAgbXkgJFNRTF9RdWVyeV9UaW1lU3RhcnQgPSAidGltZV9zdGFydCA8PSAnJERhdGVTdHJpbmctMzEgMjM6NTk6NTknJElEU2VsZWN0IjsKCiAgICAjdHRvOiB5ZXMsIEkga25vdyB0aGVyZSBhcmUgc29tZSBub24tbGVhcC15ZWFycywgLi4uCiAgICAjLi4uYnV0IGNvbSdvbiB0aGVzZSBmZXcgZW50cmllcyBpbiB0aGUgZXJyb3IgbG9nIHdvbid0IGJvdGhlciB0b28gbXVjaC4uLiA6LSkKICAgIGlmICgKICAgICAgICAoICRQYXJhbXtNb250aH0gPT0gMiApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDQgKQogICAgICAgIHx8ICggJFBhcmFte01vbnRofSA9PSA2ICkKICAgICAgICB8fCAoICRQYXJhbXtNb250aH0gPT0gOSApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDExICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNRTF9RdWVyeV9UaW1lU3RhcnQgPSAidGltZV9zdGFydCA8PSAnJERhdGVTdHJpbmctMzAgMjM6NTk6NTknJElEU2VsZWN0IjsKICAgIH0KCiAgICAjIFRvdGFsIGhvdXJzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IGlmICEkUm93WzJdOwogICAgICAgICREYXRhe1RvdGFsfXsgJFJvd1swXSB9eyAkUm93WzFdIH17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCBwZXJpb2QgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUiCiAgICAgICAgICAgIC4gIiBXSEVSRSB0aW1lX3N0YXJ0ID49ICckRGF0ZVN0cmluZy0wMSAwMDowMDowMCcgQU5EICRTUUxfUXVlcnlfVGltZVN0YXJ0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgaWYgISRSb3dbMl07CiAgICAgICAgJERhdGF7UGVyTW9udGh9eyAkUm93WzBdIH17ICRSb3dbMV0gfXtIb3Vyc30gKz0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFByb2plY3RUb3RhbEhvdXJzKCkKCnJldHVybnMgdGhlIHRvdGFsIHN1bSBvZiBhbGwgaG91cnMgcmVsYXRlZCB0byBhIHByb2plY3QKCiAgICBteSAkUHJvamVjdFRvdGFsSG91cnMgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RUb3RhbEhvdXJzKAogICAgICAgIFByb2plY3RJRCAgPT4gMTUsCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RUb3RhbEhvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIGlmICggISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUHJvamVjdEFjdGlvblJlcG9ydGluZzogTmVlZCBQcm9qZWN0SUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGIgc2VsZWN0CiAgICBteSAkVG90YWwgPSAwOwogICAgbXkgJFNRTCAgPSAnU0VMRUNUIFNVTShwZXJpb2QpIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHByb2plY3RfaWQgPSA/JzsKICAgIG15ICRCaW5kID0gWyBcJFBhcmFte1Byb2plY3RJRH0gXTsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUb3RhbCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUb3RhbDsKfQoKPWl0ZW0gUHJvamVjdEhpc3RvcnkoKQoKcmV0dXJucyBhIGFycmF5IHdpdGggYWxsIFdvcmtpbmdVbml0cyByZWxhdGVkIHRvIGEgcHJvamVjdAoKICAgIG15IEBQcm9qZWN0SGlzdG9yeUFycmF5ID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0SGlzdG9yeSgKICAgICAgICBQcm9qZWN0SUQgID0+IDE1LAogICAgKTsKCmUuZy4gQFByb2plY3RIaXN0b3J5QXJyYXkgPSAoCiAgICAgICAgewogICAgICAgICAgICBJRCAgICAgICAgPT4gOTk5LAogICAgICAgICAgICBVc2VySUQgICAgPT4gMTUsCiAgICAgICAgICAgIFVzZXIgICAgICA9PiAnVG9tJywKICAgICAgICAgICAgQWN0aW9uSUQgID0+IDYsCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnbWlzYycsCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAncmVtYXJrJywKICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICc3OjAwJywKICAgICAgICAgICAgVGltZUVuZCAgID0+ICcxODowMCcsCiAgICAgICAgICAgIERhdGUgICAgICA9PiAnMjAwOC0xMC0zMScsICMgdGhlIGRhdGUgb2YgdGhlIHdvcmtpbmcgdW5pdAogICAgICAgICAgICBQZXJpb2QgICAgPT4gMTEsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAwOC0xMS0wMScsICMgdGhlIGluc2VydCB0aW1lIG9mIHRoZSB3b3JraW5nIHVuaXQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgSUQgICAgICAgID0+IDk5OSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDE2LAogICAgICAgICAgICBVc2VyICAgICAgPT4gJ01hbmUnLAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gNywKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdkZXZlbG9wbWVudCcsCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAncmVtYXJrJywKICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICc3OjAwJywKICAgICAgICAgICAgVGltZUVuZCAgID0+ICcxODowMCcsCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAxMSwKICAgICAgICAgICAgRGF0ZSAgICAgID0+ICcyMDA4LTExLTAzJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDA4LTExLTAzJywKICAgICAgICB9CiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RIaXN0b3J5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIGlmICggISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdQcm9qZWN0QWN0aW9uUmVwb3J0aW5nOiBOZWVkIFByb2plY3RJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIGFjdGlvbiBkYXRhIHRvIGdldCB0aGUgcmVhZGFibGUgbmFtZSBvZiB0aGUgYWN0aW9uCiAgICBteSAlQWN0aW9uRGF0YSA9ICRTZWxmLT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CgogICAgIyBkYiBzZWxlY3QKICAgIG15IEBEYXRhID0gKCk7CiAgICBteSAkU1FMICA9ICdTRUxFQ1QgaWQsIHVzZXJfaWQsIGFjdGlvbl9pZCwgcmVtYXJrLCB0aW1lX3N0YXJ0LCB0aW1lX2VuZCwgcGVyaW9kLCBjcmVhdGVkICcKICAgICAgICAuICcgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgcHJvamVjdF9pZCA9ID8nOwogICAgbXkgJEJpbmQgPSBbIFwkUGFyYW17UHJvamVjdElEfSBdOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRVc2VyUmVmID0gewogICAgICAgICAgICBJRCAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFVzZXIgICAgICA9PiAkU2hvd25Vc2Vyc3sgJFJvd1sxXSB9LAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gJFJvd1syXSwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICRBY3Rpb25EYXRheyAkUm93WzJdIH17QWN0aW9ufSwKICAgICAgICAgICAgUmVtYXJrICAgID0+ICRSb3dbM10gfHwgJycsCiAgICAgICAgICAgIFRpbWVTdGFydCA9PiAkUm93WzRdLAogICAgICAgICAgICBUaW1lRW5kICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgRGF0ZSAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1s3XSwKICAgICAgICB9OwogICAgICAgICRVc2VyUmVmLT57RGF0ZX0gPX4gc3soXGRcZFxkXGQtXGRcZC1cZFxkKSBccyAuKyB9eyQxfXNteDsKCiAgICAgICAgcHVzaCBARGF0YSwgJFVzZXJSZWY7CiAgICB9CgogICAgcmV0dXJuIEBEYXRhOwoKfQoKPWl0ZW0gTGFzdFByb2plY3RzT2ZVc2VyKCkKCnJldHVybnMgdGhlIGEgYXJyYXkgd2l0aCB0aGUgbGFzdCBwcm9qZWN0cyBvZiB0aGUgdXNlcgoKICAgIG15IEBMYXN0UHJvamVjdHMgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPkxhc3RQcm9qZWN0c09mVXNlcigpOwoKPWN1dAoKc3ViIExhc3RQcm9qZWN0c09mVXNlciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGIgc2VsZWN0CiAgICAjIEkgZG9uJ3QgdXNlIGRpc3RpbmN0IGJlY2F1c2Ugb2YgT1JERVIgQlkgcHJvYmxlbXMgb2YgcG9zdGdyZSBzcWwKICAgIG15ICVQcm9qZWN0cyA9ICgpOwogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHByb2plY3RfaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgdXNlcl9pZCA9ID8gQU5EIHByb2plY3RfaWQgPD4gLTEgT1JERVIgQlkgdGltZV9zdGFydCBERVNDJzsKICAgIG15ICRCaW5kID0gWyBcJFNlbGYtPntVc2VySUR9IF07CiAgICBteSAkTGltaXQgPSA0MDsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kLCBMaW1pdCA9PiAkTGltaXQgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIG15ICRDb3VudGVyID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICBpZiAoJENvdW50ZXIgPCA3KSB7CiAgICAgICAgICAgICRQcm9qZWN0c3sgJFJvd1swXSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGtleXMgJVByb2plY3RzOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI0ICQgJERhdGU6IDIwMDkvMDEvMjEgMTA6NDM6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS40MSAyMDA5LzAxLzIxIDEwOjQzOjE5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0gPSB7CiAgICAgICAgJXsgJFNlbGYtPntUcmFuc2xhdGlvbn0gfSwKCiAgICAgICAgIyBUZW1wbGF0ZTogQWdlbnRUaW1lQWNjb3VudGluZwogICAgICAgICdTZXR0aW5nJyAgICAgICAgICA9PiAnS29uZmlndXJhdGlvbicsCiAgICAgICAgJ1Byb2plY3Qgc2V0dGluZ3MnID0+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+ICdhdXRvcmlzaWVydGUg3GJlcnN0dW5kZW4nLAogICAgICAgICdPbiBvdmVydGltZSBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdPdmVydGltZSBsZWF2ZScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdUb3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdPdmVydmlldyBvZiAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnNpY2h0IC0gJywKICAgICAgICAnVGltZUFjY291bnRpbmcgb2YnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgdm9tJywKICAgICAgICAnU3VjY2Vzc2Z1bCBpbnNlcnQhJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VyZm9sZ3JlaWNoIGVpbmdlZvxndCEnLAogICAgICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0JyA9PiAnV29sbGVuIFNpZSBkaWVzZW4gRWludHJhZyB3aXJrbGljaCBs9nNjaGVuJywKICAgICAgICAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScgICAgICAgICAgICAgPT4gJ0thbm4gZGllIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGVpbmb8Z2VuIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgdGFzayEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIFTkdGlna2VpdCBmZWhsdCEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHByb2plY3QhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBQcm9qZWt0YW5nYWJlIGZlaGx0IScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyIHRoYW4gdGhlIGludGVydmFsIGJldHdlZW4gU3RhcnR0aW1lIGFuZCBFbmR0aW1lIScKICAgICAgICAgICAgPT4gJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgaXN0IGdy9t9lciBhbHMgZGVyIFplaXRyYXVtIHp3aXNjaGVuIEJlZ2lubiB1bmQgRW5kZSEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBTdGFydHRpbWUgaXMgb2xkZXIgdGhhbiBFbmR0aW1lIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gQmVnaW5uIGxpZWd0IG5hY2ggRW5kZSEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIChlcmdpYnQgc2ljaCBhdXMgU3RhcnQtIHVuZCBFbmR6ZWl0KSBpc3QgbmljaHQgYW5nZWdlYmVuIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFBlcmlvZCBpcyBub3QgZ2l2ZW4gZ2l2ZW4hJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciAoZXJnaWJ0IHNpY2ggYXVzIFN0YXJ0LSB1bmQgRW5kemVpdCkgaXN0IG5pY2h0IGFuZ2VnZWJlbiEnLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBzaWNrIGxlYXZlPycgPT4KICAgICAgICAgICAgJ1NpZSB3YXJlbiBrcmFuayB1bmQgaGFiZW4gZ2VhcmJlaXRldD8gV2lyIGJyYXVjaGVuIG1laHIgc29sY2hlIE1pdGFyYmVpdGVyLicsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHZhY2F0aW9uPycgPT4KICAgICAgICAgICAgJ1NpZSBoYXR0ZW4gVXJsYXViIHVuZCBoYWJlbiBnZWFyYmVpdGV0PyBXaXIgYnJhdWNoZW4gbWVociBzb2xjaGUgTWl0YXJiZWl0ZXIuJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gb3ZlcnRpbWUgbGVhdmU/JyA9PgogICAgICAgICAgICAnSGFiZW4gU2llIHfkaHJlbmQgZGVyINxiZXJzdHVuZGVuIGF1Y2ggZ2VhcmJlaXRldD8nLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBhIGRheSBoYXMgb25seSAyNCBob3VycyEnID0+ICdFaW4gVGFnIGhhdCBudXIgMjQgU3R1bmRlbiEnLAogICAgICAgICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJyAgICAgID0+ICdLYW5uIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGz2c2NoZW4hJywKICAgICAgICAnUGxlYXNlIGluc2VydCB5b3VyIHdvcmtpbmcgaG91cnMhJyA9PiAnQml0dGUgdHJhZ2VuIFNpZSBJaHJlIEFyYmVpdHN6ZWl0ZW4gZWluIScsCiAgICAgICAgJ1lvdSBoYXZlIHRvIGluc2VydCBhIHN0YXJ0IGFuZCBhbiBlbmQgdGltZSBvciBhIHBlcmlvZCcgPT4KICAgICAgICAgICAgJ1NpZSBt/HNzZW4gQmVnaW5uLSB1bmQgRW5kZXplaXQgb2RlciBkaWUgRGF1ZXIgYW5nZWJlbi4nLAogICAgICAgICdZb3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBjaGVja2JveCBlbGVtZW50IScgPT4gJ1NpZSBr9m5uZW4gbnVyIGVpbmUgQ2hlY2tib3ggbWFya2llcmVuIScsCiAgICAgICAgJ0VkaXQgdGltZSBhY2NvdW50aW5nIHByb2plY3Qgc2V0dGluZ3MnID0+CiAgICAgICAgICAgICdaZWl0ZXJmYXNzdW5nOiBCZWFyYmVpdHVuZyBkZXIgUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICdQcm9qZWN0IHNldHRpbmdzJyA9PiAnUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICdJZiB5b3Ugc2VsZWN0ICJNaXNjZWxsYW5lb3VzIChtaXNjKSIgdGhlIHRhc2ssIHBsZWFzZSBleHBsYWluIHRoaXMgaW4gdGhlIHJlbWFya3MgZmllbGQnID0+CiAgICAgICAgICAgICdXZW5uIFNpZSBhbHMgVOR0aWdrZWl0IFNvbnN0aWdlcyBhdXN35GhsZW4sIGdlYmVuIFNpZSBiaXR0ZSBlaW5lIEJlc2NocmVpYnVuZyB1bSBGZWxkIEFubWVya3VuZyBhbi4nLAogICAgICAgICdQbGVhc2UgYWRkIGEgcmVtYXJrIHdpdGggbW9yZSB0aGFuIDggY2hhcmFjdGVycyEnICAgICA9PiAnQml0dGUgZ2ViZW4gU2llIGVpbmUgQW5tZXJrdW5nIGVpbiBkaWUgbORuZ2VyIGFscyA4IFplaWNoZW4gaXN0IScsCgojIEZJWE1FIGFjdHVhbGx5IHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGZpbGUgZGUucG0sIGhvd2V2ZXIgdGhleSdyZSBub3Qgc28gSSBwdXQnZW0gaGVyZS4uLgogICAgICAgICdNb24nICAgICAgPT4gJ01vJywKICAgICAgICAnVHVlJyAgICAgID0+ICdEaScsCiAgICAgICAgJ1dlZCcgICAgICA9PiAnTWknLAogICAgICAgICdUaHUnICAgICAgPT4gJ0RvJywKICAgICAgICAnRnJpJyAgICAgID0+ICdGcicsCiAgICAgICAgJ1NhdCcgICAgICA9PiAnU2EnLAogICAgICAgICdTdW4nICAgICAgPT4gJ1NvJywKICAgICAgICAnSmFudWFyeScgID0+ICdKYW51YXInLAogICAgICAgICdGZWJydWFyeScgPT4gJ0ZlYnJ1YXInLAogICAgICAgICdNYXJjaCcgICAgPT4gJ03kcnonLAogICAgICAgICdNYXknICAgICAgPT4gJ01haScsCiAgICAgICAgJ0p1bmUnICAgICA9PiAnSnVuaScsCiAgICAgICAgJ0p1bHknICAgICA9PiAnSnVsaScsCiAgICAgICAgJ09jdG9iZXInICA9PiAnT2t0b2JlcicsCiAgICAgICAgJ0RlY2VtYmVyJyA9PiAnRGV6ZW1iZXInLAogICAgfTsKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS4yNyAyMDA5LzAxLzIxIDEwOjQzOjE5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWsgQWRkX0RlbHRhX1lNRCk7CnVzZSBUaW1lOjpMb2NhbDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjcgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IE1vZHVsZVJlZyBMb2dPYmplY3QgVXNlck9iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApIGlmICEkU2VsZi0+eyRffTsKICAgIH0KCiAgICAjIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzLi4uCiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIHJldHVybiAxIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKTsKCiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVXNlcnsgJFNlbGYtPntVc2VySUR9IH07CgogICAgbXkgJUluY29tcGxldGVXb3JraW5nRGF5cyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKCk7CgogICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgIGlmICgKICAgICAgICAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9CiAgICAgICAgJiYgJFNlbGYtPntBY3Rpb259IG5lICdBZ2VudFRpbWVBY2NvdW50aW5nJwogICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRDYWxlbmRhclNtYWxsJwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gJ0FjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJlN1YmFjdGlvbj1FZGl0JwogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAnJywgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgICAgICdBcHJpbCcsICAgJ01heScsCiAgICAgICAgJ0p1bmUnLCAnSnVseScsICAgICdBdWd1c3QnLCAgICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsCiAgICAgICAgJ0RlY2VtYmVyJywKICAgICk7CiAgICBteSBAV2Vla2RheUFycmF5ID0gKCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnLCAnU3VuJywgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBlZGl0IHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgKSB7CiAgICAgICAgbXkgJUZyb250ZW5kICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbkxpc3QgID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhTdGF0dXMgWWVhciBNb250aCBEYXkgRGVsZXRlKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gfHwgISRQYXJhbXtEYXl9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSAkRGF5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte1llYXJ9ICk7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte0RheX0gKTsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGluaXRpYWwgdXNlaW5nLCB0aGUgZmlyc3QgYWdlbnQgd2l0aCBydy1yaWdodCB3aWxsIGJlIHJlZGlyZWN0ZWQKICAgICAgICAjIHRvICdTZXR0aW5nJy4gVGhlbiBoZSBjYW4gZG8gdGhlIGluaXRpYWwgc2V0dGluZ3MKICAgICAgICBpZiAoICEkVXNlcnsgJFNlbGYtPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X0ZpcnN0VXNlclJlZGlyZWN0KCk7CiAgICAgICAgfQoKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKICAgICAgICBteSAkTWF4QWxsb3dlZEluc2VydERheXMKICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEFsbG93ZWRJbnNlcnREYXlzJykgfHwgJzEwJzsKICAgICAgICAoICRQYXJhbXtZZWFyQWxsb3dlZH0sICRQYXJhbXtNb250aEFsbG93ZWR9LCAkUGFyYW17RGF5QWxsb3dlZH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRZZWFyLCAkTW9udGgsICREYXksIDAsIDAsIC0kTWF4QWxsb3dlZEluc2VydERheXMgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgIHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgPCB0aW1lbG9jYWwoCiAgICAgICAgICAgICAgICAxLCAwLCAwLCAkUGFyYW17RGF5QWxsb3dlZH0sCiAgICAgICAgICAgICAgICAkUGFyYW17TW9udGhBbGxvd2VkfSAtIDEsCiAgICAgICAgICAgICAgICAkUGFyYW17WWVhckFsbG93ZWR9IC0gMTkwMAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyAkUGFyYW17WWVhcn0gfXsgJFBhcmFte01vbnRofSB9CiAgICAgICAgICAgICAgICB7ICRQYXJhbXtEYXl9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgLTEgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEgKTsKCiAgICAgICAgIyBFZGl0IFdvcmtpbmcgVW5pdHMKICAgICAgICBpZiAoICRQYXJhbXtTdGF0dXN9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtEZWxldGV9ICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRGVsZXRlJyApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRGVsZXRlJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRXb3JraW5nVW5pdElETGFzdCA9IDA7CgogICAgICAgICAgICAjIFJFTUFSSzogZG9uJ3QgbWFrZSAibXkgJFdvcmtpbmdVbml0SUQiIGluIGZvciBmdW5jdGlvbiB0aGUKICAgICAgICAgICAgIyB0aGUgdmFsdWUgaXMgbmVlZCBhZnRlciB0aGUgZm9yIGxvb3AKCiAgICAgICAgICAgIFdPUktJTkdVTklUSUQ6CiAgICAgICAgICAgIGZvciBteSAkV29ya2luZ1VuaXRJRCAoIDEuLjEwICkgewogICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0SURMYXN0ID0gICRXb3JraW5nVW5pdElEOwogICAgICAgICAgICAgICAgZm9yIChxdyhQcm9qZWN0SUQgQWN0aW9uSUQgUmVtYXJrIFN0YXJ0VGltZSBFbmRUaW1lIFBlcmlvZCkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAkXyAuICdbJyAuICRXb3JraW5nVW5pdElEIC4gJ10nCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IFdPUktJTkdVTklUSUQgaWYgISRQYXJhbXtQcm9qZWN0SUR9ICYmICEkUGFyYW17QWN0aW9uSUR9OwoKICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ID0gJFBhcmFte1Byb2plY3RJRH07CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICA9ICRQYXJhbXtBY3Rpb25JRH07CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICA9ICRQYXJhbXtSZW1hcmt9OwogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gPSAkUGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSAgID0gJFBhcmFte0VuZFRpbWV9OwogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0RhdGV9ICAgICAgPSAkUGFyYW17RGF0ZX07CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtQZXJpb2R9ID1+IC9eKFxkKyksKFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gJDEgLiAiLiIgLiAkMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gJFBhcmFte1BlcmlvZH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVJlZHVjZVRpbWUgPSAoKTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJVJlZHVjZVRpbWUgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlJlZHVjZVRpbWUnKSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNpZiAoJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICYmICEkUGFyYW17UGVyaW9kfSkgewogICAgICAgICAgICAgICAgI292ZXJ3cml0ZSBQZXJpb2Qgd2hlbiBTdGFydCBhbmQgRW5kdGltZSBpcyBnaXZlbi4uLgogICAgICAgICAgICAgICAgbmV4dCBXT1JLSU5HVU5JVElEIGlmICEkUGFyYW17U3RhcnRUaW1lfSB8fCAhJFBhcmFte0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFJlZHVjZVRpbWV7ICRBY3Rpb257ICRQYXJhbXtBY3Rpb25JRH0gfXtBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJFJlZHVjZVRpbWV7ICRBY3Rpb257ICRQYXJhbXtBY3Rpb25JRH0gfXtBY3Rpb259IH0gLyAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ2hlY2tib3hDaGVjayA9IDA7CiAgICAgICAgICAgIGZvciAocXcoTGVhdmVEYXkgU2ljayBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0SURMYXN0Kys7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SURMYXN0fXtQcm9qZWN0SUR9ID0gJy0xJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRExhc3R9e0FjdGlvbklEfSAgPSAkUGFyYW17JF99OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElETGFzdH17UmVtYXJrfSAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElETGFzdH17U3RhcnRUaW1lfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElETGFzdH17RW5kVGltZX0gICA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElETGFzdH17UGVyaW9kfSAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrYm94Q2hlY2srKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDaGVja2JveENoZWNrID4gMSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdZb3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBjaGVja2JveCBlbGVtZW50ISc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRhe1llYXJ9ICA9ICRQYXJhbXtZZWFyfTsKICAgICAgICAgICAgJERhdGF7TW9udGh9ID0gJFBhcmFte01vbnRofTsKICAgICAgICAgICAgJERhdGF7RGF5fSAgID0gJFBhcmFte0RheX07CgogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgV29ya2luZyBVbml0cyEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpJbnB1dEhvdXJzV2l0aG91dFN0YXJ0RW5kVGltZScpICkgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAnbGVmdCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0SW5wdXRQZXJpb2QnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAnZm9vdG5vdGUnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnKic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb290Tm90ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdyaWdodCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0UGVyaW9kV2l0aG91dElucHV0JzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ3JlcXVpcmVkJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhY3Rpb24gc2V0dGluZ3MKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICBpZiAoICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9ICkgewogICAgICAgICAgICAgICAgJEFjdGlvbkxpc3R7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRBY3Rpb25MaXN0eycnfSA9ICcnOwoKICAgICAgICBpZiAoIHRpbWUoKSA+IHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0QmxvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHVuaXRzCiAgICAgICAgbXkgJFdvcmtpbmdVbml0SURNYXggPSAxMDsKICAgICAgICBteSAkV29ya2luZ1VuaXRJRCAgICA9IDA7CiAgICAgICAgJFBhcmFte1RvdGFsfSA9IDA7CiAgICAgICAgZm9yICggJFdvcmtpbmdVbml0SUQgPSAxOyAkV29ya2luZ1VuaXRJRCA8ICRXb3JraW5nVW5pdElETWF4OyAkV29ya2luZ1VuaXRJRCsrICkgewogICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtTaWNrfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSA9PSAtMiApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXRJRE1heCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRXb3JraW5nVW5pdElEOwoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbiBmaWVsZHMKICAgICAgICAgICAgICAgICRGcm9udGVuZHtBY3Rpb25PcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJUFjdGlvbkxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiQWN0aW9uSURbJFdvcmtpbmdVbml0SURdIiwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7UHJvamVjdE9wdGlvbn0gPSAkU2VsZi0+X1Byb2plY3RMaXN0KAogICAgICAgICAgICAgICAgICAgIFdvcmtpbmdVbml0SUQgPT4gJFdvcmtpbmdVbml0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlbWFya30gPSAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSB8fCAnJzsKICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ID0gJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWx9ICs9ICRQYXJhbXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBQZXJpb2QgaXMgbm90IGdpdmVuIGdpdmVuISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFN0YXJ0dGltZSBpcyBvbGRlciB0aGFuIEVuZHRpbWUhJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSAgICA9ICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0VuZFRpbWV9ICAgPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17JF99IGVxICcwMDowMCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkRGF0YXskV29ya2luZ1VuaXRJRH17JF99OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte1BlcmlvZEJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17U2lja30KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHNpY2sgbGVhdmU/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17TGVhdmVEYXl9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiB2YWNhdGlvbj8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtPdmVydGltZX0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIG92ZXJ0aW1lIGxlYXZlPyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ICYmICEkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyB0YXNrISc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwcm9qZWN0ISc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICAgICAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSBuZSAnMDA6MDAnCiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9IG5lICcwMDowMCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9fiAvXihcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKCAkRW5kVGltZSAtICRTdGFydFRpbWUgKSAvIDYwICsgMC4wMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgdGhhbiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBTdGFydHRpbWUgYW5kIEVuZHRpbWUhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiA2MCAqIDI0IHx8ICRTdGFydFRpbWUgPiA2MCAqIDI0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvblRydWV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVhZG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIGVuZAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICA+IHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsfSApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHZhbGlkaXR5IGNoZWNrcyBzdGFydAogICAgICAgIGlmICggJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMjQgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbW9yZSB0aGFuIDI0IHdvcmtpbmcgaG91cnMhJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17VG90YWx9ICYmICRQYXJhbXtUb3RhbH0gPiAxNiApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIG1vcmUgdGhhbiAxNiBob3Vycz8nOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVhZG9ubHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3MgZW5kCgogICAgICAgICRQYXJhbXtEYXRlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAnJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXsgJFBhcmFte1llYXJ9IH17ICRQYXJhbXtNb250aH0gfXsgJFBhcmFte0RheX0gfQogICAgICAgICAgICAgICAgJiYgISRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIERhdGUgaXMgb3V0IG9mIGxpbWl0LCBidXQgeW91IGhhdmVuXCd0IGluc2VydCB0aGlzIGRheSB5ZXQsIHNvIHlvdSBnZXQgb25lKCEpIGNoYW5jZSB0byBpbnNlcnQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIG15ICRZZWFySUQgKCBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJE1vbnRoSUQgKCBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskWWVhcklEfSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICREYXlJRCAoCiAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFllYXJJRH17JE1vbnRoSUR9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0luY29tcGxldGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdJbmNvbXBsZXRlVGV4dCcsICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkU3RhcnQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkQm9sZEVuZCAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkWWVhcklEICAgICBlcSAkUGFyYW17WWVhcn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJE1vbnRoSUQgZXEgJFBhcmFte01vbnRofQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRGF5SUQgICBlcSAkUGFyYW17RGF5fQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZFN0YXJ0ID0gJzxiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkRW5kICAgPSAnPC9iPic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNvbXBsZXRlV29ya2luZ0RheXMnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICAgICA9PiAkWWVhcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggICAgID0+ICRNb250aElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgID0+ICREYXlJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRTdGFydCA9PiAkQm9sZFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZEVuZCAgID0+ICRCb2xkRW5kLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0luY29tcGxldGV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICAgID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICBDYWxlbmRhciA9PiAkVXNlckRhdGF7Q2FsZW5kYXJ9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSA9IERheV9vZl9XZWVrKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAgICAgaWYgKCAkUGFyYW17V2Vla2RheX0gIT0gNiAmJiAkUGFyYW17V2Vla2RheX0gIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdGhlclRpbWVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gLSAxIF07CgogICAgICAgICMgaW50ZWdyYXRlIHRoZSBoYW5kbGluZyBmb3IgcmVxdWlyZWQgcmVtYXJrcyBpbiByZWxhdGlvbiB0bwogICAgICAgICMgcHJvamVjdHMKICAgICAgICAkUGFyYW17UmVtYXJrUmVnRXhwfSA9ICRTZWxmLT5fUHJvamVjdDJSZW1hcmtSZWdFeHAoKTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdFZGl0JyApOwogICAgICAgIGlmICggISRJbmNvbXBsZXRlV29ya2luZ0RheXN7RW5mb3JjZUluc2VydH0gKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBjcmVhdGUgcHJvamVjdCBsaW5rLCBpZiBhbGxvd2VkCiAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7Q3JlYXRlUHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdDcmVhdGVQcm9qZWN0JywgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgJiYgISRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvblRydWV9CiAgICAgICAgICAgICYmICRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCBJbmZvID0+ICdTdWNjZXNzZnVsIGluc2VydCEnLCApOwogICAgICAgIH0KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRWRpdCcKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB2aWV3IG9sZGVyIGRheSBpbnN0ZXJ0cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdWaWV3JyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyIFVzZXJJRCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgICAgIGZvciAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAiVmlldzogTmVlZCAkXyIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBVc2VySUQgcG9zdGVkIHVzZSB0aGUgY3VycmVudCB1c2VyCiAgICAgICAgJFBhcmFte1VzZXJJRH0gfHw9ICRTZWxmLT57VXNlcklEfTsKCiAgICAgICAgIyBzaG93IHRoZSBuYW1pbmcgb2YgdGhlIGFnZW50IHdoaWNoIHRpbWUgYWNjb3VudGluZyBpcyB2aXNpdGVkCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICRQYXJhbXtVc2VyfSA9ICRTaG93blVzZXJzeyAkUGFyYW17VXNlcklEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXl9ICAgICAgICAgPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwogICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IC0gMSBdOwogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSAgID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgIyBWYWx1ZXMgZm9yIHRoZSBsaW5rIGljb25zIDw+CiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAtMSApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgMSApOwoKICAgICAgICAkUGFyYW17RGF0ZVNlbGVjdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgV29ya2luZyBVbml0cwogICAgICAgICMgZ2V0IGV4aXN0aW5nIHdvcmtpbmcgdW5pdHMKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0ZX0gPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgICAgICMgZ2V0IHByb2plY3QgYW5kIGFjdGlvbiBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJEZsYWcgICAgPSAwOwoKICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJElEICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCAkRGF0YXskSUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JElEfXtQcm9qZWN0SUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskSUR9e0FjdGlvbklEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17U2lja30gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICREYXRheyRJRH17QWN0aW9uSUR9ID09IC0yICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtMZWF2ZURheX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICREYXRheyRJRH17QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0IElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgd29ya2luZyB1bml0cwogICAgICAgICAgICBpZiAoICEkRmxhZyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1VuaXRCbG9jaycsICk7CiAgICAgICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFByb2plY3QgICA9PiAkUHJvamVjdHtQcm9qZWN0fXsgJERhdGF7JElEfXtQcm9qZWN0SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICRBY3Rpb257ICREYXRheyRJRH17QWN0aW9uSUR9IH17QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBSZW1hcmsgICAgPT4gJERhdGF7JElEfXtSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkRGF0YXskSUR9e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICREYXRheyRJRH17RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgUGVyaW9kICAgID0+ICREYXRheyRJRH17UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17VG90YWx9ICs9ICREYXRheyRJRH17UGVyaW9kfTsKICAgICAgICB9CiAgICAgICAgaWYgKCRGbGFnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVG90YWwgPT4gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWx9ICkgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtTaWNrfSB8fCAkUGFyYW17TGVhdmVEYXl9IHx8ICRQYXJhbXtPdmVydGltZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdGhlclRpbWVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNpY2sgICAgID0+ICRQYXJhbXtTaWNrfSwKICAgICAgICAgICAgICAgICAgICBMZWF2ZURheSA9PiAkUGFyYW17TGVhdmVEYXl9LAogICAgICAgICAgICAgICAgICAgIE92ZXJ0aW1lID0+ICRQYXJhbXtPdmVydGltZX0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkVmFjYXRpb24gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICAgID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICBDYWxlbmRhciA9PiAkVXNlckRhdGF7Q2FsZW5kYXJ9LAogICAgICAgICk7CgogICAgICAgIGlmICgkVmFjYXRpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZhY2F0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBWYWNhdGlvbiA9PiAkVmFjYXRpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlc2VudGF0aW9uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnVmlldycgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdWaWV3JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBvYmplY3QgZnJvbSBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgewogICAgICAgIGZvciAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249RWRpdCZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3IGFib3V0IHRoZSB1c2VycyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnT3ZlcnZpZXcnICkgewogICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgIGZvciAocXcoU3RhdHVzIERheSBNb250aCBZZWFyIFVzZXJJRCBQcm9qZWN0U3RhdHVzU2hvdykpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnRWRpdCc7CgogICAgICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICYmICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtTdWJhY3Rpb259ID0gJ1ZpZXcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICRQYXJhbXtVc2VyfSA9ICRTaG93blVzZXJzeyAkUGFyYW17VXNlcklEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAxLCAwICk7CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIGRheQogICAgICAgIG15ICREYXlzT2ZNb250aCA9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwoKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRGF5ICggMS4uJERheXNPZk1vbnRoICkgewogICAgICAgICAgICAkUGFyYW17RGF5fSA9IHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkRGF5ICkgLSAxOwogICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRVc2VyRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtZZWFyfSBlcSAkWWVhciAmJiAkUGFyYW17TW9udGh9IGVxICRNb250aCAmJiAkQ3VycmVudERheSBlcSAkRGF5ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSJvcmFuZ2UiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gICA9ICdiZ2NvbG9yPSIjRUJDQ0NDIic7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkVmFjYXRpb25DaGVjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXZWVrZGF5fSA9PSA2IHx8ICRQYXJhbXtXZWVrZGF5fSA9PSA1ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRkZFMEUwIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ID0gJ2JnY29sb3I9IiNFNUYwRkYiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFdvcmtpbmdIb3VycyA9IDA7CiAgICAgICAgICAgIG15ICVPdGhlclRpbWUgICAgPSAoKTsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTEnfSA9ICdTaWNrIGxlYXZlJzsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTInfSA9ICdWYWNhdGlvbic7CiAgICAgICAgICAgICRPdGhlclRpbWV7Jy0zJ30gPSAnT3ZlcnRpbWUgbGVhdmUnOwogICAgICAgICAgICBmb3IgbXkgJElEICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgICAgICRXb3JraW5nSG91cnMgKz0gJERhdGF7JElEfXtQZXJpb2R9OwogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskSUR9e1Byb2plY3RJRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJE90aGVyVGltZXsgJERhdGF7JElEfXtBY3Rpb25JRH0gfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte1dvcmtpbmdIb3Vyc30gPSAkV29ya2luZ0hvdXJzID8gc3ByaW50ZiggIiUuMmYiLCAkV29ya2luZ0hvdXJzICkgOiAnJzsKCiAgICAgICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IF07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclJlcG9ydCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUYXJnZXRTdGF0ZSBUYXJnZXRTdGF0ZVRvdGFsIFdvcmtpbmdIb3Vyc1RvdGFsIFdvcmtpbmdIb3VycwogICAgICAgICAgICBPdmVydGltZSBPdmVydGltZVRvdGFsIE92ZXJ0aW1lVW50aWwgTGVhdmVEYXkgTGVhdmVEYXlUb3RhbAogICAgICAgICAgICBMZWF2ZURheVJlbWFpbmluZyBTaWNrIFNpY2tUb3RhbCBTaWNrUmVtYWluaW5nKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVXNlclJlcG9ydHsgJFBhcmFte1VzZXJJRH0gfXskX30gfHw9IDA7CiAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmKCAiJS4yZiIsICRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVXNlckRhdGF7U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ0aW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBPdmVydmlldyBwZXIgcHJvamVjdCBhbmQgYWN0aW9uCiAgICAgICAgbXkgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSByZXBvcnQgc29ydCBieSBwcm9qZWN0cwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKICAgICAgICBQUk9KRUNUSUQ6CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgISRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH07CiAgICAgICAgICAgIG5leHQgUFJPSkVDVElEIGlmICRQcm9qZWN0SUQgZXEgJy0xJzsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICcnOwogICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gID0gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gPyAnJyA6ICdwYXNzaXYnOwoKICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICBteSAkVG90YWxUb3RhbCA9IDA7CgogICAgICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICYmICRQYXJhbXtTdGF0dXN9OwoKICAgICAgICAgICAgIyBhY3Rpb24gc29ydCB3cmFwcGVyIC0gYmUgY2FyZWZ1bCBpdHMgbm90IHNpbXVsYXIgd2l0aCBwcm9qZWN0ISEKICAgICAgICAgICAgbXkgJVNvcnRlZEFjdGlvbnMgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXsgJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgJFNvcnRlZEFjdGlvbnN7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsgJFNvcnRlZEFjdGlvbnN7JGF9IGNtcCAkU29ydGVkQWN0aW9uc3skYn0gfQogICAgICAgICAgICAgICAga2V5cyAlU29ydGVkQWN0aW9ucwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9ufSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7UGVyTW9udGh9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlLjJmIiwKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVG90YWwgICAgICArPSAkUGFyYW17SG91cnN9OwogICAgICAgICAgICAgICAgJFRvdGFsVG90YWwgKz0gJFBhcmFte0hvdXJzVG90YWx9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gICAgICAgICAgICA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtDcmVhdGVQcm9qZWN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGVyc29ucyBob3cgYXJlIGFsbG93ZWQgdG8gc2VlIHRoZSBjcmVhdGUgb2JqZWN0IGxpbmsgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsb3dlZCB0byBzZWUgdGhlIHByb2plY3QgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFBhcmFte1Byb2plY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUHJvamVjdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0Tm9MaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBQcm9qZWN0ID0+ICRQYXJhbXtQcm9qZWN0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgPSAnY29udGVudGtleSc7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICdUb3RhbCc7CiAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsICk7CiAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsVG90YWwgKTsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSA9ICcnOwogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzfSApICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJPdmVydmlldyIgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdPdmVydmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnICkgewogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICA9ICgpOwoKICAgICAgICBmb3IgKHF3KEFjdGlvbkFjdGlvbiBBY3Rpb25Vc2VyIE5ld0FjdGlvbiBOZXdVc2VyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUnd9OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdTZXR0aW5nJywgKTsKCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TZXR0aW5nIiwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25BY3Rpb259IHx8ICRQYXJhbXtOZXdBY3Rpb259ICkgewogICAgICAgICAgICBteSAlQWN0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CiAgICAgICAgICAgIG15ICVBY3Rpb25DaGVjayA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhBY3Rpb24gQWN0aW9uU3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRBY3Rpb25JRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRBY3Rpb25JRCAuICddJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7JEFjdGlvbklEfXtBY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgICRBY3Rpb25FbXB0eSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRheyRBY3Rpb25JRH17QWN0aW9ufQogICAgICAgICAgICAgICAgICAgICYmICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0KICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9ID09IDEKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1RoZSBhY3Rpb25uYW1pbmcgbXVzdCBiZSB1bmlxdWUhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEFjdGlvbkNoZWNreyAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgYWN0aW9uIGRhdGEhJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtOZXdBY3Rpb259ICYmICEkQWN0aW9uRW1wdHkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NJbnNlcnQoKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBhY3Rpb24gZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzR2V0KCk7CgogICAgICAgICAgICBteSAlTGFzdFBlcmlvZCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXIgKSB7CiAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIGtleXMgJXsgJFVzZXJ7JFVzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMYXN0UGVyaW9keyRVc2VySUR9IDwgJFBlcmlvZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiTmV3VXNlclNldHRpbmdbJHtVc2VySUR9XSIgKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlSW5zZXJ0RGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICRJbnNlcnREYXRhe1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICRJbnNlcnREYXRhe1BlcmlvZH0gPSAkTGFzdFBlcmlvZHskVXNlcklEfSArIDE7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvblVzZXJ9ICA9ICd0cnVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVJbnNlcnREYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25Vc2VyfSB8fCAkUGFyYW17TmV3VXNlcn0gKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckxpc3QoKTsKCiAgICAgICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXIgKSB7CgogICAgICAgICAgICAgICAgICAgIGZvciAocXcoIFNob3dPdmVydGltZSBDcmVhdGVQcm9qZWN0IENhbGVuZGFyICkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ10nICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkQnJlYWsgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyQmFzaWNzeyRVc2VySUR9e0Rlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXNjcmlwdGlvblsnIC4gJFVzZXJJRCAuICddJyApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCcmVhayA9ICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkRGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJEZXNjcmlwdGlvblske1VzZXJJRH1dIiApOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0gLiAkQnJlYWsgLiAkRGVzY3JpcHRpb247CgogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugb2YgZGVhY3RpdmF0ZSB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRTZWxmLT57UGFyYW1PYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGF0ZVN0YXJ0WycgLiAkVXNlcklEIC4gJ11bJyAuICRQZXJpb2QgLiAnXScgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhXZWVrbHlIb3VycyBMZWF2ZURheXMgVXNlclN0YXR1cyBEYXRlU3RhcnQgRGF0ZUVuZCBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9eyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAkXyAuICdbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3VXNlcn0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApICkgewoKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1VzZXJJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7UGVyaW9kfSA9ICcxJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGZvciAoIGtleXMgJUdyb3VwcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR3JvdXBzeyRffSBlcSAndGltZV9hY2NvdW50aW5nJyAmJiAhJEdyb3VwRGF0YXskX30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3ICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKAogICAgICAgICAgICAxID0+ICd2YWxpZCcsCiAgICAgICAgICAgIDAgPT4gJ2ludmFsaWQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBhY3Rpb24gZGF0YQogICAgICAgIG15ICVBY3Rpb24gPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwogICAgICAgIG15ICVTb3J0QWN0aW9uICA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgICRTb3J0QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIHNvcnQgeyAkU29ydEFjdGlvbnskYX0gY21wICRTb3J0QWN0aW9ueyRifSB9IGtleXMgJVNvcnRBY3Rpb24gKSB7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbklEfSA9ICRBY3Rpb25JRDsKCiAgICAgICAgICAgICRGcm9udGVuZHtTdGF0dXNPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9uU3RhdHVzfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIkFjdGlvblN0YXR1c1skUGFyYW17QWN0aW9uSUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyICAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJMaXN0KCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKCiAgICAgICAgIyBmaWxsIHVwIHRoZSBjYWxlbmRhciBsaXN0CiAgICAgICAgbXkgJENhbGVuZGFyTGlzdFJlZiA9IHsgMCA9PiAnRGVmYXVsdCcgfTsKICAgICAgICBmb3IgbXkgJENhbGVuZGFyICggMSAuLiA5ICkgewogICAgICAgICAgICBteSAkQ2FsZW5kYXJOYW1lID0gIlRpbWVab25lOjpDYWxlbmRhciR7Q2FsZW5kYXJ9TmFtZSI7CiAgICAgICAgICAgICRDYWxlbmRhckxpc3RSZWYtPnskQ2FsZW5kYXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJENhbGVuZGFyTmFtZSk7CiAgICAgICAgfQoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJ7JFVzZXJJRH07CgogICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgIG15ICRVc2VyUmVmICAgICAgID0gJFVzZXJ7JFVzZXJJRH07CiAgICAgICAgICAgIG15ICRVc2VyQmFzaWNzUmVmID0gJFVzZXJCYXNpY3N7JFVzZXJJRH07CgogICAgICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVXNlckJhc2ljc1JlZi0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICREZXNjcmlwdGlvbiA/ICREZXNjcmlwdGlvbiAuICc8YnI+JyA6ICcnOwoKICAgICAgICAgICAgbXkgJENhbGVuZGFyT3B0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDYWxlbmRhckxpc3RSZWYsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiQ2FsZW5kYXJbJFVzZXJJRF0iLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRVc2VyQmFzaWNzUmVmLT57Q2FsZW5kYXJ9IHx8IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVGcm9udGVuZCwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgU2hvd092ZXJ0aW1lICAgPT4gJFVzZXJCYXNpY3NSZWYtPntTaG93T3ZlcnRpbWV9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCAgPT4gJFVzZXJCYXNpY3NSZWYtPntDcmVhdGVQcm9qZWN0fSA/ICdjaGVja2VkJyA6ICcnLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFyT3B0aW9uID0+ICRDYWxlbmRhck9wdGlvbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBkZWxldGUgJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICggc29ydCBrZXlzICV7JFVzZXJSZWZ9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRVc2VyUmVmLT57JFBlcmlvZH17V2Vla2x5SG91cnN9OwogICAgICAgICAgICAgICAgJFBhcmFte0xlYXZlRGF5c30gICA9ICRVc2VyUmVmLT57JFBlcmlvZH17TGVhdmVEYXlzfTsKICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gICAgPSAkVXNlclJlZi0+eyRQZXJpb2R9e092ZXJ0aW1lfTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RhcnR9ICAgPSAkVXNlclJlZi0+eyRQZXJpb2R9e0RhdGVTdGFydH07CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZUVuZH0gICAgID0gJFVzZXJSZWYtPnskUGVyaW9kfXtEYXRlRW5kfTsKICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ICAgICAgPSAkUGVyaW9kOwoKICAgICAgICAgICAgICAgICRGcm9udGVuZHtTdGF0dXNPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRVc2VyUmVmLT57JFBlcmlvZH17VXNlclN0YXR1c30gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiVXNlclN0YXR1c1skVXNlcklEXVskUGVyaW9kXSIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGVyaW9kJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBpZiAoJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7Jyd9ID0gJyc7CiAgICAgICAgICAgICRGcm9udGVuZHtOZXdVc2VyT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05ld1VzZXJPcHRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1NldHRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RTZXR0aW5nJyApIHsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICBteSAlUHJvamVjdCAgPSAoKTsKICAgICAgICBteSAlRGF0YSAgICAgPSAoKTsKCiAgICAgICAgZm9yIChxdyhBY3Rpb25Qcm9qZWN0IE5ld1Byb2plY3QpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Byb2plY3RTZXR0aW5nJywgKTsKCiAgICAgICAgIyBFZGl0IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uUHJvamVjdH0gfHwgJFBhcmFte05ld1Byb2plY3R9ICkgewogICAgICAgICAgICAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgICAgIG15ICVQcm9qZWN0Q2hlY2sgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKHF3KFByb2plY3QgUHJvamVjdFN0YXR1cyBQcm9qZWN0RGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFByb2plY3RJRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRQcm9qZWN0SUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9CiAgICAgICAgICAgICAgICAgICAgJiYgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfQogICAgICAgICAgICAgICAgICAgICYmICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0gPT0gMQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnVGhlIHByb2plY3RuYW1pbmcgbXVzdCBiZSB1bmlxdWUhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIHByb2plY3QgZGF0YSEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte05ld1Byb2plY3R9ICYmICEkUHJvamVjdEVtcHR5ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0luc2VydCgpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHByb2plY3QgZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgbXkgJVN0YXR1c0xpc3QgPSAoCiAgICAgICAgICAgIDEgPT4gJ3ZhbGlkJywKICAgICAgICAgICAgMCA9PiAnaW52YWxpZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBTaG93IHByb2plY3QgZGF0YQogICAgICAgICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRQcm9qZWN0RW1wdHkgPSAwOwogICAgICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICAgICAgc29ydCB7ICRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gICAgICAgICAgICA9ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSA9ICRQcm9qZWN0e1Byb2plY3REZXNjcmlwdGlvbn17JFByb2plY3RJRH07CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0SUR9ICAgICAgICAgID0gJFByb2plY3RJRDsKCiAgICAgICAgICAgICRGcm9udGVuZHtTdGF0dXNPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlByb2plY3RTdGF0dXNbJFBhcmFte1Byb2plY3RJRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZXR0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXBvcnRpbmcnICkgewogICAgICAgIG15ICVGcm9udGVuZCAgID0gKCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDAgKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUnd9OwoKICAgICAgICBmb3IgKHF3KFN0YXR1cyBNb250aCBZZWFyIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICBteSAlTW9udGggPSAoKTsKICAgICAgICBmb3IgbXkgJElEICggMS4uMTIgKSB7CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1ZhbHVlfSAgICA9ICRNb250aEFycmF5WyRJRF07CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1Bvc2l0aW9ufSA9ICRJRDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17TW9udGh9ID09ICRJRCApIHsKICAgICAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1NlbGVjdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRGcm9udGVuZHtNb250aE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIERhdGEgPT4gXCVNb250aCwKICAgICAgICAgICAgTmFtZSA9PiAnTW9udGgnLAogICAgICAgICk7CgogICAgICAgIG15ICVZZWFyID0gKCk7CgogICAgICAgICMgRklYTUUgdGhlIHJhbmdlIHNob3VsZCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkKICAgICAgICAjIEZ1cnRoZXIsIGhlcmUgSSBjYW4gdXNlIHRoZSBtYXAgZnVuY3Rpb24KICAgICAgICBmb3IgbXkgJElEICggMjAwNS4uJFllYXIgKSB7CiAgICAgICAgICAgICRZZWFyeyRJRH0gPSAkSUQ7CiAgICAgICAgfQoKICAgICAgICAkRnJvbnRlbmR7WWVhck9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVllYXIsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtZZWFyfSB8fCAnJywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1llYXInLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAtMSwgMCApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAxLCAwICk7CgogICAgICAgIG15ICVVc2VyUmVwb3J0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckxpc3QoKTsKCiAgICAgICAgVVNFUklEOgogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyUmVwb3J0eyRVc2VySUR9OwoKICAgICAgICAgICAgZm9yIChxdyhMZWF2ZURheSBPdmVydGltZSBXb3JraW5nSG91cnMgU2ljayBMZWF2ZURheVJlbWFpbmluZyBPdmVydGltZVRvdGFsKSkgewogICAgICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFVzZXJSZXBvcnR7JFVzZXJJRH17JF99ICk7CiAgICAgICAgICAgICAgICAkUGFyYW17ICdUb3RhbCcgLiAkXyB9ICs9ICRQYXJhbXskX307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2hvdyBPdmVydGltZSBpZiBhbGxvd2VkCiAgICAgICAgICAgIGlmICggISRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZVRvdGFsfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yICgKICAgICAgICAgICAgcXcoVG90YWxMZWF2ZURheSBUb3RhbE92ZXJ0aW1lIFRvdGFsV29ya2luZ0hvdXJzCiAgICAgICAgICAgIFRvdGFsU2ljayBUb3RhbExlYXZlRGF5UmVtYWluaW5nIFRvdGFsT3ZlcnRpbWVUb3RhbCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFteyRffSApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSByZXBvcnQgc29ydCBieSBwcm9qZWN0cwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICk7CgogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CgogICAgICAgIFBST0pFQ1RJRDoKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAhJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfTsKICAgICAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgJFByb2plY3RJRCBlcSAnLTEnOwoKICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJyc7CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICA9ICdjb250ZW50dmFsdWUnOwogICAgICAgICAgICAkUGFyYW17U3RhdHVzfSAgPSAhJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gPyAncGFzc2l2JyA6ICcnOwoKICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICBteSAkVG90YWxUb3RhbCA9IDA7CgogICAgICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICYmICRQYXJhbXtTdGF0dXN9OwoKICAgICAgICAgICAgIyBhY3Rpb24gc29ydCB3cmFwcGVyIC0gYmUgY2FyZWZ1bCBpdHMgbm90IHNpbXVsYXIgd2l0aCBwcm9qZWN0ISEKICAgICAgICAgICAgbXkgJVNvcnRlZEFjdGlvbnMgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXsgJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgJFNvcnRlZEFjdGlvbnN7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsgJFNvcnRlZEFjdGlvbnN7JGF9IGNtcCAkU29ydGVkQWN0aW9uc3skYn0gfQogICAgICAgICAgICAgICAga2V5cyAlU29ydGVkQWN0aW9ucwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJS4yZiIsCiAgICAgICAgICAgICAgICAgICAgJFByb2plY3REYXRhe1Blck1vbnRofXskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSB8fCAwCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJS4yZiIsCiAgICAgICAgICAgICAgICAgICAgJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSB8fCAwCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWwgKTsKICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgfHw9IDA7CiAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gfHw9IDA7CgogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc30gKTsKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnUmVwb3J0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1JlcG9ydGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcHJvamVjdCByZXBvcnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFJlcG9ydGluZycgKSB7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcm9qZWN0SUQnICk7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdQcm9qZWN0UmVwb3J0aW5nOiBOZWVkIFByb2plY3RJRCcgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3R7UHJvamVjdH17ICRQYXJhbXtQcm9qZWN0SUR9IH07CgogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CgogICAgICAgICMgbmVjYXNzYXJ5IGJlY2F1c2UgdGhlIFByb2plY3RBY3Rpb25SZXBvcnRpbmcgaXMgbm90IHJld29ya2VkCiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgbXkgJVByb2plY3REYXRhID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RUaW1lID0gKCk7CgogICAgICAgICMgT25seSBvbmUgZnVuY3Rpb24gc2hvdWxkIGJlIGVub3VnaAogICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlU2hvd25Vc2VycyApIHsKCiAgICAgICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgICAgICAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUHJvamVjdERhdGF7VG90YWx9eyAkUGFyYW17UHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXsgJFByb2plY3REYXRhe1RvdGFsfXsgJFBhcmFte1Byb2plY3RJRH0gfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFByb2plY3REYXRhe1RvdGFsfXsgJFBhcmFte1Byb2plY3RJRH0gfXskQWN0aW9uSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIGhlYWRlcmxpbmUKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyTmFtZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVXNlciA9PiAkU2hvd25Vc2Vyc3skVXNlcklEfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBiZXR0ZXIgc29sdXRpb24gZm9yIHNvcnQgYWN0aW9ucyBuZWNlc3NhcnkKICAgICAgICBteSAlTmV3QWN0aW9uID0gKCk7CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJVByb2plY3RUaW1lICkgewogICAgICAgICAgICAkTmV3QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgJUFjdGlvbiA9ICVOZXdBY3Rpb247CgogICAgICAgICMgc2hvdyB0aGUgcmVzdWx0cwogICAgICAgIG15ICVUb3RhbCA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJEFjdGlvbnskYX0gY21wICRBY3Rpb257JGJ9IH0ga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICBteSAkVG90YWxIb3VycyA9IDA7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEFjdGlvbiA9PiAkQWN0aW9ueyRBY3Rpb25JRH0sIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgICRUb3RhbEhvdXJzICAgICArPSAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMDsKICAgICAgICAgICAgICAgICRUb3RhbHskVXNlcklEfSArPSAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMDsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhvdXJzID0+IHNwcmludGYoICIlLjJmIiwgJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9IHx8IDAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUb3RhbAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgSG91cnMgPT4gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxIb3VycyApLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17VG90YWxBbGx9ID0gMDsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEFsbH0gKz0gJFRvdGFseyRVc2VySUR9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlclRvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUb3RhbCA9PiBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbHskVXNlcklEfSApLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsQWxsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsQWxsfSApOwoKICAgICAgICBteSBAUHJvamVjdEhpc3RvcnlBcnJheSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0SGlzdG9yeSgKICAgICAgICAgICAgUHJvamVjdElEICA9PiAkUGFyYW17UHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkUm93IChAUHJvamVjdEhpc3RvcnlBcnJheSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgICA9PiAkUm93LT57VXNlcn0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICRSb3ctPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFJlbWFyayA9PiAkUm93LT57UmVtYXJrfSB8fCAnLS0nLAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9PiAkUm93LT57UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICBEYXRlICAgPT4gJFJvdy0+e0RhdGV9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSB0b3RhbCBzdW0gb2YgaG91cnMgYXQgdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsaXN0CiAgICAgICAgIyBJIGFsc28gY2FuIHVzZSAkUGFyYW17VG90YWxBbGx9CiAgICAgICAgbXkgJFByb2plY3RUb3RhbEhvdXJzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RUb3RhbEhvdXJzKAogICAgICAgICAgICBQcm9qZWN0SUQgID0+ICRQYXJhbXtQcm9qZWN0SUR9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hpc3RvcnlUb3RhbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSGlzdG9yeVRvdGFsID0+ICRQcm9qZWN0VG90YWxIb3VycyB8fCAwLAogICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdQcm9qZWN0UmVwb3J0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1Byb2plY3RSZXBvcnRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyBlcnJvciBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnSW52YWxpZCBTdWJhY3Rpb24gcHJvY2VzcyEnICk7Cn0KCnN1YiBfRmlyc3RVc2VyUmVkaXJlY3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGZvciBpbml0aWFsIHVzZWluZywgdGhlIGZpcnN0IGFnZW50IHdpdGggcnctcmlnaHQgd2lsbCBiZSByZWRpcmVjdGVkCiAgICAjIHRvICdTZXR0aW5nJy4gVGhlbiBoZSBjYW4gZG8gdGhlIGluaXRpYWwgc2V0dGluZ3MKCiAgICBteSAlR3JvdXBMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwogICAgZm9yICgga2V5cyAlR3JvdXBMaXN0ICkgewogICAgICAgIGlmICggJEdyb3VwTGlzdHskX30gZXEgJ3RpbWVfYWNjb3VudGluZycgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJiIgLiAiU3ViYWN0aW9uPVNldHRpbmciCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAiTm8gVXNlclBlcmlvZCBhdmFpbGFibGUsIHBsZWFzZSBjb250YWN0IHRoZSB0aW1lIGFjY291bnRpbmcgYWRtaW4gdG8gaW5zZXJ0IHlvdXIgVXNlclBlcmlvZCEiCiAgICApOwp9CgpzdWIgX1Byb2plY3RMaXN0IHsKICAgIG15ICgkU2VsZiwgJVBhcmFtKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICBpZiAoICEkUGFyYW17V29ya2luZ1VuaXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnX1Byb2plY3RMaXN0OiBOZWVkIFdvcmtpbmdVbml0SUQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBhdCBmaXJzdCBhIGVtcHR5IGxpbmUKICAgIG15IEBMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJycsCiAgICAgICAgICAgIFZhbHVlID0+ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IHByb2plY3Qgc2V0dGluZ3MKICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgKICAgICAgICBTdGF0dXMgPT4gJ3ZhbGlkJywKICAgICk7CgogICAgIyBnZXQgdGhlIGxhc3QgcHJvamVjdHMKICAgIG15IEBMYXN0UHJvamVjdHMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+TGFzdFByb2plY3RzT2ZVc2VyKCk7CgogICAgIyBhZGQgdGhlIGZhdm9yaXRzCiAgICBteSAlTGFzdCA9IG1hcCB7JF8gPT4gMX0gQExhc3RQcm9qZWN0czsKCiAgICBQUk9KRUNUSUQ6CiAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgc29ydCB7ICRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9IH0KICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgISRMYXN0eyRQcm9qZWN0SUR9OwogICAgICAgIG15ICVIYXNoID0gKAogICAgICAgICAgICBLZXkgPT4gICAkUHJvamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIHB1c2ggQExpc3QsIFwlSGFzaDsKCiAgICAgICAgIyBhdCB0aGUgbW9tZW50IGl0IGlzIG5vdCBwb3NzaWxiZSBtYXJrIHRoZSBzZWxlY3RlZCBwcm9qZWN0CiAgICAgICAgIyBpbiB0aGUgZmF2b3JpdCBsaXN0IChJIHRoaW5rIGEgYnVnIGluIEJ1aWxkIHNlbGVjdGlvbj8hKQogICAgfQoKICAgICMgYWRkIHRoZSBzZXBlcmF0b3IKICAgIHB1c2ggQExpc3QsIHsKICAgICAgICBLZXkgICAgICA9PiAnMCcsCiAgICAgICAgVmFsdWUgICAgPT4gJy0tLS0tLS0tLS0tLS0tLS0tLS0tJywKICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgfTsKCiAgICAjIGFkZCBhbGwgYWxsb3dlZCBwcm9qZWN0cyB0byB0aGUgbGlzdAogICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICVIYXNoID0gKAogICAgICAgICAgICBLZXkgPT4gICAkUHJvamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkSUR9ICYmICRQYXJhbXtTZWxlY3RlZElEfSBlcSAkUHJvamVjdElEKSB7CiAgICAgICAgICAgICRIYXNoe1NlbGVjdGVkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBMaXN0LCBcJUhhc2g7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXEBMaXN0LAogICAgICAgIE5hbWUgICAgICAgID0+ICJQcm9qZWN0SURbJFBhcmFte1dvcmtpbmdVbml0SUR9XSIsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICBNYXggICAgICAgICA9PiA2MCwKICAgICk7Cgp9CgojIGludGVncmF0ZSB0aGUgaGFuZGxpbmcgZm9yIHJlcXVpcmVkIHJlbWFya3MgaW4gcmVsYXRpb24gdG8gcHJvamVjdHMKCnN1YiBfUHJvamVjdDJSZW1hcmtSZWdFeHAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSBAUHJvamVjdHMyUmVtYXJrID0gKCk7CiAgICBteSAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnLAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UHJvamVjdDJSZW1hcmtSZWdFeHAnKTsKCiAgICBteSAkUHJvamVjdDJSZW1hcmtSZWdFeHAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwJykgOwoKICAgIGZvciBteSAkUHJvamVjdElEIChrZXlzICV7JFByb2plY3REYXRhe1Byb2plY3R9fSkgewogICAgICAgIGlmICgkUHJvamVjdERhdGF7UHJvamVjdH17JFByb2plY3RJRH0gPX4gbXskUHJvamVjdDJSZW1hcmtSZWdFeHB9c214KSB7CiAgICAgICAgICAgIHB1c2ggQFByb2plY3RzMlJlbWFyayAsICRQcm9qZWN0SUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBqb2luICd8JywgQFByb2plY3RzMlJlbWFyazsKfQoxOwo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCx2IDEuMTkgMjAwOS8wMS8yMSAxMDo0MzoxOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBmb3IgKHZhciBDb3VudGVyID0gMTtDb3VudGVyIDwgMTA7IENvdW50ZXIrKykgewogICAgICAgIHZhciBSZW1hcmsgID0gJ1JlbWFya1snICAgICsgQ291bnRlciArICddJzsKICAgICAgICB2YXIgUHJvamVjdCA9ICdQcm9qZWN0SURbJyArIENvdW50ZXIgKyAnXSc7CgogICAgICAgIGlmICggZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tQcm9qZWN0XS52YWx1ZSApIHsKCiAgICAgICAgICAgIHZhciBSZW1hcmtDaGVjayA9IHByb2plY3RfcmVtYXJrX2NoZWNrKFByb2plY3QpOwoKICAgICAgICAgICAgaWYgKCAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUHJvamVjdF0udmFsdWUKICAgICAgICAgICAgICAgICYmIFJlbWFya0NoZWNrCiAgICAgICAgICAgICAgICAmJiAgKCFkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1JlbWFya10udmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tSZW1hcmtdLnZhbHVlLmxlbmd0aCA8IDgKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBhZGQgYSByZW1hcmsgd2l0aCBtb3JlIHRoYW4gOCBjaGFyYWN0ZXJzISJ9Jyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1JlbWFya10uZm9jdXMoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBwcm9qZWN0X3JlbWFya19jaGVjayhQcm9qZWN0KSB7CgogICAgdmFyIHJlZyA9IC9eKCRRRGF0YXsiUmVtYXJrUmVnRXhwIn0pJC87CgogICAgaWYgKCByZWcudGVzdChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1Byb2plY3RdLnZhbHVlKSA9PSBmYWxzZSApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8tLT4KPC9zY3JpcHQ+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCB0aW1lIHJlY29yZCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0iIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7Ik92ZXJ2aWV3In08L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICAgIC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFNldHRpbmciIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJQcm9qZWN0IHNldHRpbmdzIn0KICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UyIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkVkaXQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSBuYXZpZ2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSZEYXk9JExRRGF0YXsiRGF5QmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiT25lIGRheSBiYWNrIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9JkRheT0kTFFEYXRheyJEYXlOZXh0In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9cmlnaHQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiTmV4dCBkYXkifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGF5cyB3aXRob3V0IGVudHJpZXMifToKPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVdvcmtpbmdEYXlzIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSZEYXk9JExRRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkU3RhcnQifQogICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkJvbGRFbmQifQogICAgICAgICAgICAgICAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVdvcmtpbmdEYXlzIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN0YXR1cyIgICAgdmFsdWU9IkFjdGlvbiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJZZWFyIiAgICAgIHZhbHVlPSIkUURhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNb250aCIgICAgIHZhbHVlPSIkUURhdGF7Ik1vbnRoIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRGF5IiAgICAgICB2YWx1ZT0iJFFEYXRheyJEYXkifSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJEYXRlIn06ICRUZXh0eyIkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9In0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVuaXRCbG9jayAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0In0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08c3BhbiBjbGFzcz0iZm9vdG5vdGUiPiRRRGF0YXsiUGVyaW9kTm90ZSJ9PC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlByb2plY3RPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiQWN0aW9uT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJlbWFya1skUURhdGF7IklEIn1dIiAgICB2YWx1ZT0iJFFEYXRheyJSZW1hcmsifSIgICAgc2l6ZT0iMzUiPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXJ0VGltZSJ9IjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkVuZFRpbWUifSI8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN0YXJ0VGltZVskUURhdGF7IklEIn1dIiB2YWx1ZT0iJFFEYXRheyJTdGFydFRpbWUifSIgc2l6ZT0iNyI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJFbmRUaW1lWyRRRGF0YXsiSUQifV0iICAgdmFsdWU9IiRRRGF0YXsiRW5kVGltZSJ9IiAgIHNpemU9IjciPjwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVuaXRJbnB1dFBlcmlvZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUGVyaW9kWyRRRGF0YXsiSUQifV0iICAgIHZhbHVlPSIkUURhdGF7IlBlcmlvZCJ9IiAgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CjwhLS0gZHRsOmJsb2NrOlVuaXRQZXJpb2RXaXRob3V0SW5wdXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+JFFEYXRheyJQZXJpb2QifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVuaXRQZXJpb2RXaXRob3V0SW5wdXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InJlcXVpcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlcXVpcmVkIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InJlYWRvbmx5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlYWRvbmx5IC0tPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTIiIG5hbWU9IkxlYXZlRGF5IiAkRGF0YXsiTGVhdmVEYXkifT4kVGV4dHsiT24gdmFjYXRpb24ifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0xIiBuYW1lPSJTaWNrIiAkRGF0YXsiU2ljayJ9PiRUZXh0eyJPbiBzaWNrIGxlYXZlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMyIgbmFtZT0iT3ZlcnRpbWUiICREYXRheyJPdmVydGltZSJ9PiRUZXh0eyJPbiBvdmVydGltZSBsZWF2ZSJ9CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij4kUURhdGF7IlRvdGFsIn0mbmJzcDs8L3RkPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVxdWlyZWQiPiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOlJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVhZG9ubHkiPiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iID4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9IiBuYW1lPSJEZWxldGUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290bm90ZSI+KiAkVGV4dHsiWW91IGhhdmUgdG8gaW5zZXJ0IGEgc3RhcnQgYW5kIGFuIGVuZCB0aW1lIG9yIGEgcGVyaW9kIn08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rm9vdE5vdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdG5vdGUiPiogJFRleHR7IklmIHlvdSBzZWxlY3QgIk1pc2NlbGxhbmVvdXMgKG1pc2MpIiB0aGUgdGFzaywgcGxlYXNlIGV4cGxhaW4gdGhpcyBpbiB0aGUgcmVtYXJrcyBmaWVsZCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
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==