GeneralCatalog
3.0.3
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.0.3.
Build for OTRS::ITSM 3.0.2.
Build for OTRS::ITSM 3.0.1.
Build for OTRS::ITSM 3.0.0 rc1.
Build for OTRS::ITSM 3.0.0 beta5.
Build for OTRS::ITSM 3.0.0 beta4.
Build for OTRS::ITSM 3.0.0 beta3.
Build for OTRS::ITSM 3.0.0 beta2.
Build for OTRS::ITSM 3.0.0 beta1.
The General Catalog package.
Das General Catalog paket.
El paquete General Catalog.
3.0.x
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# 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."
);
}
}
2011-05-05 08:34:21
opms.otrs.com
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FD58+PBm6QAAAABejflH35em6d2UouyN7DS0f/3rX09VSMPhcD6fV6vVYrH4zmkBAAAAXpf1R3+xWCxms1nWEM3+tFgsHr14Pp8/VQ/VarW3jAkAAADwfra6PxqPx5PJZDqdzufzrDN6ajVWHMelUqn4p2xiUT6ff+fAAAAAAO9vq/ujq6ur29vbBzcWCoXiN1RFAAAAwNba2P5oPp+fnJzM5/P/83/+z1PXVCqVKIoeVEVLpmIDAAAAbKH1648Wi8V8Ps92nJXL5Wq1+uhluVxuPB5HUZQkSS6Xe/SaTqfzhkEBAAAANsKK9kdpmt6VRA/eSJLk7rJ2u72kPzo+Pi6VSk+VRwAAAAA8R+D+KE3T7KSzByXRfD5f8ln5fD6bUlQul5dc1mg0XjsvAAAAwNYJ3B+NRqPPnz8/+qE4jrOSqFAoPHjDiCIAAACAd/O2/dHZ2Vmv1zs6Omo2m48/fKGQz+cfLYkceQYAAACwCp7bHyVJMp/P72ZX372dpunPP/+8/HMXi8VTHyqVSv/85z9fkBcAAADgvWRboNI0febbz/ncl16zCv7THz3VEGVv3J9a/XydTqfT6RQKKzqlGwAAAGCJNE0fnaJz//b7b9+/8anr71/z1P2smkIURZ8+fRqNRt+9NJfLZdvNCn/K3l7yKcVi8dWSAgAAALyvOI5ftCDoORc/dc1LH+s9FaJ7+8ueaoiyN3K5XNCoAAAAAO/t0Vrn/kKh5ywaeuqaB7evbIUUp2k6Ho+zIdahwwAAAACwcla01gIAAABgRfx/Ps/9PsuGE+QAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjggMjAxMS8wMS8yNCAxNjoxNTowOSB1YiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluR2VuZXJhbENhdGFsb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkdlbmVyYWwgQ2F0YWxvZzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkdlbmVyYWwgQ2F0YWxvZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPlRpY2tldDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbW1lbnQyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlBhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBnZW5lcmFsIGNhdGFsb2cgY29tbWVudCAyLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPlRleHRBcmVhPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb2xzIj41MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUm93cyI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+Q29tbWVudDI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjUGVybWlzc2lvbnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiPkRlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlBlcm1pc3Npb25zPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xNSAyMDExLzAzLzAzIDE4OjM5OjQ2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICfU8+3q9uju7eDr7e7x8ic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIO7x7e7i7ej/IOrg8uDr7uMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ8Tu4eDi6CDl6+Xs5e3yIOr67CDq4PLg6+7j4Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ8Tu4eDi6CDq6+DxIOIg6uDy4Ovu4+AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ8rr4PHu4uUg4iDq4PLg6+7j4Cc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ87x7e7i5e0g6uDy4Ovu4yc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGNzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3NfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnU3By4XZhIEhsYXZu7WhvIEthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdQ+GlkYXQgUG9sb75rdSBLYXRhbG9ndSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ1D4aWRhdCBU+O1kdSBLYXRhbG9ndSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnVPjtZHkgS2F0YWxvZ3UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdIbGF2bu0gS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGN0X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS43IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3RfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnzIGRlbCBjYXTgbGVnIGdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0FmZWdpciBhcnRpY2xlIGRlIGNhdOBsZWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZmVnaXIgY2xhc3NlIGRlIGNhdOBsZWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0NsYXNzZSBkZSBjYXThbGVnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F04GxlZyBnZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRhX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdUaWxm+Goga2F0YWxvZyBwb3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnVGlsZvhqIEthdGFsb2cga2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nIEtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyYWwgS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xOCAyMDExLzAzLzAzIDE4OjM5OjQ2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rdGlvbmFsaXTkdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsLUthdGFsb2ctVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnS2F0YWxvZy1FaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nLUtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nLUtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnR2VuZXJhbC1LYXRhbG9nIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlciBBZG1pbkdlbmVyYWxDYXRhbG9nIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnR2VuZXJhbC1LYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnUGFyYW1ldGVyIGb8ciBkZW4gQmVpc3BpZWwtS29tbWVudGFyIDIgZGVyIEdlbmVyYWwtS2F0YWxvZy1BdHRyaWJ1dGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICdQYXJhbWV0ZXIgZvxyIGRpZSB6dWdyaWZmc2JlcmVjaHRpZ3RlIEdydXBwZSBkZXIgR2VuZXJhbC1LYXRhbG9nLUF0dHJpYnV0ZS4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdFaW5lIEthdGFsb2ctS2xhc3NlIGJlbvZ0aWd0IGVpbmVuIE5hbWVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdFaW5lIEdlbmVyYWwtS2F0YWxvZy1LbGFzc2UgYmVu9nRpZ3QgZWluZSBCZXNjaGVyZWlidW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2ctS2xhc3NlIGlzdCBlcmZvcmRlcmxpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnRGVyIE5hbWUgaXN0IGVyZm9yZGVybGljaC4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGZhX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTEvMDQvMjAgMTA6MzA6MTAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZmFfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9qp2KfYsdqp2LHYr9uMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg24zaqSDZgtmE2YUg2YHZh9ix2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg2qnZhNin2LMg2YHZh9ix2LPYqtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICfZgdmH2LHYs9iqINqp2YTYp9iz24wnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ9iz2KfYrtiqINmIINmF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICfYq9io2Kog2YXYp9qY2YjZhCDYqNix2KfbjCDZvtuM2qnYsdio2YbYr9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCDYr9ixINio2K7YtCDZhdiv24zYsduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAn2b7Yp9ix2KfZhdiq2LHZh9in24zbjCDYqNix2KfbjCDYqtmI2LbbjNitINmG2YXZiNmG2Ycg27Ig2YXYsdio2YjYtyDYqNmHINmI24zamNqv24zigIzZh9in24wg2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICfZvtin2LHYp9mF2KrYsdmH2KfbjNuMINio2LHYp9uMINqv2LHZiNmH4oCM2YfYp9uMINiv2LPYqtix2LPbjCDZhtmF2YjZhtmHINmF2LHYqNmI2Lcg2KjZhyDZiNuM2pjar9uM4oCM2YfYp9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGZyX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZnJfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0ZvbmN0aW9ubmFsaXTpJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb24gZHUgQ2F0YWxvZ3VlIEfpbulyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0Fqb3V0ZXIgdW4gRWxlbWVudCBhdSBDYXRhbG9ndWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBam91dGVyIHVuZSBDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0YWxvZ3VlIEfpbulyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGVzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMCAyMDExLzAzLzAzIDE4OjM5OjQ2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rp824gZGVsIENhdOFsb2dvIEdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0HxYWRpciBFbGVtZW50byBhbCBDYXThbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0HxYWRpciBDbGFzZSBhbCBDYXThbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc2UgZGUgQ2F04WxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXThbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnUGFy4W1ldHJvcyBwYXJhIGVsIGVqZW1wbG8gY29tZW50YXJpbyAyIGRlIGxvcyBhdHJpYnV0b3MgZGVsIGNhdOFsb2dvIGdlbmVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICdQYXLhbWV0cm9zIHBhcmEgbG9zIHBlcm1pc29zIGRlIGVqZW1wbG8gZGUgbG9zIGF0cmlidXRvcyBkZWwgY2F04WxvZ28gZ2VuZXJhbC4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGl0X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aXRfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bnppb25hbGl04Cc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uZSBkZWwgQ2F0YWxvZ28gR2VuZXJhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0FnZ2l1bmdpIEVsZW1lbnRvIGFsIENhdGFsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWdnaXVuZ2kgQ2xhc3NlIGFsIENhdGFsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGkgQ2F0YWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9nbyBHZW5lcmFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDExIEVpcmlrIFd1bGZmIDxlaXJpayBhdCBlcGxlZG9rdG9yLm5vPgojIC0tCiMgJElkOiBuYl9OT19HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDExLzA0LzIwIDEwOjQ3OjQxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICdGdW5rc2pvbmFsaXRldCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJhc2pvbiBhdiBHZW5lcmVsbCBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdMZWdnIHRpbCBrYXRhbG9nb2JqZWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnTGVnZyB0aWwga2F0YWxvZy1rbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2cta2xhc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ0VuIGthdGFsb2cta2xhc3NlIG3lIGhhIGVuIGJlc2tyaXZlbHNlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2drbGFzc2UgZXIgcOVrcmV2ZC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdFbiBrYXRhbG9na2xhc3NlIG3lIGhhIGV0IG5hdm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdOYXZuIGVyIHDla3JldmQuJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdPcHByZXR0IG9nIGFkbWluaXN0culyIGRlbiBnZW5lcmVsbGUga2F0YWxvZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnRm9yc2lkZW1vZHVsLXJlZ2lzdHJlcmluZyBmb3IgQWRtaW5HZW5lcmFsQ2F0YWxvZy1vcHBzZXR0IGkgYWRtaW4tZGVsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICdQYXJhbWV0cmUgZm9yIGVrc2VtcGVsa29tbWVudGFyIDIgaSBhdHRyaWJ1dHRlbmUgZm9yIGdlbmVyZWxsIGthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJ1BhcmFtZXRlcmUgZm9yIHRpbGdhbmdzZ3J1cHBlLWVrc2VtcGVsIGkgYXR0cmlidXR0ZW5lIGZvciBnZW5lcmVsbCBrYXRhbG9nLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG5sX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmN0aW9uYWxpdGVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgQmVoZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdDYXRhbG9nIEl0ZW0gdG9ldm9lZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQ2F0YWxvZyBLbGFzc2UgdG9ldm9lZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDYXRhbG9nIEtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyYWwgQ2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHBsX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS44IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjam9uYWxub7bmJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ1phcnqxZHphbmllIGthdGFsb2dpZW0gZ7Pzd255bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnRG9kYWogZWxlbWVudCBrYXRhbG9ndSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnS2F0YWxvZyBns/N3bnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHB0X0JSX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F04WxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0FkaWNpb25hciBJdGVtIGFvIENhdOFsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnQWRpY2lvbmFyIENsYXNzZSBhbyBDYXThbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdOFsb2dvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F04WxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0gJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHJ1X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Tz7er26O7t4Ov87e7x8vwnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDu4fno7CDq4PLg6+7j7uwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ8Tu4eDi6+Xt6OUg/evl7OXt8uAg6uDy4Ovu4+AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfE7uHg4uvl7ejlIOrr4PHx4CDq4PLg6+7j4Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnyuvg8fEg6uDy4Ovu4+AnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICfO4fno6SDq4PLg6+7jJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHpoX0NOX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS42IDIwMTEvMDMvMDMgMTg6Mzk6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ7mmxNzTw82+JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9fcxL/CvLncwO0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ9T2vNPEv8K8z+7Evyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ9T2vNPQwsS/wry31ry2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICfEv8K8t9a8tic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjYgMjAxMC8xMC8xOSAxNDo1ODowMiBjZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgUGFyYW1PYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gbGlzdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1MaXN0JyApIHsKICAgICAgICBteSAkQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgY2xhc3MKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzczsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCAgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1cxMDBwYycsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdmFpbGFiaWxpdHkgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgaXRlbSBsaXN0CiAgICAgICAgbXkgJEl0ZW1JRExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkKICAgICAgICAgICAgaWYgISRJdGVtSURMaXN0IHx8ICEleyRJdGVtSURMaXN0fTsKCiAgICAgICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IHsgJEl0ZW1JRExpc3QtPnskYX0gY21wICRJdGVtSURMaXN0LT57JGJ9IH0ga2V5cyAleyRJdGVtSURMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGl0ZW0gZGF0YQogICAgICAgICAgICBteSAkSXRlbURhdGEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgaXRlbSBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW1MaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEl0ZW1EYXRhfSwKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAkVmFsaWRMaXN0eyAkSXRlbURhdGEtPntWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25BZGRJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFjdGlvbkFkZENsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkQ2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSUQiICk7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhe0NsYXNzfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhUmVmOwoKICAgICAgICAgICAgJUl0ZW1EYXRhID0gJXskSXRlbURhdGFSZWZ9OwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1cxMDBwYycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEl0ZW1EYXRhe1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBJdGVtRWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZWFjaCBwcmVmZXJlbmNlcyBzZXR0aW5nCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgICAgICAlUHJlZmVyZW5jZXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpIH07CiAgICAgICAgfQoKICAgICAgICBJVEVNOgogICAgICAgIGZvciBteSAkSXRlbSAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CgogICAgICAgICAgICAjIHNraXAgaXRlbXMgdGhhdCBkb24ndCBiZWxvbmcgdG8gdGhlIGNsYXNzCiAgICAgICAgICAgIG5leHQgaWYgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0NsYXNzfQogICAgICAgICAgICAgICAgICAgICYmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30gbmUgJEl0ZW1EYXRhe0NsYXNzfTsKCiAgICAgICAgICAgICMgZmluZCBvdXRwdXQgbW9kdWxlCiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEl0ZW19LT57TW9kdWxlfQogICAgICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdCBmb3IgdGhpcyBwcmVmZXJlbmNlcyBpdGVtCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRJdGVtfSwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgYWxsIHBhcmFtZXRlcnMKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBHZW5lcmFsQ2F0YWxvZ0RhdGEgPT4geyAlSXRlbURhdGEsICVQYXJhbSB9ICk7CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIHJlZiggJFBhcmFtSXRlbS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgfHwgcmVmKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+eydPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skSXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW1JdGVtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW1JdGVtLT57QmxvY2t9IHx8ICRQcmVmZXJlbmNlc3skSXRlbX0tPntCbG9ja30gfHwgJ09wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skSXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW1JdGVtfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkSXRlbURhdGF7Q2xhc3N9IGVxICdORVcnICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXRDbGFzc0FkZAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXRDbGFzc0FkZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZEl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dHB1dCBJdGVtRWRpdENsYXNzRXhpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NFeGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQWN0aW9uQWRkQ2xhc3MKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZENsYXNzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1TYXZlJyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KENsYXNzIEl0ZW1JRCBOYW1lIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjbGFzcwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKQogICAgICAgICAgICBpZiAkSXRlbURhdGF7Q2xhc3N9IGVxICdORVcnOwoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBteSAkU3VjY2VzczsKICAgICAgICBteSAkSXRlbUlEID0gJEl0ZW1EYXRhe0l0ZW1JRH07CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJdGVtSUQgPSAkU3VjY2VzczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAkR0NEYXRhICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCggSXRlbUlEID0+ICRJdGVtSUQgKTsKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBteSAkTm90ZSAgICAgICAgPSAnJzsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgICAgICAlUHJlZmVyZW5jZXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpIH07CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBHZW5lcmFsQ2F0YWxvZ0RhdGEgPT4gJEdDRGF0YSApOwogICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgPT4gJEdDRGF0YS0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISRTdWNjZXNzOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUl0ZW1MaXN0JkNsYXNzPSRJdGVtRGF0YXtDbGFzc30iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCAgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1cxMDBwYycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDbGFzcyAoIEB7JENsYXNzTGlzdH0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZEl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgQWN0aW9uQWRkQ2xhc3MKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25BZGRDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklECiAgICAgICAgUGFyYW1PYmplY3QgQ29uZmlnSXRlbSBHZW5lcmFsQ2F0YWxvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgZGllICJHb3Qgbm8gJE9iamVjdCEiIGlmICggISRTZWxmLT57JE9iamVjdH0gKTsKICAgIH0KCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gKTsKCiAgICBpZiAoICFkZWZpbmVkKCRHZXRQYXJhbSkgKSB7CiAgICAgICAgJEdldFBhcmFtCiAgICAgICAgICAgID0gZGVmaW5lZCggJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0gKQogICAgICAgICAgICA/ICRQYXJhbXtHZW5lcmFsQ2F0YWxvZ0RhdGF9LT57ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSB9CiAgICAgICAgICAgIDogJFNlbGYtPntDb25maWdJdGVtfS0+e0RhdGFTZWxlY3RlZH07CiAgICB9CgogICAgaWYgKCAhKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gJiYgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSApICkgewogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gPSAnVGV4dCc7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9IGVxICdQZXJtaXNzaW9uJyApIHsKICAgICAgICAkUGFyYW17RGF0YX0gICAgICAgICA9IHsgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApIH07CiAgICAgICAgJFBhcmFte1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgICAgICRQYXJhbXtCbG9ja30gICAgICAgID0gJ09wdGlvbic7CiAgICB9CgogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0dldFBhcmFtfSB9ICkgewogICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXtHZXRQYXJhbX0tPnskS2V5fSB9OwogICAgICAgIGZvciBteSAkVmFsdWUgKEBBcnJheSkgewoKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9ICdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuMTIgMjAxMS8wMi8yOCAxMTozMTowNyBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZEl0ZW0tLT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iTkVXIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4kRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kVGV4dHsiQWRkIENhdGFsb2cgSXRlbSJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZEl0ZW0tLT4KPCEtLWR0bDpibG9jazpBY3Rpb25BZGRDbGFzcy0tPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1FZGl0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JFRleHR7IkFkZCBDYXRhbG9nIENsYXNzIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uQWRkQ2xhc3MtLT4KPCEtLWR0bDpibG9jazpBY3Rpb25PdmVydmlldy0tPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3LS0+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7Ikxpc3QifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQXNCbG9jayIgIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUl0ZW1MaXN0JkNsYXNzPSRMUURhdGF7IkNsYXNzIn0iPiRRRGF0YXsiQ2xhc3MifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3NMaXN0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTGlzdCJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzYwcGMiPiRRRGF0YXsiQ2xhc3MifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciI+JFRleHR7IlZhbGlkIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW1MaXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249SXRlbUVkaXQmSXRlbUlEPSRRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiTmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiJERhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW0gLS0+Cgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiSXRlbSJ9ICRUZXh0eyJFZGl0In06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBjbGFzcz0iVmFsaWRhdGUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkUURhdGF7Ikl0ZW1JRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDbGFzc0RzYyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDbGFzcyIgaWQ9IkNsYXNzRHNjIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgbWF4bGVuZ3RoPSIxMDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDbGFzc0RzY0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NEc2NTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJOYW1lIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQiIG1heGxlbmd0aD0iMTAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBjbGFzcz0iVzUwcGMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgcm93cz0iJFFEYXRheyJSb3dzIn0iIGNvbHM9IiRRRGF0YXsiQ29scyJ9Ij4kUURhdGF7IlNlbGVjdGVkSUQifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiT3B0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIi8+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiREYXRheyJLZXkifSJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiBpZD0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIiIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpQYXNzd29yZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+JFRleHR7IlZhbGlkIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJWYWxpZE9wdGlvblN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+JFRleHR7IkNvbW1lbnQifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBpZD0iU3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4kVGV4dHsiU3VibWl0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJvciJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Ij4kVGV4dHsiQ2FuY2VsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjUzIDIwMTEvMDQvMDcgMTY6NDc6NTAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNTMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZyAtIGdlbmVyYWwgY2F0YWxvZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGdlbmVyYWwgY2F0YWxvZyBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREInOwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCVQYXJhbSk7CiAgICB9CgogICAgIyBjcmVhdGUgQ2FjaGVJbnRlcm5hbCBvYmplY3QKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbC0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICBUVEwgID0+IDYwICogNjAgKiAzLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENsYXNzTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBnZW5lcmFsIGNhdGFsb2cgY2xhc3NlcwoKICAgIG15ICRBcnJheVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NMaXN0KCk7Cgo9Y3V0CgpzdWIgQ2xhc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUKGdlbmVyYWxfY2F0YWxvZ19jbGFzcykgJwogICAgICAgICAgICAuICdGUk9NIGdlbmVyYWxfY2F0YWxvZyBPUkRFUiBCWSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDbGFzc0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENsYXNzTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgIG15ICRDYWNoZUtleSA9ICdDbGFzc0xpc3QnOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQENsYXNzTGlzdCwKICAgICk7CgogICAgcmV0dXJuIFxAQ2xhc3NMaXN0Owp9Cgo9aXRlbSBDbGFzc1JlbmFtZSgpCgpyZW5hbWUgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OlN0YXRlJywKICAgICAgICBDbGFzc05ldyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgQ2xhc3NSZW5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtDbGFzc05ld30gZXEgJFBhcmFte0NsYXNzT2xkfTsKCiAgICAjIGNoZWNrIGlmIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc05ld30gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRBbHJlYWR5RXhpc3RzID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFscmVhZHlFeGlzdHMgPSAxOwogICAgfQoKICAgIGlmICgkQWxyZWFkeUV4aXN0cykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVuYW1lIGNsYXNzICRQYXJhbXtDbGFzc09sZH0hIE5ldyBjbGFzc25hbWUgYWxyZWFkeSBleGlzdHMuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICAjIHJlbmFtZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9LCBcJFBhcmFte0NsYXNzT2xkfSBdLAogICAgKTsKfQoKPWl0ZW0gSXRlbUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBhcyBoYXNoIHJlZmVyZW5jZSBvZiBvbmUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJEhhc2hSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIFZhbGlkICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIFByZWZlcmVuY2VzICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQge30KICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAyLCAgICAgICAgICAgICAgICAgICAgICMgb3Igd2hhdGV2ZXIgcHJlZmVyZW5jZXMgY2FuIGJlIHVzZWQKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBJdGVtTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgIG15ICRQcmVmZXJlbmNlc0NhY2hlS2V5ID0gJyc7CiAgICBteSAkUHJlZmVyZW5jZXNUYWJsZSAgICA9ICcnOwogICAgbXkgJFByZWZlcmVuY2VzV2hlcmUgICAgPSAnJzsKICAgIG15IEBQcmVmZXJlbmNlc0JpbmQ7CgogICAgIyBoYW5kbGUgZ2l2ZW4gcHJlZmVyZW5jZXMKICAgIGlmICggZXhpc3RzICRQYXJhbXtQcmVmZXJlbmNlc30gJiYgcmVmICRQYXJhbXtQcmVmZXJlbmNlc30gZXEgJ0hBU0gnICkgewoKICAgICAgICAkUHJlZmVyZW5jZXNUYWJsZSA9ICcsIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAgICAgbXkgQFdoZXJlczsKCiAgICAgICAgIyBhZGQgYWxsIHByZWZlcmVuY2VzIGdpdmVuIHRvIHdoZXJlLWNsYXVzZQogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiggJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ICkgbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSA9IFsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFdoZXJlcywgJyhwcmVmX2tleSA9ID8gQU5EIHByZWZfdmFsdWUgSU4gKCcKICAgICAgICAgICAgICAgIC4gam9pbiggJywgJywgbWFwIHsnPyd9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9ICkKICAgICAgICAgICAgICAgIC4gJykpJzsKCiAgICAgICAgICAgIHB1c2ggQFByZWZlcmVuY2VzQmluZCwgXCRLZXksIG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwoKICAgICAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBsaXN0IHRvIGNhY2hlIGtleQogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSAnIyMjIycgaWYgJFByZWZlcmVuY2VzQ2FjaGVLZXk7CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49IGpvaW4gcXsjIyMjfSwgJEtleSwgbWFwIHskX30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXNXaGVyZSA9ICcgQU5EICcgLiBqb2luICcgQU5EICcsIEBXaGVyZXM7CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJFByZWZlcmVuY2VzVGFibGUgIgogICAgICAgIC4gIldIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJFByZWZlcmVuY2VzV2hlcmUgIjsKICAgIG15IEBCSU5EID0gKCBcJFBhcmFte0NsYXNzfSwgQFByZWZlcmVuY2VzQmluZCApOwoKICAgICMgYWRkIHZhbGlkIHN0cmluZyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIHZhbGlkX2lkID0gMSAnOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5CiAgICAgICAgPSAnSXRlbUxpc3Q6OicgLiAkUGFyYW17Q2xhc3N9IC4gJyMjIyMnIC4gJFBhcmFte1ZhbGlkfSAuICcjIyMjJyAuICRQcmVmZXJlbmNlc0NhY2hlS2V5OwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDbGFzcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVEYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBJdGVtR2V0KCkKCmdldCBhIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgpSZXR1cm4KICAgICRJdGVtRGF0YXtJdGVtSUR9CiAgICAkSXRlbURhdGF7Q2xhc3N9CiAgICAkSXRlbURhdGF7TmFtZX0KICAgICRJdGVtRGF0YXtWYWxpZElEfQogICAgJEl0ZW1EYXRhe0NvbW1lbnR9CiAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0KICAgICRJdGVtRGF0YXtDcmVhdGVCeX0KICAgICRJdGVtRGF0YXtDaGFuZ2VUaW1lfQogICAgJEl0ZW1EYXRhe0NoYW5nZUJ5fQoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gMywKICAgICk7CgogICAgb3IKCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgID0+ICdJdGVtIE5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtSUR9ICYmICggISRQYXJhbXtDbGFzc30gfHwgISRQYXJhbXtOYW1lfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtSUQgT1IgQ2xhc3MgYW5kIE5hbWUhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgJzsKICAgIG15IEBCSU5EOwoKICAgICMgYWRkIG9wdGlvbnMgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17Q2xhc3N9ICYmICRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6Q2xhc3M6OicgLiAkUGFyYW17Q2xhc3N9IC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhZGQgY2xhc3MgYW5kIG5hbWUgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2dlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCAoIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9ICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2lkID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtJdGVtSUR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQklORCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVJdGVtRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRJdGVtRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1szXTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s2XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOF07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCggSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9ICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJUl0ZW1EYXRhID0gKCAlSXRlbURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpDbGFzczo6JyAuICRJdGVtRGF0YXtDbGFzc30gLiAnOjonIC4gJEl0ZW1EYXRhe05hbWV9LAogICAgICAgIFZhbHVlID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSAnJzsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyBpdGVtLCBpZiBpdGVtIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICAjIGluc2VydCBuZXcgaXRlbQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICcoZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkSXRlbUlEOwp9Cgo9aXRlbSBJdGVtVXBkYXRlKCkKCnVwZGF0ZSBhIGV4aXN0aW5nIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnSXRlbSBOYW1lJywKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9ICcnOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzKSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIG9mIGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDbGFzczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gbm90IGZvdW5kIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQ2xhc3MsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtJdGVtSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKc2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoQF8pOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCkKCmdldCBHZW5lcmFsQ2F0YWxvZyBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRRdWV1ZU9iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KEBfKTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41MyAkICREYXRlOiAyMDExLzA0LzA3IDE2OjQ3OjUwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFByZWZlcmVuY2VzREIucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODowNSByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQiAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBTWU5PUFNJUwoKc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgID0gJ2dlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgPSAncHJlZl9rZXknOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ID0gJ3ByZWZfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gID0gJ2dlbmVyYWxfY2F0YWxvZ19pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKClNldCBwcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzNCwKICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgIFZhbHVlICA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQgS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAiCiAgICAgICAgICAgIC4gIiRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gKCRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWx1ZX0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKR2V0IGFsbCBQcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBxdWV1ZSBwcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTg6MDUgJAoKPWN1dAo=
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjIyIDIwMTAvMDUvMzEgMTU6Mzc6NTggY3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnR2VuZXJhbENhdGFsb2cnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1HZW5lcmFsQ2F0YWxvZy0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIGNsYXNzZXMKbXkgQENsYXNzUmFuZDsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICBwdXNoIEBDbGFzc1JhbmQsIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCm15ICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmc7CmlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmcKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJyktPntQZXJtaXNzaW9uc307Cn0KCiMgZW5hYmxlIGdlbmVyYWwgY2F0YWxvZyBwZXJtaXNzaW9uIHByZWZlcmVuY2VzIHNldHRpbmcgd2l0aCBhIGR1bW15IHRydWUgdmFsdWUKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI1Blcm1pc3Npb25zJywKICAgIFZhbHVlID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAnVGVzdEl0ZW0yJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0zJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnVGVzdEl0ZW01VVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICIgXHQgXG4gXHIgVW5pdCBUZXN0IDo6IFRlc3QgQ2xhc3MgXHQgXG4gXHIgIiAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0nLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgVGVzdCBJdGVtIFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdCBJdGVtIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc8KpJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDPkiDPoSBUZXN0IEl0ZW0gxqkgz54gJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgz6Ag0K8gVGVzdCBDb21tZW50INGsINGgICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8+SIM+hIFRlc3QgSXRlbSDGqSDPnicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfPoCDQryBUZXN0IENvbW1lbnQg0awg0aAnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3QgSXRlbSDGqSDJpCBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFRlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoYSBzZWNvbmQgaXRlbSB3aXRoIEZ1bmN0aW9uYWxpdHkgJ3Rlc3QxJykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNldCBmdW5jdGlvbmFsaXR5IHRvICcnKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTZVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3NbdGVzdF0lKlxcJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3NbdGVzdF0lKlxcJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbVByZWZlcmVuY2VzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgICAgICBQcmVmZXJlbmNlc0dldCA9PiB7CiAgICAgICAgICAgIFRlc3QgID0+ICdoZWxsbyB3b3JsZCcsCiAgICAgICAgICAgIEdyb3VwID0+IDMzLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIFRlc3QgPT4gJ2hlbGxvJywKICAgICAgICAgICAgU2l6ZSA9PiAzOCwKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIC0gSXRlbUtleTogJEl0ZW1JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEl0ZW1JRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3QgaXRlbSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZEl0ZW1JRCA9ICRJdGVtSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGl0ZW0gY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBJdGVtSWQgYW5kIFVzZXJJRAogICAgICAgIG15ICRJdGVtR2V0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBJdGVtSUQgYW5kIFVzZXJJRCAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtIHVzaW5nIENsYXNzIGFuZCBOYW1lCiAgICAgICAgbXkgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9LAogICAgICAgICAgICBOYW1lICA9PiAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBDbGFzcyBhbmQgTmFtZSAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgaXRlbSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRMYXN0QWRkZWRJdGVtSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGl0ZW0KICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGl0ZW0gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkgLSBJdGVtS2V5OiAkTGFzdEFkZGVkSXRlbUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRJdGVtR2V0MiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQyLT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9ICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fS0+eyRLZXl9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNTZXQoKSAtICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHByZWZlcmVuY2VzCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9ICkgewogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fS0+eyRLZXl9IGVxICRQcmVmZXJlbmNlc3skS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyBmb3IgbGF0ZXIgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIGFycmF5cwpteSAlRXhpc3RpbmdDbGFzc2VzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICBuZXh0IElURU0gaWYgISRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfTsKICAgICRFeGlzdGluZ0NsYXNzZXNUbXB7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9ID0gMTsKfQpteSBARXhpc3RpbmdDbGFzc2VzID0gc29ydCBrZXlzICVFeGlzdGluZ0NsYXNzZXNUbXA7CgpteSAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IHx8PSAnJzsKICAgICRFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcHsgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzID0gc29ydCBrZXlzICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKCm15IEBOb25FeGlzdGluZ0NsYXNzZXMgPSAoICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMScsICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMicgKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc0xpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDbGFzc0xpc3QxID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgIGlmICggJENsYXNzTGlzdDEgJiYgcmVmICRDbGFzc0xpc3QxIGVxICdBUlJBWScgKSB7CiAgICAgICAgJENsYXNzQ291bnQgPSBncmVwIHsgJF8gZXEgJENsYXNzIH0gQHskQ2xhc3NMaXN0MX07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRDbGFzc0NvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NMaXN0KCkgLSAkQ2xhc3MgbGlzdGVkIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBOb25FeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkSXRlbUxpc3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBub3QgZXhpc3RzIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnskQ2xhc3N9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBQcmVmZXJlbmNlcyB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgPT4gJENsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgIEtleSAgICA9PiAnVW5pdFRlc3RQcmVmJywKICAgICAgICBWYWx1ZSAgPT4gJzEnLAogICAgKTsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgVW5pdFRlc3RQcmVmID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRJdGVtTGlzdC0+eyRJdGVtSUR9LAogICAgICAgICdJdGVtIFByZWZlcmVuY2VzJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gQ2xhc3MgJENsYXNzIFByZWZlcmVuY2VzIG1hdGNoIiwKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMicsCiAgICApOwoKICAgICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbm90IG1hdGNoIGFmdGVyIFByZWZlcmVuY2VzU2V0IENoYW5nZSIKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgo9cG9kCgpteSAlRnVuY3Rpb25hbGl0eUxpc3QxOwptYXAgeyAkRnVuY3Rpb25hbGl0eUxpc3QxeyRffSA9IDEgfSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXM7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEZ1bmN0aW9uYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKPWN1dAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIENsYXNzTmV3ID0+ICcgJyAuICRDbGFzcyAuICJSRSBOQSBNRSAyIFxuIFxyIFx0ICIsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbnVwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnLAopOwoKMTsK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMTEvMDQvMDcgMTg6MjU6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCkdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKICAgIHVzZSB2YXI6OnBhY2thZ2VzZXR1cDo6R2VuZXJhbENhdGFsb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgRW5jb2RlT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSAnZnVuY3Rpb25hbGl0eScgdG8gZXh0ZXJuYWwgdGFibGUKICAgICMgdGhpcyBpcyBvbmx5IG5lY2Nlc2FyeSBpbiBDb2RlVXBncmFkZSwgZm9yIG5ldyBpbnN0YWxsYXRpb25zIHRoaXMgaXMgZG9uZQogICAgIyBpbiB0aGUgcGFja2FnZSBJVFNNQ29yZSBkdXJpbmcgQ29kZUluc3RhbGwKICAgICRTZWxmLT5fTWlncmF0ZUZ1bmN0aW9uYWxpdHkoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9NaWdyYXRlRnVuY3Rpb25hbGl0eSgpCgo9Y3V0CgpzdWIgX01pZ3JhdGVGdW5jdGlvbmFsaXR5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBTRUxFQ1QgYWxsIGZ1bmN0aW9uYWxpdHkgdmFsdWVzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgZnVuY3Rpb25hbGl0eSBGUk9NIGdlbmVyYWxfY2F0YWxvZycsCiAgICApOwoKICAgIG15IEBMaXN0OwogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IFJPVyBpZiAhJFJvd1sxXTsKCiAgICAgICAgcHVzaCBATGlzdCwgXEBSb3c7CiAgICB9CgogICAgIyBzYXZlIGVudHJpZXMgaW4gbmV3IHRhYmxlCiAgICBmb3IgbXkgJEVudHJ5IChATGlzdCkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnSU5TRVJUIElOVE8gZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzKCBnZW5lcmFsX2NhdGFsb2dfaWQsIHByZWZfa2V5LCBwcmVmX3ZhbHVlICknCiAgICAgICAgICAgICAgICAuICcgVkFMVUVTKCA/LCBcJ0Z1bmN0aW9uYWxpdHlcJywgPyApJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkRW50cnktPlswXSwgXCRFbnRyeS0+WzFdIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRyb3AgY29sdW1uIGluCiAgICBteSAoJERyb3ApID0gJFNlbGYtPntEQk9iamVjdH0tPlNRTFByb2Nlc3NvcigKICAgICAgICBEYXRhYmFzZSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZ2VuZXJhbF9jYXRhbG9nJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnQ29sdW1uRHJvcCcsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdmdW5jdGlvbmFsaXR5JywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVBbHRlcicsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdFbmQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICApOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJERyb3AsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMS8wNC8wNyAxODoyNTo0NiAkCgo9Y3V0Cg==